ฆ่าเซสชัน tmux และเลือกเซสชัน tmux อื่น


11

ฉันพยายามผูกXให้ทำต่อไปนี้:

  • แจ้งให้ผู้ใช้ทราบว่าเซสชันควรจะถูกฆ่าหรือไม่
  • ถ้าyถูกป้อนให้ฆ่าเซสชัน
  • หลังจากเซสชั่นถูกฆ่าตายเลือกเซสชั่นอื่น (ครั้งสุดท้ายก่อนหน้าหรือเซสชั่นถัดไป)

คำสั่งที่คล้ายกันบางคำที่ไม่ถูกต้อง

  1. ฆ่าเซสชันและปิดเทอร์มินัล:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. แจ้งผู้ใช้ให้รับชื่อเซสชันเพื่อฆ่าและเลือกเซสชันถัดไปหลังจาก kill:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. ฉันไม่พบตัวอย่างคำสั่งที่คล้ายกัน นี่คือวิธีแก้ปัญหาที่ใช้งานไม่ได้:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    

คำตอบ:


12

ฉันคิดว่านี่ใกล้กับสิ่งที่คุณต้องการ:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

วิธีการ # 3 ของคุณอยู่ในแนวที่ถูกต้อง แต่ปัญหาคือconfirm-beforeไม่มีการstatus-leftแทนที่แบบ (เช่น#S) ในสตริงคำสั่ง

ข้อแม้สำหรับการรวมด้านบนคือเนื่องจากทุกอย่างเสร็จสิ้นจากrun-shellคำสั่งจะถูกเรียกใช้นอกบริบทของไคลเอ็นต์หรือเซสชันใด ๆ ใช้งานได้จริงเท่านั้นเนื่องจากไคลเอนต์ "เริ่มต้น" (สำหรับswitch-client) และ "เริ่มต้น" (สำหรับ#S) เป็นเซสชันที่ใช้งานล่าสุด สิ่งนี้จะได้ผลตามที่คุณคาดหวังตราบใดที่คุณมีไคลเอ็นต์ที่ใช้งานอยู่เพียงคนเดียว (เช่นผู้ใช้คนเดียวที่ไม่ได้พิมพ์ไปยังไคลเอนต์tmuxอื่นจนกระทั่งหลังจากที่คำสั่งเชลล์ทำงานเสร็จแล้ว) มันอาจล้มเหลวอย่างมากถ้า (เช่น) คุณเรียกใช้การรวมในไคลเอนต์tmuxแต่ได้รับอินพุตใหม่โดยtmuxไคลเอ็นต์ B ก่อนที่เชลล์เริ่มต้นโดยrun-shellมีโอกาสเรียกใช้คำสั่ง

สภาพการแข่งขันนี้ดูเหมือนจะเป็นแรงจูงใจที่ดีในการให้ข้อมูลลูกค้า / เซสชัน / หน้าต่าง / บานหน้าต่างแก่run-shellคำสั่ง มีรายการสิ่งที่ต้องทำเกี่ยวกับการรับif-shellและrun-shellให้การสนับสนุน (เป็นทางเลือกหรือไม่) status_replace()(เช่นstatus-left- การแทนที่สไตล์) แม้ว่าอาจเป็นทางเลือกที่ดีกว่าformat_expand()ซึ่งเป็นประเภทซุปเปอร์เซ็ตใหม่status_replace(ข้อเสนอ#{client_tty}และอื่น ๆ )


ดูเหมือนว่าจะทำสิ่งที่ฉันกำลังมองหา ฉันลองวิธีที่คล้ายกันหลังจากค้นหาtmux display-message -p "#S"เคล็ดลับในคำตอบอื่น ดูเหมือนว่าการห่อทุกอย่างใน run-shell เป็นกุญแจสำคัญ ขอบคุณ!
แต้ม Hunner

คุณจะทำสิ่งนี้โดยไม่confirm-before? ฉันมีปัญหาในการหลบหนีที่ถูกต้อง
ไมล์

2
@Miles: ลองสิ่งนี้: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellขยาย#Sโดยตรงดังนั้นเราจะได้ละเว้นdisplay-messageและเพิ่มข้อความ)
Chris Johnsen

1

ในกรณีที่มีคนสะดุดคำถามนี้tmux-sessionistจะให้ฟังก์ชั่นนี้พร้อมกับฟังก์ชั่นอื่น ๆ อีกมากมาย


0

มีคำถามอื่นที่ถามคำถามคล้ายกัน แต่แตกต่างกันเล็กน้อย

หากคุณต้องการchoose-sessionพฤติกรรมมาตรฐานที่มีคุณสมบัติเพิ่มเติมที่ฆ่าเซสชันเดิมหากไม่มีไคลเอนต์อื่นติดมาด้วยคำถามนั้นอาจเป็นที่สนใจ


0

การขยายจากคำตอบของChris Johnsen (ในความคิดเห็น) ข้างต้นเกี่ยวกับวิธีการทำโดยไม่ต้องแจ้งให้ทราบหรือconfirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

หากมีเพียง 1 เซสชันที่เหลือ (เซสชันที่คุณอยู่ในขณะนี้) และคุณเรียกใช้คำสั่งคุณจะได้รับข้อความ "ข้อผิดพลาด" และเซสชันจะไม่ถูกฆ่า โดยปกติ (ถ้าคุณเป็นเหมือนฉัน) คุณต้องการให้คำสั่งฆ่าเซสชันแม้ว่าจะไม่มีเซสชันอื่นให้สลับไป ดังนั้นนี่คือสิ่งที่ฉันเกิดขึ้นกับ:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.