จะส่งคำสั่งเมื่อเปิดเซสชัน tmux ภายในเซสชัน tmux อื่นได้อย่างไร


139

สถานการณ์ทั่วไปอาจเป็น:

$ tmux
  [0] $ ssh example.com
      $ tmux attach
        [0] $ 

ฉันเปิดเซสชัน tmux จากนั้น ssh ในเซิร์ฟเวอร์และแนบกับเซสชัน tmux ที่มีอยู่ ณ จุดนี้ฉันมีหนึ่งเซสชัน tmux ภายในอีกรายการหนึ่ง ฉันจะส่งคำสั่งไปยังเซสชัน tmux ภายในได้อย่างไร

หมายเหตุ: ทั้งสองเซสชัน tmux มีการผูกคีย์เหมือนกัน


4
ไม่ใช่คำถามเกี่ยวกับการเขียนโปรแกรม โปรดลองsuperuser.com โชคดี.
กระสุน

1
ฉันยินดีที่จะขอให้ย้ายคำถามอย่างไรก็ตามสำหรับบริบทฉันใช้ vim ภายใน tmux เพื่อโค้ดและแน่นอนว่ามักจะต้อง ssh ในเซิร์ฟเวอร์อื่นซึ่งเป็นจุดที่เกิดปัญหานี้
Kris

คำตอบ:


210

send-prefixคำสั่งที่สามารถใช้ในการส่งคำนำหน้าการกดแป้นพิมพ์ (กระบวนการทำงานในของคุณ) บานหน้าต่างที่ใช้งานอยู่ โดยค่าเริ่มต้นคำนำหน้าคือCbและCbถูกผูกไว้กับsend-prefix(ดังนั้นการกดปุ่มสองครั้งจะส่งCbเดียวไปยังบานหน้าต่างที่ใช้งานอยู่) นี่เป็นเพียงสิ่งที่เราต้องการเพื่อเข้าถึงการเชื่อมโยงของอินสแตนซ์tmuxภายใน

Cbแรกถูกจับโดยอินสแตนซ์tmux "ภายนอก" เป็นคีย์นำหน้า อันที่สองถูกจับโดยอินสแตนซ์tmux "ภายนอก" และทริกเกอร์การรวมCb ( send-prefix) สิ่งนี้จะส่งCbไปยังบานหน้าต่างที่ใช้งานอยู่ของอินสแตนซ์ภายนอก กระบวนการที่ทำงานในบานหน้าต่างนี้คือ (ในที่สุดผ่านอินสแตนซ์ssh ) อินสแตนซ์tmux “ inner” มันจับCbเป็นคีย์นำหน้า ตอนนี้การกดแป้นพิมพ์ครั้งต่อไปของคุณจะถูกส่งผ่านอินสแตนซ์tmuxด้านนอกและถูกจับโดยอินสแตนซ์ด้านในเพื่อเรียกการเชื่อมต่อ

ที่จะเรียกผูกพัน ( new-window) ในอินสแตนซ์ระดับที่สองของtmuxคุณจะต้องพิมพ์Cb Cb ค สำหรับกรณีที่เป็นระดับที่สามของtmuxคุณจะพิมพ์Cb Cb Cb Cb

เป็นสองเท่าสำหรับแต่ละระดับนี้อาจจะน่ารำคาญถ้าคุณมักจะจัดการกับหลายชั้นของtmux หากคุณสามารถสำรองคีย์อื่น ๆ ไว้ได้คุณสามารถทำการเชื่อมโยงที่ไม่มีคำนำหน้าเพื่อทำให้สิ่งต่างๆ (อาจ) พิมพ์ได้ง่ายขึ้น:

bind-key -n C-\ send-prefix
bind-key -n C-^ send-prefix \; send-prefix

สร้างหน้าต่างใหม่ในtmuxระดับที่สอง: C- \ c
สร้างหน้าต่างใหม่ในtmuxระดับที่สาม: C- ^ c (หรือC- \ C- \ c )


หากคุณมีคำสั่งtmuxจำนวน จำกัดที่คุณต้องการ (อย่างง่ายดาย) ส่งไปยังอินสแตนซ์tmuxระดับล่างคุณอาจใช้send-keysเพื่อสร้างการเชื่อมโยงเฉพาะบางส่วนแทน(อาจเป็นแค่ในอินสแตนซ์tmuxระดับบนสุดของคุณ):

bind-key C-c  send-keys C-b c
bind-key C    send-keys C-b C-b c

สร้างหน้าต่างใหม่ในtmuxระดับที่สอง: Cb Cc
สร้างหน้าต่างใหม่ในtmuxระดับที่สาม: Cb C


นอกจากนี้ผมต้องออกความคิดเห็นของฉันที่มีอยู่last-windowมีผลผูกพันตามที่มันถูกเรียกว่าเมื่อทำเช่นนี้:C-a C-a #bind-key C-a last-windowหมายเหตุคำนำหน้าของฉันคือไม่เริ่มต้นa b
Kris

1
bind-key -n C-\ send-prefixไม่สำเร็จ. tmux ของฉันไม่รู้จัก \. เมื่อฉันใช้จดหมายมันได้ผล
darksky

@Darksky: คุณใช้tmuxรุ่นอะไร? มันใช้ได้สำหรับฉันกับ 1.7, 1.6 และ 1.5 แน่นอนคุณจะต้องเพิ่มระดับการอ้างอิงพิเศษหากคุณทำการผูกจากคำสั่งเชลล์ (เช่นtmux bind-key -n 'C-\' send-prefix); หากคุณประสบปัญหาในการทำให้มันทำงานจาก~/.tmux.conf(หรือ:บรรทัดคำสั่งคำนำหน้า) คุณอาจลองอ้างคำพูดที่คล้ายกัน (เช่นbind-key -n 'C-\' send-prefix)
Chris Johnsen

51

ในการเข้าถึงด้านในให้กดปุ่มควบคุมค้างไว้แล้วกด B สองครั้ง


7

แก้ไข:

ฉันไม่แนะนำให้ใช้C-qเป็น bind-key เนื่องจากเป็นคำสั่ง control-key เริ่มต้นสำหรับ

ยกเลิกการหยุดการทำงานของหน้าจอและปล่อยให้การแสดงผลหน้าจอดำเนินต่อไป

สถานการณ์เกิดขึ้นที่นี่และ @Paschalis ให้วิธีแก้ปัญหา:

หากเกิดโชคร้ายสองครั้ง (เซสชัน tmux ระยะไกลที่มี Cq เป็นคำนำหน้า): พิมพ์Cltr-qจากนั้น:และป้อนใน tmux:send-keys C-q

ด้านล่างนี้คือคำตอบ:


เพื่อให้ง่ายขึ้นให้เพิ่มบรรทัดด้านล่างในไฟล์ ~/.tmux.conf

bind-key -n C-q send-prefix

จากนั้นคุณสามารถโดยตรงใช้C-qเป็นผูกที่สำคัญสำหรับ tmux ระยะไกลของคุณ


ถ้ามีคนเปลี่ยนคีย์ binder เริ่มต้นใน tmux ด้านนอกก็ต้องใช้คีย์ binder เริ่มต้นเดียวกันใน tmux ด้านในเพื่อให้ snippet ด้านบนทำงานได้!
Paschalis

ฉันกำลังแก้ไขคำนำหน้าของ tmux ในเครื่องของฉัน (เป็น Ctrl +] ในกรณีของฉัน) ดังนั้น tmux-es "ภายใน" ทั้งหมดบนเซิร์ฟเวอร์จึงมีการผูกค่าเริ่มต้นสำหรับคำนำหน้า
ดำเนินการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.