我喜欢称它为:带有巨大卷轴的窗格上的清除历史。但是,我想通过脚本将此命令发送到各个窗口中的所有窗格。

由于这个问题,我知道如何向所有窗口发送命令,但如何向哪个窗口的所有窗格发送命令呢?

我想到了tmux manpage中的发送键和同步窗格,但我不确定如何将它们结合在一起。但也许有一种更简单的方法。

额外的观察:

稍微考虑一下,tmux list-panes -a似乎列出了当前会话中的所有窗格。开始的时候很有用。我该往哪里走?


当前回答

你试过在tmux窗口中跟随多个窗格吗

Ctrl-B :

setw synchronize-panes on

clear history

其他回答

如果你想把你的命令发送到每个会话的每个窗口的每个窗格,把这个添加到你的.bashrc:

send_command_to_every_pane() {
    for session in `tmux list-sessions -F '#S'`; do
        for window in `tmux list-windows -t $session -F '#P' | sort`; do
            for pane in `tmux list-panes -t $session:$window -F '#P' | sort`; do
                tmux send-keys -t "$session:$window.$pane" "$*" C-m
            done
        done
    done
}

然后你可以这样使用它:

send_command_to_every_pane source ~/.bash_profile

如果您想要这种行为,请将“$*”更改为“$@”,但根据我的经验,这正是您想要的。

你可以在一个快捷方式中组合同步窗格和发送键,向所有窗格发送命令:

预定义tmux命令clear-history:

bind-key C set-option -w synchronize-panes on\; clear-history \; set-option -w synchronize-panes off

提示任意tmux命令:

bind-key p command-prompt -p "Panes command: " "set-option -w synchronize-panes on; %% ; set-option -w -u synchronize-panes"

提示任意shell命令:

bind-key p command-prompt -p "Panes command: " "set-option -w synchronize-panes on; send-keys %%\\n ; set-option -w -u synchronize-panes"

默认情况下,byobu使用tmux作为后端。它是一个让事情变得更简单的包装器:

Shift + F9:

Ctrl + F9:

Shift + F1

你试过在tmux窗口中跟随多个窗格吗

Ctrl-B :

setw synchronize-panes on

clear history

有点晚了,但我不想只是为了发送一个命令而设置和取消设置同步窗格,所以我围绕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 <命令>或tmux skap <命令将<命令>发送到所有窗格。

注意,tmux是我的包装器函数tmux_pp的别名。