将tmux密钥绑定到多个命令


37

我启动多窗格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 "..."

Answers:


37

Todd Freed是正确的,执行此操作的“正确”方法是使用\;。有点。但是有一个障碍。

您会看到,通过给tmux连词,将一系列tmux命令连接在一起;。因此,在tmux来源的文件中,您可能会说

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

如果出于某种原因,您希望所有这些都在一条线上。现在,你可以给一个行复合语句的tmux命令从外壳也不过;必须进行转义,这样shell将其解释为另有说法为tmux。因此,上面的内容等效于shell

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

同样,tmux bind-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"

首先,我们必须逃脱\ ,并;每一个从外壳,使得外壳的两个字符传递\;作为参数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)

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


3
要使从命令行中的多个命令的绑定键看起来不那么恐怖,您还可以使用字符串转义\;$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap 2013年

12

因此,真正的答案是:用反斜杠将命令链接起来,后跟一个分号。

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

您可以将其放在tmux.conf中,或从tmux“:”提示符下运行


这很棒,可以使用嵌套的tmux会话并在嵌套的tmux窗口中导航。
保罗

1
这并没有从shell命令行工作。即`tmux绑定键C发送键foo \; 发送密钥条”具有约束力的效果‘立即富’到‘C’,但打印‘栏’。
Lqueryvg

是的,您可以在tmux中运行它。更新以澄清。
托德

太好了!这完全有效...更多谢谢!
布拉德·帕克斯

注意:内的单引号不需要转义
资格

2

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

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

它将发送“ xyz”键,tmux“清除历史记录”命令,然后调用内置的“清除” shell。

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


1

您可以将以下内容添加到.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

1

此处显示的所有内容均无效,因为这

bind q send-keys "command1" \; send-keys "command2"

将立即执行command2,并且q将仅绑定到发送键“ command1”

解决方法如下:

bind R source-file "$HOME/.tmux/reload.tmux"

在文件〜/ .tmux / reload.tmux中,输入多个命令,例如:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1
哦,等等,请使用Peeja所说的(\\\;):-)
lzap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.