Tmux में सभी पैन को कमांड कैसे भेजें?


189

मुझे :clear-historyएक विशाल स्क्रॉलबैक के साथ पैन पर कॉल करना पसंद है । हालाँकि, मैं इस कमांड को विभिन्न विंडो में सभी पैन में भेजने का एक तरीका देना चाहता हूं।

मैं जानता हूं कि इस सवाल के सौजन्य से सभी खिड़कियों पर कमांड कैसे भेजते हैं , लेकिन मैं किस विंडो के सभी पैन पर भी कमांड भेजूं?

send-keysऔर synchronize-panestmux मैनपेज से मन में आया, लेकिन मुझे यकीन नहीं है कि उन्हें एक साथ शादी कैसे करनी है। लेकिन शायद ऐसा करने का एक सरल तरीका है।

अतिरिक्त अवलोकन:

इस बारे में थोड़ा सोचकर, tmux list-panes -aवर्तमान सत्र में सभी पैन को सूचीबद्ध करना प्रतीत होता है। के साथ शुरू करने के लिए बहुत उपयोगी है। मैं यहाँ से कहाँ जाऊँ?


: प्रत्येक फलक पर लागू होने वाला, प्रत्येक विंडो में, प्रत्येक सत्र में एक समाधान खोजने की आशा में इस सवाल का आ रहा है उन लोगों के लिए scripter.co/command-to-every-pane-window-session-in-tmux
chb

जवाबों:


351

क्या आपने कई पैन के साथ tmux विंडो में अनुसरण करने की कोशिश की है

Ctrl-B :

setw synchronize-panes on

clear history

52
पूर्णता की खातिर, यदि आप ऐसा करेंगे तो बंद करने के लिएCtrl-b :setw synchronize-panes off
मिच

19
और आप इसके लिए शॉर्टकट ~/.tmux.confजोड़ सकते हैं: bind -n C-x setw synchronize-panes on bind -n M-x setw synchronize-panes off
गनियस

4
टॉगल करने के लिए एक ही शोरकट सेट करना संभव है?
अर्नोल्ड रोआ

20
@AnnoldRoa हाँ, यदि आप छोड़ देते हैं तो विकल्प टॉगल करेगा on/off। तोbind -n C-x setw synchronize-panes
सनसनी

1
यदि मैं जोड़ने के bind -n C-x setw synchronize-panesलिए मुझे क्या शॉर्ट कट जोड़ना चाहिए? क्या यह उपसर्ग + C & x है। मैंने बहुत सारे विकल्पों की कोशिश की
बिल गोल्डबर्ग

28

पार्टी में थोड़ी देर हो गई लेकिन मैं केवल एक कमांड भेजने के लिए सिंक्रोनाइज़-पैन को सेट और अनसेट नहीं करना चाहता था इसलिए मैंने tmux के चारों ओर एक रैपर फ़ंक्शन बनाया और एक कस्टम फ़ंक्शन को जोड़ा send-keys-all-panes

_tmux_send_keys_all_panes_ () {
  for _pane in $(tmux list-panes -F '#P'); do
    tmux send-keys -t ${_pane} "$@"
  done
}

मैं इस फ़ंक्शन (सुविधा के लिए) को कॉल करने को आसान बनाने के लिए tmux कमांड के चारों ओर एक आवरण भी बनाता हूं। रैपर और उपरोक्त कोड सभी यहाँ हैं

यह मुझे सभी पैनों को चलाने tmux send-keys-all-panes <command>या tmux skap <commandभेजने की अनुमति देता है <command>

ध्यान दें कि tmux मेरे आवरण फ़ंक्शन tmux_pp के लिए उपकृत है।


यह बैश है, लेकिन क्या कोई भी tmux कमांड प्रॉम्प्ट से ऐसा कर सकता है, मेरा मतलब हैprefix + :
Rho Phi

मुझे नहीं पता कि यह कैसे या यदि संभव है। आपका उपयोग-मामला परिदृश्य क्या है जिसे आपको कमांड भेजने की आवश्यकता है <prefix>:?
kshenoy

