我喜欢称它为:带有巨大卷轴的窗格上的清除历史。但是,我想通过脚本将此命令发送到各个窗口中的所有窗格。
由于这个问题,我知道如何向所有窗口发送命令,但如何向哪个窗口的所有窗格发送命令呢?
我想到了tmux manpage中的发送键和同步窗格,但我不确定如何将它们结合在一起。但也许有一种更简单的方法。
额外的观察:
稍微考虑一下,tmux list-panes -a似乎列出了当前会话中的所有窗格。开始的时候很有用。我该往哪里走?
我喜欢称它为:带有巨大卷轴的窗格上的清除历史。但是,我想通过脚本将此命令发送到各个窗口中的所有窗格。
由于这个问题,我知道如何向所有窗口发送命令,但如何向哪个窗口的所有窗格发送命令呢?
我想到了tmux manpage中的发送键和同步窗格,但我不确定如何将它们结合在一起。但也许有一种更简单的方法。
额外的观察:
稍微考虑一下,tmux list-panes -a似乎列出了当前会话中的所有窗格。开始的时候很有用。我该往哪里走?
当前回答
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
请相应地替换“session id”和“command”。
有点晚了,但我不想只是为了发送一个命令而设置和取消设置同步窗格,所以我围绕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的别名。
你可以在一个快捷方式中组合同步窗格和发送键,向所有窗格发送命令:
预定义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
如果您想要这种行为,请将“$*”更改为“$@”,但根据我的经验,这正是您想要的。
这是我的实用工具函数,只在窗格中没有任何运行时执行命令。
#!/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
用这个函数找到我的配置文件。