2

比如我想把<End>key绑定为tmux中的prefix key。

这个问题部分回答了我的问题:我将如何将 HOME 键绑定为 tmux 前缀?

我在 Mac OS 10.8 上使用 bash。

我试图改变

set -g prefix C-a 

set -g prefix End

但这没有用。的结果tput kend | cat -v ; echo^[OFcat -v(并按下 End 键)的结果是^[[F

4

1 回答 1

5

xtermUp风格的终端为, Down, Right, Left, Home, 和中的每一个发送两个不同的序列End。在“普通光标键”模式下,序列以^[[(ESC [) 开头;在“应用程序光标键”模式下,序列以^[O(ESC O) 开头。的序列以End结尾F,因此它^[[F处于“普通光标键”模式和^[OF“应用光标键”模式下。

tmux 1.8 默认识别这两个序列,所以你不需要做任何特别的事情让tmux 1.8 可靠地识别 xterm 样式HomeEnd序列(即不需要terminal-overrides下面描述的 hack)。


这篇文章的其余部分描述了一种让这些密钥工作的方法tmux 1.8 之前的版本。


1.8 之前的tmux版本仅End在看到kend附加终端的 terminfo 条目的功能中提供的序列时识别(附加到tmux会话时由 TERM 指定)。默认情况下,tmux将客户端切换到“普通光标键”模式1。这最终意味着tmux将无法识别End,因为终端发送“普通光标键”序列,但tmux只知道“应用程序光标键”序列(来自kend)。

基本上,tmux似乎期望这一点Home并且End不受光标键模式的影响。这种与xterm风格终端的不兼容导致无法正确识别密钥2

这里有一种漏洞,您可以使用它来验证这是否正在发生:在您的活动窗格中运行tput smkx(或启动EmacsVim )。只要该窗格处于活动状态,tmux就应该识别HomeEnd. 发生这种情况是因为向tmuxsmkx发送一个序列,导致它发送到客户端(这会将客户端切换到“应用程序光标键”模式,该模式发送序列,并且tmux能够与来自和的序列匹配)smkxHomeEndkhomekend)。然而,这不是一个很好的解决方法,因为“应用程序”与“正常”状态也会在交互式或全屏程序(例如EmacsVim)启动/恢复和退出/挂起时设置和重置。

更好的解决方法是使用tmuxterminal-overrides选项将kend(and ) 更改为“正常”序列,并从andkhome中删除“应用程序光标键”更改(以防止切换到“应用程序光标键”模式,并将发送 (现在无法识别)序列)。箭头键具有特殊的支持,因此它们将始终被识别(假设xterm样式序列)。如果您用于连接到tmux,您可以在 ( ) 中执行此操作:smkxrmkxHomeEndTERM=xterm=256color~/.tmux.conf

set-option -ga terminal-overrides ',xterm-256color:kend=\E[F:khome=\E[H:smkx=\E=:rmkx=\E>'

(注意:由于tmux处理 terminfo 条目的方式,您需要xterm-256color在覆盖生效之前断开所有现有客户端的连接。此外,上面使用的smkx和的值rmkx假设键盘模式序列是光标键后剩下的全部模式序列已从每个中删除。)

最终,这可能是tmux中的一个错误。它可能应该要么

  • 包括HomeEnd箭头键用于识别正常模式和应用程序模式序列的特殊支持,或
  • 始终将客户端置于“键盘传输”模式,并TERM=screen根据窗格是否请求正常或应用程序光标或键盘模式3发送适当的序列。

1实际上,它发送 terminfo 功能rmkx(“结束键盘传输模式”),该功能 - 对于xterm类似 terminfo 条目 - 切换到“普通光标键”模式“普通 kaypad”模式。
2由于^[[F序列不被识别为单个键,它最终被处理为两个“组合键”:^[[(ESC [,被视为M-[)和一个普通的 F.
3修订控制历史表明这种方法(始终处于键盘传输模式,模拟每个窗格的光标/键盘模式)在过去的某个时间点使用过。我不清楚为什么将其更改为当前行为(活动窗格的跟踪键盘模式);这种方法可能存在一些问题。

于 2013-03-05T08:19:50.890 回答