मैं बैश स्निपेट ( : run "yourscript.sh yourargs...") को कॉल करने की सलाह दूंगा ; यदि आपकी कमांड में आपका सक्रिय या निर्दिष्ट फलक है, तो जब तक आप q दबाते हैं, तब तक परिणाम प्रदर्शित होंगे, लेकिन इस मामले में ऐसा नहीं होना चाहिए। बेशक आप इसे अपनी पसंद के अनुसार उर्फ ​​/ बाँध सकते हैं। एक तरफ के रूप में, आंतरिक प्रक्रियाएं आपके कीस्ट्रोक्स या उनके प्रभावों की अलग-अलग व्याख्या कर सकती हैं, इसलिए एक श्वेत सूची या ब्लैकलिस्ट #{pane_current_cmd}आवश्यक हो सकता है। मेरे पास ctrl + k है जो ctrl + l और स्पष्ट-इतिहास भेजने के लिए बाध्य है; यह गोले के लिए ठीक काम करता है, लेकिन क्लोबर वीम के बफर। अपने ctrl + k को प्रसारित करने से पहले मुझे शोधन की आवश्यकता होगी।
जॉन पी

यह एक XY समस्या का अधिक हो सकता है; Tmux कमांड प्रॉम्प्ट उपयोगी है, लेकिन ऐसा लगता है कि आप इसका उपयोग कर रहे हैं क्योंकि आपके पास एक और कमांड प्रॉम्प्ट खुला नहीं है। आप एक कुंजी बाइंडिंग सेट कर सकते हैं - उपसर्ग के बिना, यदि आपको पसंद है - अपनी पसंद के शेल के साथ एक अतिरिक्त फलक को टॉगल करने और फ़ोकस करने के लिए <prefix>:, प्रत्येक कमांड से पहले भेजने के बजाय , कमांड छोड़ने के बाद आउटपुट खोना, और सभी नुकसान Tmux के माध्यम से निष्पादित करने के साथ आते हैं। उदाहरण के लिए, <prefix>:run "man cat"मनुष्य में pidof manया उसके बाद भी नहीं दिखाई देता है ps auxf | grep man, और न ही 'कम' के रूप में, आदमी के लिए मेरा वर्तमान पेजर।
जॉन पी

यह लिंक मृत है
Mateusz Piotrowski

10

अपडेट जून 2019

पैन को सिंक्रोनाइज़ करने के लिए अपने खुद के बंधन को कॉन्फ़िगर करने के तरीके पर त्वरित चित्रण ।

निम्नलिखित में जोड़ा गया tmux.conf( मेरी टिप्पणी निश्चित रूप से मेरे समग्र विन्यास पर लागू होती है):

# synchronize all panes in a window
# don't use control S, too easily confused
# with navigation key sequences in tmux (show sessions)
unbind C-S
bind C-Y set-window-option synchronize-panes

अब, मैं कई पैन के साथ कमांड को सिंक्रनाइज़ करने की क्षमता को चालू कर सकता हूं <C-a><C-y>

(हां, मैंने Ctrl से बाइंड की कुंजी को हटा दिया)।


4

उपर्युक्त उत्तरों में से कोई भी मेरे लिए काम नहीं किया (tmux v2.3), लेकिन इसने bash कमांड लाइन से:

for _pane in $(tmux list-panes -a -F '#{pane_id}'); do \
  tmux clear-history -t ${_pane}  ; done

'स्पष्ट-इतिहास' के अलावा tmux कमांड के लिए एक अधिक सामान्यीकृत स्क्रिप्ट, बस उस तत्व को एक पैरामीटर के साथ बदल देगी, जैसे। $ 1। यदि आप tmux कमांड की एक श्रृंखला को संभालने के लिए स्क्रिप्ट लिखने का इरादा रखते हैं तो सावधान रहें, क्योंकि "-t $ {_ pane}" को प्रत्येक पर लागू करना होगा।

ध्यान दें कि सभी सत्रों में सभी विंडो में सभी पैन को कवर -aकरने के लिए पैरामीटर tmux list-panesआवश्यक है। इसके बिना, आपकी वर्तमान tmux विंडो में केवल पैन ही प्रभावित होंगे। आप एक से अधिक tmux सत्र खुला है और केवल वर्तमान सत्र के भीतर शीशे के आदेश लागू करने के लिए चाहते हैं, की जगह -aके साथ -s(यह tmux आदमी पृष्ठ में सभी है)।

मैं ऊपर दिए गए प्रत्येक उत्तर पर सीधे टिप्पणी करने के लिए आधुनिक बिंदु नहीं है, इसलिए यहाँ वे मेरे लिए काम क्यों नहीं कर रहे थे:

