如何发送一个命令到所有窗格在tmux?

我喜欢在有巨大滚动屏的窗格上调用:clear-history。但是,我想通过脚本将此命令发送到各个窗口中的所有窗格。

我知道如何发送一个命令到所有的窗口,礼貌的问题,但我如何发送一个命令到哪个窗口的所有窗格呢?

我想到了tmux manpage中的send-keyssynchronize-panes,但我不确定如何将它们结合在一起。但也许有一种更简单的方法。

额外的观察:

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

123902 次浏览

你试过在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 <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

一个更通用的脚本,对于tmux命令,而不是'clear-history',只会用一个参数替换该元素,例如。1美元。如果您打算编写一个脚本来处理一系列tmux命令,那么一定要小心,因为“-t ${_pane}”将需要应用于每个命令。

请注意,-a参数到tmux list-panes必须覆盖所有会话中所有窗口的所有窗格。否则,只有当前tmux窗口中的窗格会受到影响。如果您有多个tmux会话打开,并且只想将命令应用于当前会话中的窗格,请将-a替换为-s(这都在tmux手册页中)。

我没有mod点来直接评论上面的每个答案,所以这里是为什么他们不适合我:

我在@shailesh-garg的回答中遇到的问题是,同步只影响窗格内发出的命令,而不影响窗格外使用Ctrl-B :发出的tmux命令。

@kshenoy的回答有三个问题:

  1. 将击键发送到窗格内,而不是发送到tmux操作 例如,如果其中有一个bash shell在运行 其中一个窗格使用脚本发送“clear-history” 将是出现在bash命令行中的击键。 一个变通办法是发送“tmux clear-history”或预先挂起 “tmux”到“$@”,但我还没有编辑答案,因为我的其他 问题的答案;李< / >
  2. 我不知道如何发送一个 换行符,不断行;李< / >
  3. 即使我这样做了,发送“tmux clear-history”也没有效果。
tmux send-keys -t <session id> <command> C-m

请相应地替换“session id”和“command”。

这是我的实用工具函数,只在窗格中没有任何运行时执行命令。

#!/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的会话,在bashzsh中的所有窗格中启用python virtualenv,避免在vim或任何其他可执行文件的窗格中执行命令:

_send_bash_command_to_session dev workon myvirtualenv

或者更容易记住:在当前会话中执行:

tmux_set_venv myvirtualenv

用这个函数找到我的配置文件

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版本是1.9a,这对我来说是可行的,一个键足够开和关

bind-key X set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}"

你可以将synchronize-panessend-keys组合在一个快捷方式中,向所有窗格发送命令:

预定义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"

如果你想把你的命令发送到每个会话的每个窗口的每个窗格,把这个添加到你的.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

如果你想要这种行为,将"$*"更改为"$@",但根据我的经验,这是你想要的。

无可否认,这只是半相关的,我发现当我切换同步窗格时,我可以让状态背景变成红色,所以当我切换回一个同步窗格状态未知的窗口时,很明显:

bind-key C-x setw synchronize-panes on \;  set-window-option status-bg red \; display-message "pane sync on"
bind-key M-x setw synchronize-panes off \;  set-window-option status-bg default \; display-message "pane sync off"

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

< p > Shift + F9:
截图 < / p > < p > Ctrl + F9:
截图 < / p >

Shift + F1

截图