有没有办法自定义 tmux 的“选择模式”中的按键?

有没有办法自定义 tmux 的“选择模式”中的按键?

tmux 的手册

      -   Choose mode, which allows an item to be chosen from a
          list.  This may be a client, a session or window or pane,
          or a buffer.  This mode is entered with the
          choose-buffer, choose-client and choose-tree commands.

如果我们看一下choose-tree命令:

The following keys may be used in tree mode:

                   Key    Function
                   Enter  Choose selected item
                   Up     Select previous item
                   Down   Select next item
                   +      Expand selected item
                   -      Collapse selected item
                   M-+    Expand all items
                   M--    Collapse all items
                   x      Kill selected item
                   X      Kill tagged items
                   <      Scroll list of previews left
                   >      Scroll list of previews right
                   C-s    Search by name
                   m      Set the marked pane
                   M      Clear the marked pane
                   n      Repeat last search
                   t      Toggle if item is tagged
                   T      Tag no items
                   C-t    Tag all items
                   :      Run a command for each tagged item
                   f      Enter a format to filter items
                   H      Jump to the starting pane
                   O      Change sort field
                   r      Reverse sort order
                   v      Toggle preview
                   q      Exit mode

具体来说,我还想绑定C-cExit mode,就像q现在一样。

与复制模式、复制模式-vi 和 root 不同,这种所谓的“选择模式”没有密钥表。那么这可能吗?

答案1

具体来说,我还想绑定C-cExit mode,就像q现在一样。

看来在某种模式(copy-mode* 除外)下root,密钥表是相关的;加上特定于模式的键(就像您在问题中引用的那样),但root首先应用键表。

这意味着如果我们将root键表转换C-cq模式中的when,那么模式将对我们的Ctrl+做出反应c,就像它对 的反应一样q

我们可以有条件地转换C-cq。这是一行~/.tmux.conf

bind-key -T root C-c if-shell -F '#{==:#{pane_mode},tree-mode}' 'send-keys q' 'send-keys C-c'

请记住,该文件是在 tmux 服务器启动时解析的。为了影响我们已经运行的服务器,我们需要将命令传递给 tmux(例如,tmux bind-key …在 tmux 内的 shell 中)或重新加载更改后的文件 ( prefix:source-file ~/.tmux.confEnter)。

Ctrl+后c,绑定将检测当前窗格是否位于tree-mode( -F '#{==:#{pane_mode},tree-mode}') 中。如果是,则发送q( send-keys q);如果不是,它会发送C-c( send-keys C-c),因为我们不想在不在该模式下时失去Ctrl+的功能。c

要了解另一种模式的正式名称,我们可以这样做:

  1. 在窗格中的 shell 中,我们调用echo "$TMUX_PANE".假设输出是%0.
  2. 我们将窗格置于所需的模式。
  3. 在另一个窗格的 shell 中,我们调用tmux display-message -t %0 -p '#{pane_mode}',其中%0是步骤 1 的输出。

我已经确定了view-modetree-modeclient-modebuffer-modeoptions-modeclock-modecopy-mode这在您的问题的上下文中很突出,请参阅脚注*)。可能还有其他人。

为了检测多种模式,我们需要一些逻辑。例子:

bind-key -T root C-c if-shell -F '#{m/r:(tree|client|buffer)-mode,#{pane_mode}}' 'send-keys q' 'send-keys C-c'

如果我们想转换C-cq所有模式*,我们可以使用以下行:

bind-key -T root C-c if-shell -F '#{pane_in_mode}' 'send-keys q' 'send-keys C-c'

* 对于关键copy-moderoot( -T root) 似乎无关紧要。正如您所注意到的,复制模式中使用了单独的表copy-mode(或)。copy-mode-vi

相关内容