Tmux'daki tüm bölmelere komut nasıl gönderilir?


191

Ben :clear-historybüyük bir kaydırma ile bölmeleri aramak istiyorum . Ancak, çeşitli pencerelerdeki tüm bölmelere bu komutu göndermek için bir yol komut dosyası istiyorum.

Tüm pencerelere nasıl komut gönderileceğini biliyorum, bu sorunun izniyle , hangi pencerenin tüm bölmelerine de bir komut gönderirim?

send-keysve synchronize-panestmux manpage'den akla geliyor, ama onlarla nasıl evleneceğinden emin değilim. Ama belki de bunu yapmanın daha basit bir yolu var.

Ekstra Gözlemler:

Bunu biraz düşünmek tmux list-panes -a, mevcut oturumdaki tüm bölmeleri listeliyor gibi görünüyor. Başlamak için oldukça yararlı. Buradan nereye giderim?


Her pencerede, her pencerede, her bölmede geçerli bir çözüm bulma umuduyla bu soruya gelenler için: scripter.co/command-to-every-pane-window-session-in-tmux
chb

Yanıtlar:


355

Birden fazla bölmeli tmux penceresinde takip etmeyi denediniz mi

Ctrl-B :

setw synchronize-panes on

clear history

53
Sadece bütünlük uğruna, eğer yaparsanız kapatmak içinCtrl-b :setw synchronize-panes off
Mitch

19
ve bunun için kısayolları bağlayabilirsiniz ~/.tmux.conf: bind -n C-x setw synchronize-panes on ve bind -n M-x setw synchronize-panes off
guneysus

4
geçiş için aynı kısayolu ayarlamak mümkün mü?
Arnold Roa

20
@ArnoldRoa evet, ayrılırsanız seçenek değişir on/off. Yanibind -n C-x setw synchronize-panes
sansasyon

1
Ben eklerseniz bind -n C-x setw synchronize-panesben çağırmak için baskı yapması gerektiğini neyin kısaltması kesilmiş? Ön ek + C & x mi? Çok sayıda seçenek denedim
Bill Goldberg

29

Partiye biraz geç ama ben sadece bir komut göndermek için senkronizasyon bölmeleri ayarlamak ve ayarlamak istemiyordu, bu yüzden tmux etrafında bir sarmalayıcı işlevi oluşturdu ve adlı özel bir işlev ekledi send-keys-all-panes.

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

Ayrıca, tmux komutu etrafında bu işlevi çağırmayı basitleştirmek için bir sarıcı oluşturuyorum (kolaylık sağlamak için). Sarıcı ve yukarıdaki kod burada .

Bu, kaçmamı tmux send-keys-all-panes <command>veya tmux skap <commandgöndermemi sağlıyor<command> tüm bölmelere sağlıyor.

Tmux'un benim sarma işlevi tmux_pp ile takma olduğunu unutmayın.


Bu bash, ama tmux komut isteminden aynı şeyi yapabilir, yani yaparakprefix + :
Rho Phi

Nasıl ya da bunun mümkün olup olmadığını bilmiyorum. Komut göndermek için kullanmanız gereken kullanım senaryosu <prefix>:nedir?
kshenoy

Bash snippet ( : run "yourscript.sh yourargs...") çağrılmasını tavsiye ederim ; komutunuz çıktı verdiyse, q tuşuna basıncaya kadar etkin veya belirtilen bölmeniz sonuçları görüntüler, ancak bu durumda görüntülenmemelidir. Tabii ki bunu beğeninize takabilir / bağlayabilirsiniz. Bir kenara, iç süreçler tuş vuruşlarınızı veya etkilerini farklı şekilde yorumlayabilir, bu nedenle bir beyaz liste veya kara liste #{pane_current_cmd}gerekli olabilir. Ctrl + k ctrl + l ve clear-history göndermek zorunda; bu mermiler için iyi çalışır, ancak Vim'in tamponunu kaldırır. Ctrl + k'ımı yayınlamadan önce ayrıntılandırmaya ihtiyacım vardı.
John P

Bu daha çok bir XY problemi olabilir; Tmux komut istemi yararlıdır, ancak başka bir komut isteminiz açık olmadığı için kullandığınız anlaşılıyor. <prefix>:Her komuttan önce göndermek , komuttan çıktıktan sonra çıktıyı kaybetmek ve tüm tuzakları değiştirmek yerine, tercih ettiğiniz kabuğunuzla fazladan bir bölmeyi değiştirmek ve odaklamak için bir ön kodlama (isterseniz önek olmadan) ayarlayabilirsiniz . Tmux aracılığıyla idam ile geliyor. Örneğin, <prefix>:run "man cat"insanın şu anki çağrı cihazımda görünmesi pidof manya da hatta ps auxf | grep mandaha azı ile sonuçlanmaz .
John P

