การเชื่อมโยงคีย์ tmux กับหลายคำสั่ง


37

ฉันเปิดหน้าต่าง multipane tmux เพื่อตรวจสอบพารามิเตอร์เซิร์ฟเวอร์หลายตัว ด้วย Ctrl-S ฉันสามารถเปิดหน้าต่างใหม่ด้วยคำสั่งมอนิเตอร์อื่น

ตอนนี้ผมต้องการที่จะผูก Ctrl-Q เพื่อเปิดอีกmultipaneหน้าต่างที่มีหลายจอภาพ ฉันจะผูกกุญแจเข้ากับหลายคำสั่งได้อย่างไร ฉันพยายามผูกมัดพวกเขาด้วย; และ \; - ไม่มีอะไรช่วย กรุณาแนะนำสิ่งที่ฉันควรใช้แทน...ด้านล่าง

เป็นไปได้หรือไม่เมื่อฉันเปิดหน้าต่างใหม่เพื่อระงับคำสั่งพื้นหลังที่ซ้อนทับด้วย?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

คำตอบ:


37

ทอดด์อิสระที่ถูกต้อง "ถูกต้อง" \;วิธีที่จะทำเช่นนี้คือการใช้ เรียงจาก แต่มีอุปสรรค์

คุณเห็นว่าคุณเข้าร่วมลำดับของคำสั่ง tmux ร่วมกันโดยให้ tmux ร่วม;กัน ดังนั้นในไฟล์ที่มาจาก tmux คุณอาจพูดว่า

new-session "monitor1" ; split-window -v "monitor2"

ถ้าด้วยเหตุผลบางอย่างคุณต้องการทั้งหมดในบรรทัดเดียว ตอนนี้คุณสามารถให้ว่าคำสั่งสารประกอบหนึ่งบรรทัดกับtmuxคำสั่งจากเปลือกยังแต่จะต้องหนีออกมาเพื่อให้ตีความเปลือกมันเป็นอาร์กิวเมนต์อีก; tmuxดังนั้นการเทียบเท่าข้างต้นจากเปลือกคือ

$ tmux new-session "monitor1" \; split-window -v "monitor2"

ในทำนองเดียวกันbind-keyคำสั่งtmux ใช้ชุดของอาร์กิวเมนต์ซึ่งเป็นคำสั่ง tmux และอาร์กิวเมนต์เพื่อรันเมื่อกดคีย์ หากคุณต้องการที่จะผูกC-qกับลำดับข้างต้นจากภายในไฟล์ที่มาจาก tmux คุณจะพูดว่า

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

ที่นี่เราได้หลบหนี; จาก tmuxดังนั้น tmux ไม่ตีความว่ามันเป็นจุดสิ้นสุดของbind-keyคำสั่ง แต่เป็นอีกอาร์กิวเมนต์หนึ่งที่bind-keyบอกให้สร้างคำสั่งผสมเป็นค่าขอบเขตของC-qคีย์

จะเกิดอะไรขึ้นเมื่อเราต้องการให้ tmux ทำสิ่งนั้นจากเปลือก หนีออกมาจำนวนมาก

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

อันดับแรกเราต้องหลบหนี\ และ;แต่ละจากเปลือกทำให้เปลือกจะผ่านตัวละครทั้งสองเป็นอาร์กิวเมนต์ไปยัง\; tmuxนี้จากนั้นจะหนี;จาก tmux C-qก่อให้เกิดการกำหนดคำสั่งผสมทั้งหมดเป็นผลผูกพันของ


ทีนี้ทุกอย่างที่กล่าวว่าถ้าคุณใช้การตั้งค่า tmux ที่ซับซ้อนเช่นนี้ซ้ำ ๆ ฉันขอแนะนำให้คุณสร้างไฟล์ tmux เพื่อเก็บไว้ใน:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

แล้ว:

$ tmux source split-windows.tmux  # (or even make an alias for this)

มันจะง่ายกว่ามากในการรักษาด้วยวิธีนี้


3
ในการสร้างการโยงคีย์ให้กับหลาย ๆ คำสั่งจากบรรทัดคำสั่งดูน่ากลัวน้อยกว่าคุณยังสามารถใช้สตริงหลบหนี\;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap

12

ดังนั้นคำตอบที่แท้จริงคือคุณโยงคำสั่งด้วยแบ็กสแลชแล้วตามด้วยเครื่องหมายอัฒภาค

bind-key C send-keys foo \; send-keys bar

คุณจะใส่มันใน tmux.conf ของคุณหรือเรียกใช้จากพรอมต์ tmux ":"


นี่เป็นสิ่งที่ยอดเยี่ยมและทำงานเพื่อใช้เซสชัน tmux ที่ซ้อนกันและการนำทางผ่านหน้าต่าง tmux ที่ซ้อนกัน
พอล

1
สิ่งนี้ไม่ทำงานจากบรรทัดคำสั่งเชลล์ คือ `tmux ปุ่มผูก C ปุ่มส่ง foo \; แถบ send-keys "มีเอฟเฟกต์การผูก" foo "เป็น" C "แต่พิมพ์" bar "ทันที
Lqueryvg

ใช่คุณจะเรียกใช้จากภายใน tmux อัปเดตเพื่อชี้แจง
ทอดด์อิสระ

ดี! ทั้งหมดนี้ใช้งานได้ ... กราเซียมาก!
Brad Parks

หมายเหตุ: ภายในราคาเดียวไม่จำเป็นต้องหลบหนี
elig

2

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

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

ซึ่งจะส่งคีย์ 'xyz', คำสั่ง 'ล้างประวัติ' ของ tmux แล้วเรียกใช้เชลล์ 'clear' shell builtin

สตริงทั้งหมดเป็นเพียงลำดับคำสั่งเชลล์จำนวนมาก


1

คุณสามารถเพิ่มสิ่งนี้ในการผูกคีย์ใน.tmux.confไฟล์ของคุณ:

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

และในtmux-new-session.shคุณสามารถมี:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

1

ทุกอย่างที่แสดงที่นี่จะไม่ทำงานเพราะสิ่งนี้

bind q send-keys "command1" \; send-keys "command2"

จะดำเนินการ command2 ทันทีและ q จะถูกผูกไว้กับ send-keys เท่านั้น "command1"

นี่คือทางออก:

bind R source-file "$HOME/.tmux/reload.tmux"

ในไฟล์ ~ / .tmux / reload.tmux ให้ใส่คำสั่งหลายคำสั่งเช่น:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1
โอ้รอใช้สิ่งที่ Peeja พูด (\\\;) :-)
lzap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.