与键序列的绑定

xge*_*ged 5 keymapping tmux

Tmux是否支持像Vim那样的键序列的键绑定(例如bind-key ab kill-pane)?或者我怎么能效仿呢?

Dro*_*roj 6

我正在使用 tmux 2.3。

您可以通过定义自己的密钥表并将它们链接在一起来模拟密钥序列。

例如,如果我想<C-q>x做某事,我将 'x' 的绑定放入密钥表“my-keys”中,然后使用switch-client(Cq)绑定激活该密钥表的密钥:

bind-key -Tmy-keys x send-keys "my binding"

# Multi-key prefix for custom bindings
bind-key -Troot C-q switch-client -Tmy-keys
Run Code Online (Sandbox Code Playgroud)

注意:我从 Cq 开始,因为它似乎与命令行和 Vim 的冲突最少。

因此,现在您可以使用带有 Cq 前缀的每个键。

如果您想要序列中的更多键,请添加另一个间接级别:

bind-key -Tmy-keys x send-keys "my binding"

# Pane (i.e. 'W'indow commands like Vim with C-w)
bind-key -Tmy-keys-window-ctl s swap-pane
bind-key -Tmy-keys C-w switch-client -T my-keys-window-ctl

# Multi-key prefix for custom bindings
bind-key -Troot C-q switch-client -Tmy-keys
Run Code Online (Sandbox Code Playgroud)

所以,现在我必须swap-pane<C-q><C-w>s.

这有效,因为

  1. <C-q> 激活“my-keys”密钥表,
  2. 具有约束力<C-w>
  3. 激活“my-keys-window-ctl”密钥表
  4. 它具有s要调用的绑定swap-pane


小智 5

Tmux仅支持单字符键绑定(不幸的是)。

因此,仅此:

bind-key a kill-pane
Run Code Online (Sandbox Code Playgroud)

或这个:

bind-key b kill-pane
Run Code Online (Sandbox Code Playgroud)

请注意,这与例如C-a(Ctrl-a)或M-a(Alt-a)不同。

即使我们的用户使用多个字符编写代码,甚至必须按2个键来调用它们,但Ctrl-a和Alt-a实际上都是tmux的单个字符(据我所知)。

另类

...可能不是您所期望的,但是这里是:

# in .tmux.conf
bind a command-prompt -p "pressed a" "run '~/my_script %%'"
Run Code Online (Sandbox Code Playgroud)

和示例my_script文件:

#!/bin/bash

case "$1" in
  b)
    tmux kill-pane
    ;;
  c)
    tmux kill-window
    ;;
esac
Run Code Online (Sandbox Code Playgroud)

现在,在重新加载tmux.conf并按之后,prefix + a您将得到一个tmux提示符,提示“按下a”。

继续并按bEntertmux kill-pane从脚本将执行。

同样,如果您按prefix + a + cEnter您将从脚本中执行另一个选项。

这种模仿Enter在最后添加密钥来模仿您想要的内容。

另外,提供的脚本是可扩展的,因此您可以添加更多的“绑定”来获取prefix + a + d + Enter等。