如何向tmux中的所有窗格发送命令?

时间:2013-05-01 19:56:20

标签: tmux

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

我知道如何向所有窗口发送命令,由question提供,但我如何向窗口的所有窗格发送命令?

我想到了来自tmux联机帮助页的

send-keyssynchronize-panes,但我不确定如何将它们结合在一起。但也许有一种更简单的方法可以做到这一点。

额外观察:

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

9 个答案:

答案 0 :(得分:280)

您是否尝试过使用多个窗格的tmux窗口

Ctrl-B :

setw synchronize-panes on

clear history

答案 1 :(得分:24)

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

答案 2 :(得分: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 tmux list-panes参数需要涵盖所有会话中所有窗口中的所有窗格。没有它,只有当前tmux窗口中的窗格会受到影响。如果您打开了多个tmux会话并且只想将命令应用于当前会话中的窗格,请将-a替换为-s(这都在tmux手册页中)。

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

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

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

  1. 它将键击发送到窗格内,而不是tmux操作 例如,如果一个人运行了bash shell,那么该窗格就是如此 窗格和一个使用脚本发送“清除历史记录”,那些 将是bash命令行中出现的击键。 解决方法是发送“tmux clear-history”或预先挂起 “tmux”改为“$ @”,但由于我的其他原因,我没有编辑答案 答案的问题;
  2. 我无法弄清楚如何发送 新线字符没有字面意思;
  3. 即使我这样做,发送“tmux clear-history”也没有效果。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

tmux send-keys -t <session id> <command> C-m  

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

object.setValue("john")("age")(19); // okay
object.setValue("alien")("height")("pretty tall"); // error!
// "pretty tall" isn't numeric --> ~~~~~~~~~~~~~
object.setValue("john")("power")(9000); // error!
// "power" is wrong --> ~~~~~~~
object.setValue("elaine")("name")("elaine"); // error!
// "elaine"? -> ~~~~~~~~

答案 7 :(得分: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"

答案 8 :(得分:0)

如果您想将命令发送到每个会话中每个窗口中的每个窗格,请将其添加到您的 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <section class="wrap"> <ul class="tabs-nav"> <li><a href="#tab11" rel="nofollow">Tab 1</a></li> <li><a href="#tab12" rel="nofollow">Tab 2</a></li> </ul> <div class="tabs-stage"> <div id="tab11" class="tab-content"> <h3>Tab 1 Content</h3> </div> <div id="tab12" class="tab-content"> <h3>Tab 2 Content</h3> </div> </div> </section> <section class="wrap"> <ul class="tabs-nav"> <li><a href="#tab21" rel="nofollow">Tab 1</a></li> <li><a href="#tab22" rel="nofollow">Tab 2</a></li> </ul> <div class="tabs-stage"> <div id="tab21" class="tab-content"> <h3>Tab 1 Content</h3> </div> <div id="tab22" class="tab-content"> <h3>Tab 2 Content</h3> </div> </div> </section> 中:

.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 更改为 "$*",但根据我的经验,这正是您想要的。