235

我喜欢:clear-history用巨大的回滚来调用窗格。但是,我想编写一种方法来将此命令发送到各个窗口中的所有窗格。

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

send-keyssynchronize-panes从 tmux 联机帮助页中浮现,但我不知道如何将它们结合在一起。但也许有一种更简单的方法可以做到这一点。

额外观察:

稍微考虑一下,tmux list-panes -a似乎列出了当前会话中的所有窗格。开始时非常有用。我从这里去哪里?

4

10 回答 10

439

您是否尝试过在具有多个窗格的 tmux 窗口中进行跟踪

Ctrl-B :

setw synchronize-panes on

clear history
于 2014-05-16T21:01:04.473 回答
32

聚会有点晚了,但我不想设置和取消设置同步窗格只是为了发送一个命令,所以我围绕 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 的别名。

于 2015-12-03T18:47:42.403 回答
16

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)。

于 2019-06-03T01:11:53.300 回答
9

我的 tmux 版本是 1.9a,这对我有用,一个键足以打开和关闭

bind-key X set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}"
于 2019-12-24T02:06:43.290 回答
4

以上答案都不适合我(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美元。如果您打算编写一个脚本来处理一系列 tmux 命令,请务必小心,因为需要将“-t ${_pane}”应用于每个命令。

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

我没有直接评论上述每个答案的 mod 点,所以这就是为什么它们不适合我的原因:

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

我对@kshenoy 的回答的三个问题是:

  1. 它将击键发送到窗格内,而不是该窗格的 tmux 操作,因此,例如,如果有人在窗格中运行 bash shell 并且使用脚本发送“清除历史记录”,那么这些击键将是会出现在 bash 命令行中。一种解决方法是发送“tmux clear-history”或将“tmux”预先添加到“$@”,但由于答案存在其他问题,我没有编辑答案;
  2. 我不知道如何在不换行的情况下发送换行符;
  3. 即使我这样做了,发送“tmux clear-history”也没有效果。
于 2017-08-04T21:02:59.513 回答
2
tmux send-keys -t <session id> <command> C-m  

相应地替换“会话 ID”和“命令”。

于 2018-02-03T21:12:25.747 回答
1

这是我的实用功能,只有在窗格中没有运行任何内容时才执行命令。

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

_send_bash_command_to_session dev workon myvirtualenv

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

tmux_set_venv myvirtualenv

用这个功能找到我的配置文件。

于 2018-06-26T19:12:36.353 回答
1

如果您想在每个会话中将命令发送到每个窗口中的每个窗格,请将其添加到您的.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

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

于 2021-07-28T18:22:17.707 回答
0

您可以组合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"
于 2021-01-13T15:22:36.267 回答
0

诚然只是半相关的,我发现当我切换同步窗格时我可以将状态背景设置为红色,所以当我切换回具有未知同步窗格状态的窗口时很明显:

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"
于 2021-10-01T14:25:14.643 回答