将 tmux 键绑定到多个命令

将 tmux 键绑定到多个命令

我启动了多窗格 tmux 窗口来监控多个服务器参数。使用 Ctrl-S,我可以使用另一个监控命令打开一个新窗口。

现在我想绑定 Ctrl-Q 来打开另一个多窗格带有多个显示器的窗口。如何将一个键绑定到多个命令?我尝试将它们与 ; 和 \; 链接起来 - 没有任何帮助。请告诉我应该使用什么来代替...以下。

当我打开一个新窗口时,是否可以暂停与其重叠的后台命令?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

答案1

Todd Freed 是对的,实现此目的的“正确”方法是使用\;。 有点。 但有一个问题。

你看,你通过给 tmux 连接符来连接一系列 tmux 命令;。因此,在由 tmux 提供的文件中,你可能会说

new-session "monitor1" ; split-window -v "monitor2"

tmux如果出于某种原因,您希望将所有内容放在一行中。现在,您也可以从 shell 中将该单行复合语句提供给命令必须;进行转义,以便 shell 将其解释为 的另一个参数tmux。因此,shell 中与上述等价的是

$ tmux new-session "monitor1" \; split-window -v "monitor2"

类似地,tmuxbind-key命令接受一系列参数,这些参数是 tmux 命令和按下键时要运行的参数。如果你想C-q从 tmux 源文件中绑定到上述序列,你可以这样说

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

在这里我们逃脱了; 来自 tmux,这样 tmux 就不会将其解释为命令的结束bind-key,而是作为另一个参数来bind-key告诉它形成一个复合命令作为C-q键的绑定值。

那么当我们想让 tmux 从 shell 执行此操作时会发生什么?大量的转义。

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

首先,我们必须逃离\ 每个;来自,导致 shell 将这两个字符\;作为参数传递给tmux。然后这会;从 tmux 中退出,导致它将整个复合语句指定为 的绑定C-q


现在,综上所述,如果您反复使用像这样的复杂 tmux 设置,我建议您创建一个 tmux 文件来保存它:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

进而:

$ tmux source split-windows.tmux  # (or even make an alias for this)

这样维护起来就容易得多。

答案2

所以真正的答案是:用反斜杠和分号来链接命令。

bind-key C send-keys foo \; send-keys bar

你可以把它放在你的 tmux.conf 中,或者从 tmux “:”提示符运行

答案3

您可以使用一个小的解决方法来做到这一点。与建议运行脚本的答案类似(这可以很好地处理您的情况),通常可以使用“run-shell”并调用 tmux 本身作为 shell 命令来完成。

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

它将发送“xyz”键,tmux“clear-history”命令,然后调用内置的“clear”shell。

整个字符串只是一个多个 shell 命令序列。

答案4

您可以在文件的键绑定中添加类似这样的内容.tmux.conf

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

tmux-new-session.sh可以拥有:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

相关内容