【问题标题】:How to send a command to all panes in tmux?如何向 tmux 中的所有窗格发送命令?
【发布时间】:2013-04-25 21:09:58
【问题描述】:

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

我知道如何向所有窗口发送命令,感谢question,但我如何也向哪个窗口的所有窗格发送命令?

我想到了 tmux 手册页中的send-keyssynchronize-panes,但我不确定如何将它们结合在一起。但也许有更简单的方法来做到这一点。

额外观察:

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

【问题讨论】:

标签: tmux


【解决方案1】:

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

Ctrl-B :

setw synchronize-panes on

clear history

【讨论】:

  • 只是为了完整起见,如果关闭你会做Ctrl-b :setw synchronize-panes off
  • 您可以在~/.tmux.conf上为此绑定快捷方式,方法是添加:bind -n C-x setw synchronize-panes on bind -n M-x setw synchronize-panes off
  • 是否可以设置相同的切换快捷键?
  • @ArnoldRoa 是的,如果您离开 on/off,选项将会切换。所以bind -n C-x setw synchronize-panes
  • 如果我添加bind -n C-x setw synchronize-panes 我应该按什么快捷方式调用?是前缀+C&x。我尝试了很多选择
【解决方案2】:

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

【讨论】:

  • 这是 bash,但可以从 tmux 命令提示符执行相同操作,我的意思是通过执行 prefix + :
  • 我不知道如何或是否可能。您需要通过<prefix>: 发送命令的用例场景是什么?
  • 我建议调用 bash sn-p (: run "yourscript.sh yourargs...");如果您的命令已输出,则您的活动或指定窗格将显示结果,直到您按 q,但在这种情况下它不应该。当然,您可以根据自己的喜好对其进行别名/绑定。顺便说一句,内部进程可能会以不同方式解释您的击键或其效果,因此#{pane_current_cmd} 上的白名单或黑名单可能是必要的。我有 ctrl+k 绑定发送 ctrl+l 和清除历史;这适用于 shell,但会破坏 Vim 的缓冲区。在广播我的 ctrl+k 之前,我需要改进。
  • 这可能更像是一个 X-Y 问题; Tmux 命令提示符很有用,但听起来您正在使用它,因为您没有打开另一个命令提示符。您可以设置一个键绑定 - 如果您愿意,可以不带前缀 - 使用您选择的 shell 切换和聚焦一个额外的窗格,而不是在每个命令之前发送 <prefix>:,离开命令后丢失输出,以及所有通过 Tmux 执行的陷阱。例如,<prefix>:run "man cat" 不会导致 man 出现在 pidof man 甚至 ps auxf | grep man 中,也不会出现在我当前的 man 寻呼机中。
  • 链接失效
【解决方案3】:

2019 年 6 月更新

快速说明如何为同步窗格配置您自己的绑定。

在我的tmux.conf 中添加了以下内容(cmets 肯定适用于我的整体配置):

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

【讨论】:

  • 这是一个非常有用的答案。谢谢。
【解决方案4】:

我的 tmux 版本是 1.9a,这对我来说很有效,一键开启和关闭就足够了

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

【讨论】:

  • 这是最优雅的解决方案:1 次按键打开/关闭。在tmux 3.0a 上完美运行
【解决方案5】:

以上答案都不适用于我(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}”应用于每个命令。

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

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

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

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

  1. 它将击键发送到窗格内,而不是发送到 tmux 操作 例如,如果一个 bash shell 正在运行 窗格和一个使用脚本发送“清除历史”,那些 将是出现在 bash 命令行中的击键。 一种解决方法是发送“tmux clear-history”或预先挂起 “tmux”到“$@”,但我没有编辑答案,因为我的其他 答案有问题;
  2. 我不知道如何发送 换行符,没有字面上的断行;
  3. 即使我这样做了,发送“tmux clear-history”也没有效果。

【讨论】:

    【解决方案6】:
    tmux send-keys -t <session id> <command> C-m  
    

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

    【讨论】:

    • 想谈谈这种外星语言
    • 什么?英语并不难。但如果你有话要说,那就说吧。
    • :D 老兄,您需要在答案中添加一些描述,因为它的文本非常少,因此 Stackoverflow 将其检测为垃圾邮件或低质量帖子只需添加给它一些细节,这样它就不会出现在它下面。
    • 这很有趣,接受的答案也没有描述,只有代码,但无论如何。
    【解决方案7】:

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

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

    使用此功能查找我的configuration file

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        您可以将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"
        

        【讨论】:

          【解决方案10】:

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

          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"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-01-31
            • 2022-01-23
            • 1970-01-01
            • 1970-01-01
            • 2014-12-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多