tmuxのすべてのペインにコマンドを送信する方法は?


189

:clear-historyは巨大なスクロールバックでペインを呼び出すのが好きです。ただし、さまざまなウィンドウのすべてのペインにこのコマンドを送信する方法をスクリプト化したいと思います。

この質問のおかげで、すべてのウィンドウにコマンドを送信する方法を知っていますが、どのウィンドウのすべてのペインにもコマンドを送信するのですか?

send-keyssynchronize-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 and bind -n M-x setw synchronize-panes off
guneysus

4
同じショートカットを切り替えに設定することは可能ですか?
アーノルドロア2017年

20
@ArnoldRoaはい、終了するとオプションが切り替わりますon/off。つまり、bind -n C-x setw synchronize-panes
センセーションは

1
bind -n C-x setw synchronize-panesどのショートカットを追加する場合、押すために押す必要がありますか?プレフィックス+ C&xですか。私はたくさんのオプションを試しました
ビルゴールドバーグ

28

パーティーには少し遅れましたが、1つのコマンドを送信するためだけに同期ペインを設定および設定解除したくなかったので、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のコマンドプロンプトから同じこれはbashのですが、1が行うことができ、私が実行して意味prefix + :
Rhoのファイ

どのように、またはそれが可能かはわかりません。経由でコマンドを送信する必要があるユースケースシナリオは何<prefix>:ですか?
kshenoy 2016

bashスニペット(: run "yourscript.sh yourargs...")を呼び出すことをお勧めします。コマンドが出力を出力している場合は、qを押すまでアクティブペインまたは指定したペインに結果が表示されますが、この場合は表示されません。もちろん、これを好みに応じてエイリアス/バインドできます。余談ですが、内部プロセスではキーストロークまたはその効果の解釈が異なる場合があるため、ホワイトリストまたはブラックリストのオン#{pane_current_cmd}が必要になる場合があります。私はctrl + lとclear-historyを送信するためにctrl + kをバインドしています。これはシェルでは問題なく動作しますが、Vimのバッファーを壊します。ctrl + kをブロードキャストする前に、改良が必要です。
ジョンP

これは、XY問題の可能性があります。Tmuxコマンドプロンプトは便利ですが、別のコマンドプロンプトを開いていないため、Tmuxを使用しているようです。<prefix>:各コマンドの前に送信し、コマンドを終了した後に出力を失う代わりに、必要に応じて、プレフィックスなしでキーバインディングを設定して、選択したシェルで追加のペインに切り替えてフォーカスすることができます。Tmuxを介した実行に付属しています。たとえば、<prefix>:run "man cat"に登場する人間にはなりませんpidof manかさえps auxf | grep man、また男性のための私の現在のページャ、「少ない」と。
ジョンP

リンクが死んでいる
Mateusz Piotrowski 2017

10

2019年6月の更新

同期ペインの独自のバインディングを構成する方法の簡単な図。

以下を私の中に追加しました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 aに再マップしました)。


4

上記の答えはどれもうまくいきませんでした(tmux v2.3)が、bashコマンドラインからはうまくいきました。

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

'clear-history'以外のtmuxコマンド用のより一般化されたスクリプトは、その要素をパラメーターに置き換えるだけです。$ 1。"-t $ {_ pane}"をそれぞれに適用する必要があるため、一連のtmuxコマンドを処理するスクリプトを作成する場合は注意してください。

-aパラメータto tmux list-panesは、すべてのセッションのすべてのウィンドウのすべてのペインをカバーする必要があることに注意してください。これがないと、現在のtmuxウィンドウのペインだけが影響を受けます。複数のtmuxのセッションのオープンを持っているだけで、現在のセッション内のペインにコマンドを適用する場合は、交換する-a-s(これはtmuxのmanページですべてです)。

上記の各回答に直接コメントするmodポイントはありません。そのため、これらが私のために機能しなかった理由は次のとおりです。

@ shailesh-gargの回答で私が抱えていた問題は、同期がペイン内で発行されたコマンドにのみ影響し、ペインのCtrl-B :外側にあるを使用して発行されたtmuxコマンドには影響しなかったことです。

@kshenoyの回答で私が抱えていた3つの問題は、

  1. キーストロークをそのペインのtmux操作ではなく、ペイン内に送信します。たとえば、ペインでbashシェルを実行していて、スクリプトを使用して「clear-history」を送信した場合、これらはキーストロークになります。 bashコマンドラインに表示されます。回避策は、 "tmux clear-history"を送信するか、 "tmux"を "$ @"の前に付加することですが、回答に関する他の問題のため、私は回答を編集していません。
  2. 文字どおり改行しないと、改行文字を送信する方法を理解できませんでした。
  3. 私がそれをしたときでも、「tmux clear-history」を送信しても効果がありませんでした。

3

私のtmuxバージョンは1.9aで、これは私にとってはうまくいきます。1つのキーでオンとオフの両方に十分です

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  

「セッションID」と「コマンド」を適宜置き換えてください。


この外国語について何か言いたいことがある
ムハンマドオメルアスラム

何?英語は難しいことではありません。しかし、言いたいことがあれば、それを言いなさい。
RJ

4
:D非常に最小限のテキストであるため、回答に説明を追加する必要があります。そのため、Stackoverflowはスパムまたは低品質の投稿として検出するため、詳細を追加して、その下に表示されないようにします。
ムハンマドオメルアスラム2018

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
}

devと呼ばれるセッションをターゲットにし、bashまたはにあるすべてのペインでpython virtualenvを有効にし、zshvimまたはその他の実行可能ファイルを含むペインでコマンドを実行しないようにする例:

_send_bash_command_to_session dev workon myvirtualenv

または覚えやすい:現在のセッションでそれを行うには:

tmux_set_venv myvirtualenv

この機能を使用して構成ファイルを見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.