एक tmux कुंजी को कई कमांड में बांधना


37

मैं कई सर्वर मापदंडों की निगरानी के लिए मल्टीमेन tmux विंडो लॉन्च करता हूं। Ctrl-S के साथ मैं एक और मॉनिटर कमांड के साथ एक नई विंडो खोल सकता हूं।

अब मैं कई मॉनिटर के साथ एक और मल्टीप्लेयर विंडो खोलने के लिए Ctrl-Q को बांधना चाहता हूं । मैं कई कमांड की कुंजी को कैसे बांध सकता हूं? मैंने उनका पीछा करने की कोशिश की; तथा \; - कोई सहायता नहीं कर सकता। कृपया, सलाह दें कि नीचे ... के बजाय मुझे क्या उपयोग करना चाहिए ।

क्या यह संभव है, जब मैं इसके द्वारा ओवरलैप की गई पृष्ठभूमि कमांड्स को निलंबित करने के लिए एक नई विंडो खोलूं?

    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"

इसी प्रकार, tmux bind-keyकमांड तर्कों की एक श्रृंखला लेती है , जो tmux कमांड होती हैं और जब कुंजी को दबाया जाता है तो वे चलती हैं। यदि आप C-qtmux द्वारा सॉर्ट की गई फ़ाइल के अंदर से उपर्युक्त अनुक्रम को बांधना चाहते हैं, तो आप कहेंगे

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"
टिम हीप

12

तो असली जवाब यह है: आप एक अर्धविराम के बाद एक बैकस्लैश के साथ चेन कमांड करते हैं।

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

आप इसे अपने tmux.conf में डालेंगे, या tmux से चलाएंगे ":" प्रॉम्प्ट


यह महान था और नेस्टेड tmux सत्र का उपयोग करने और नेस्टेड tmux विंडो के माध्यम से नेविगेट करने के लिए काम किया।
पॉल

1
यह शेल कमांड लाइन से काम नहीं करता है । यानी `tmux बाइंड-की C C- कीज़ foo \; सेंड-की बार "" फू "को" सी "में बाँधने का प्रभाव होता है, लेकिन" बार "को तुरंत प्रिंट करता है।
लेक्वेर्विग

हां, आप इसे tmux के भीतर से चलाएंगे। स्पष्ट करने के लिए अद्यतन किया गया।
टोड फ़्रीड

अच्छा! यह पूरी तरह से काम करता है ... मल्चस ग्रेसिया!
ब्रैड पार्क

नोट: ए; सिंगल कोट्स के अंदर भागने की जरूरत नहीं है
elig

2

आप इसे एक छोटे से समाधान के साथ करने में सक्षम हैं। चलाने के लिए एक स्क्रिप्ट का सुझाव देने वाले उत्तर के समान (जो आपके मामले को अच्छी तरह से संभालता है), यह आमतौर पर "रन-शेल" का उपयोग करके और स्वयं tmux को शेल कमांड के रूप में कॉल करके किया जा सकता है।

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

जो 'xyz' कीज भेजेगा, tmux 'क्लियर-हिस्ट्री' कमांड देगा, और फिर 'क्लियर' शेल बेसिन को कॉल करेगा।

संपूर्ण स्ट्रिंग केवल एक एकाधिक शेल कमांड अनुक्रम है।


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"

कमांड 2 को तुरंत निष्पादित करेगा और q केवल भेजने के लिए बाध्य होगा "कमांड 1"

यहाँ समाधान है:

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

फ़ाइल में ~ / .tmux / reload.tmux जैसे कई कमांड डालते हैं:

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

1
ओह रुको, पीजा ने जो कहा (\\\;) :-)
lzap
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.