web-dev-qa-db-ja.com

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

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

question のおかげで、すべてのウィンドウにコマンドを送信する方法を知っていますが、どのウィンドウのすべてのペインにもコマンドを送信するにはどうすればよいですか?

tmuxマンページからのsend-keyssynchronize-panesが思い浮かびますが、それらをどのように結合するかはわかりません。しかし、もっと簡単な方法があるかもしれません。

追加の観察:

少し考えてみると、tmux list-panes -aは現在のセッションのすべてのペインをリストしているようです。始めるのにかなり便利です。ここからどこに行きますか?

161

複数のペインがあるtmuxウィンドウでフォローしようとしましたか?

Ctrl-B :

setw synchronize-panes on

clear history
294
shailesh garg

パーティーに少し遅れましたが、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にエイリアスされていることに注意してください。

24
kshenoy

上記の回答はどれもうまくいきませんでした(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コマンドを処理するスクリプトを作成する場合は注意してください。

すべてのセッションのすべてのウィンドウのすべてのペインをカバーするには、-atmux list-panesパラメーターが必要であることに注意してください。これがないと、現在のtmuxウィンドウのペインのみが影響を受けます。複数のtmuxセッションを開いており、現在のセッション内のペインにのみコマンドを適用する場合は、-a-sに置き換えます(tmuxのマニュアルページにすべてあります)。

上記の各回答に直接コメントするためのmodポイントがないので、ここで彼らが私のために働いていなかった理由は次のとおりです。

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

@kshenoyの回答で私が抱えていた3つの問題は、次のとおりです。

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

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に再マップしました)。

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

それに応じて「セッションID」と「コマンド」を置き換えます。

2
R J

これはそれを行うためのユーティリティ関数であり、ペインで何も実行されていないときにのみコマンドを実行します。

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

この機能で 設定ファイル を見つけてください。

0
phcerdan