スクロールバックの大きいペインで:clear-history
を呼び出すのが好きです。ただし、このコマンドをさまざまなウィンドウのすべてのペインに送信する方法をスクリプト化したいと思います。
question のおかげで、すべてのウィンドウにコマンドを送信する方法を知っていますが、どのウィンドウのすべてのペインにもコマンドを送信するにはどうすればよいですか?
tmuxマンページからのsend-keys
とsynchronize-panes
が思い浮かびますが、それらをどのように結合するかはわかりません。しかし、もっと簡単な方法があるかもしれません。
少し考えてみると、tmux list-panes -a
は現在のセッションのすべてのペインをリストしているようです。始めるのにかなり便利です。ここからどこに行きますか?
複数のペインがあるtmuxウィンドウでフォローしようとしましたか?
Ctrl-B :
setw synchronize-panes on
clear history
パーティーに少し遅れましたが、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コマンドのラッパーを作成して、この関数の呼び出しを簡単にします(便宜上)。ラッパーと上記のコードはすべて here です。
これにより、tmux send-keys-all-panes <command>
またはtmux skap <command
を実行して、すべてのペインに<command>
を送信できます。
Tmuxは、ラッパー関数tmux_ppにエイリアスされていることに注意してください。
上記の回答はどれもうまくいきませんでした(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
のtmux list-panes
パラメーターが必要であることに注意してください。これがないと、現在のtmuxウィンドウのペインのみが影響を受けます。複数のtmuxセッションを開いており、現在のセッション内のペインにのみコマンドを適用する場合は、-a
を-s
に置き換えます(tmuxのマニュアルページにすべてあります)。
上記の各回答に直接コメントするためのmodポイントがないので、ここで彼らが私のために働いていなかった理由は次のとおりです。
@ shailesh-gargの答えで私が抱えていた問題は、同期はペイン内で発行されたコマンドにのみ影響し、ペイン外にあるCtrl-B :
を使用して発行されたtmuxコマンドには影響しなかったことです。
@kshenoyの回答で私が抱えていた3つの問題は、次のとおりです。
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に再マップしました)。
tmux send-keys -t <session id> <command> C-m
それに応じて「セッションID」と「コマンド」を置き換えます。
これはそれを行うためのユーティリティ関数であり、ペインで何も実行されていないときにのみコマンドを実行します。
#!/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
またはzsh
にあるすべてのペインでpython virtualenvを有効にし、vimまたはその他の実行可能ファイルを使用してペインでコマンドを実行しないようにする例:
_send_bash_command_to_session dev workon myvirtualenv
または覚えやすい:現在のセッションでそれを行うには:
tmux_set_venv myvirtualenv
この機能で 設定ファイル を見つけてください。