Bağlantı öldü
Mateusz Piotrowski

10

Haziran 2019 Güncellemesi

Senkronizasyon bölmeleri için kendi bağlantınızı nasıl yapılandıracağınızla ilgili hızlı illüstrasyon .

Aşağıdakilerime eklendi tmux.conf(yorumlar kesinlikle genel yapılandırmam için geçerlidir):

# 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

Şimdi, komutları birden çok bölmede senkronize etme yeteneğini değiştirebilirim <C-a><C-y>.

(Evet, bağlama tuşunu Ctrl a'ya yeniden eşledim).


4

Yukarıdaki cevapların hiçbiri benim için işe yaramadı (tmux v2.3), ancak bash komut satırından işe yaradı:

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

'Clear-history' dışındaki tmux komutları için daha genel bir komut dosyası, bu öğeyi yalnızca bir parametreyle değiştirir; 1 $. Bir dizi tmux komutunu işlemek için bir komut dosyası yazmayı düşünüyorsanız dikkatli olun, çünkü her birine "-t $ {_ pane}" uygulanması gerekecektir.

To -aparametresinin tmux list-panestüm oturumlardaki tüm pencerelerdeki tüm bölmeleri kapsaması gerektiğini unutmayın . Bu olmadan, yalnızca geçerli tmux pencerenizdeki bölmeler etkilenir. Birden fazla tmux oturumunuz açıksa ve komutu yalnızca geçerli oturumdaki bölmelere uygulamak istiyorsanız -a,-s (O tmux adam sayfasında hepsi).

Yukarıdaki cevapların her birine doğrudan yorum yapmak için mod puanlarım yok, bu yüzden benim için çalışmadılar:

@ Shailesh-garg'un cevabı ile yaşadığım sorun, senkronizasyonun, yalnızca tmux komutlarını değil, bölmelerde verilen komutları etkilediğiydi Ctrl-B : dışında .

@Kshenoy'un cevabında yaşadığım üç sorun şuydu:

  1. o tuşların tmux işlemine değil, bir tuşun içine tuş vuruşlarını gönderir, örneğin, biri bölmede çalışan bir bash kabuğuna sahipse ve komut dosyasını "açık geçmiş" göndermek için kullandıysa, bunlar tuş vuruşlarıdır bash komut satırında görünür. Bir çözüm "tmux temiz tarih" göndermek veya "tmux" önceden "$ @" için beklemek olacaktır, ancak cevap ile ilgili diğer sorunlarım nedeniyle cevabı düzenlemedim;
  2. Kelimenin tam anlamıyla çizgiyi kesmeden yeni satır karakterinin nasıl gönderileceğini anlayamadım;
  3. Bunu yaptığımda bile, "tmux açık tarih" göndermenin hiçbir etkisi olmadı.

3

benim tmux versiyonum 1.9a ve bu benim için çalışıyor, bir anahtar hem açık hem de kapalı için yeterli

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  

"Session id" ve "command" komutlarını uygun şekilde değiştirin.


Bu yabancı dil hakkında bir şey söylemek istiyorum
Muhammad Omer Aslam

Ne? İngilizce zor değil. Ama söyleyecek bir şeyin varsa, söyle.
RJ

4
:Ddostum cevabınıza çok az metin içerdiğinden cevabınıza bir açıklama eklemeniz gerekiyor ve bu nedenle Stackoverflow bunu spam veya düşük kaliteli bir yazı olarak algılıyor, altında görünmemesi için biraz ayrıntı ekleyin.
Muhammed Ömer Aslam

6
Bu komik, kabul edilen cevabın hiçbir açıklaması ve sadece kodu yok, ama ne olursa olsun.
RJ

0

Bunu yapmak için benim yardımcı işlevi, sadece bölmesinde çalışan hiçbir şey yokken komutu yürütmek.

#!/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
}

Dev olarak adlandırılan bir oturumu hedefleyen, içinde bulunan tüm bölmelerde bir python virtualenv'in etkinleştirilmesine bashveya zshkomutun vim veya başka herhangi bir yürütülebilir dosyayla bölmelerde yürütülmesinden kaçınmaya örnek:

_send_bash_command_to_session dev workon myvirtualenv

veya hatırlaması daha kolay: geçerli oturumda yapmak için:

tmux_set_venv myvirtualenv

Bu işlev ile yapılandırma dosyamı bul .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.