मेरे पास @ शैलेश-गर्ग के उत्तर के साथ जो समस्या थी, वह यह थी कि सिंक केवल पैन के भीतर जारी किए गए आदेशों को प्रभावित करते थे, न कि उन टोमक्स कमांडों का उपयोग करके Ctrl-B :जो पैन के बाहर जारी किए गए थे ।

तीन समस्याएं जो मुझे @ अक्षेनॉय के उत्तर के साथ थीं, वे थीं:

  1. यह एक फलक के भीतर कीस्ट्रोक्स भेजता है, उस फलक के tmux ऑपरेशन के लिए नहीं, इसलिए, उदाहरण के लिए, यदि किसी व्यक्ति के पास बैश शेल चल रहा है और एक ने "स्पष्ट-इतिहास" भेजने के लिए स्क्रिप्ट का उपयोग किया है, तो वे कीस्ट्रोक्स होंगे बैश कमांड-लाइन में दिखाई देगा। आस-पास एक काम "tmux clear-history" या प्री-पेंड "tmux" को "$ @" भेजने के लिए होगा, लेकिन मैंने जवाब के साथ अपनी अन्य समस्याओं के कारण उत्तर को संपादित नहीं किया है;
  2. मैं यह पता नहीं लगा सका कि लाइन को बिना तोड़-फोड़ किए नई पंक्ति का वर्ण कैसे भेजा जाए;
  3. जब मैंने ऐसा किया था, तब भी "tmux clear-history" भेजने का कोई प्रभाव नहीं पड़ा।

3

मेरा tmux संस्करण 1.9a है, और यह मेरे लिए काम करता है, एक कुंजी ऑन और ऑफ दोनों के लिए पर्याप्त है

bind-key X set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}"

2
tmux send-keys -t <session id> <command> C-m  

तदनुसार "सत्र आईडी" और "कमांड" बदलें।


इस विदेशी भाषा के बारे में कुछ कहना चाहेंगे
मुहम्मद ओमर असलम

क्या? अंग्रेजी कठिन नहीं है। लेकिन अगर आपको कुछ कहना है, तो कहिए।
RJ

4
:Dयार आपको अपने उत्तर में कुछ विवरण जोड़ना होगा क्योंकि इसमें बहुत ही कम पाठ है और इस कारण से Stackoverflow इसे एक स्पैम या निम्न गुणवत्ता के पद के रूप में पहचानता है, बस इसमें कुछ विवरण जोड़ें ताकि यह इसके अंतर्गत प्रकट न हो।
मुहम्मद ओमर असलम

6
यह मज़ेदार है, स्वीकृत उत्तर का भी कोई वर्णन नहीं है और केवल कोड है, लेकिन जो भी हो।
RJ

0

इसे करने के लिए मेरी उपयोगिता कार्य है, केवल कमांड को निष्पादित करना जब फलक में कुछ भी नहीं चल रहा हो।

#!/bin/bash

_send_bash_command_to_session() {
    if [[ $# -eq 0 || "$1" = "--help" ]] ; then
        echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: '
        return
    fi
    input_session="$1"
    input_command="${@:2}"
    for _pane in $(tmux list-panes -s -t ${input_session} -F '#{window_index}.#{pane_index}'); do
        # only apply the command in bash or zsh panes.
        _current_command=$(tmux display-message -p -t ${input_session}:${_pane} '#{pane_current_command}')
        if [ ${_current_command} = zsh ] || [ ${_current_command} = bash ] ; then
            tmux send-keys -t ${_pane} "${input_command}" Enter
        fi
    done
}

tmux_set_venv() {
    _current_session=$(tmux display-message -p '#{session_name}')
    _send_bash_command_to_session ${_current_session} workon $1
}

उदाहरण एक सत्र जिसे देव कहा जाता है, सभी पैनों में एक पायथन वर्चुअन को सक्षम करता है जो कि bashया zsh, पैन में कमांड को वीम या किसी अन्य निष्पादन योग्य के साथ निष्पादित करने से रोकता है:

_send_bash_command_to_session dev workon myvirtualenv

या याद रखना आसान है: वर्तमान सत्र में इसे करने के लिए:

tmux_set_venv myvirtualenv

इस फ़ंक्शन के साथ मेरी कॉन्फ़िगरेशन फ़ाइल ढूंढें ।

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