例如,我想将<End>键绑定为tmux中的前缀键。
这个问题部分回答了我的问题:我将如何将 HOME 键绑定为 tmux 前缀?
我在 Mac OS 10.8 上使用 bash。
我尝试改变
set -g prefix C-a
Run Code Online (Sandbox Code Playgroud)
到
set -g prefix End
Run Code Online (Sandbox Code Playgroud)
但这没有用。的结果tput kend | cat -v ; echo是, (并按 End 键)^[OF的结果是。cat -v^[[F
xterm的风格终端发送两个不同的序列对每个Up,Down,Right,Left,Home,和End。在“普通光标键”模式下,序列以^[[(ESC [)开头;在“应用程序光标键”模式下,序列以^[O(ESC O)开头。的顺序以End结束F,因此它^[[F处于“普通光标键”模式和^[OF“应用程序光标键”模式下。
默认情况下,tmux 1.8 可以识别这两个序列,因此您不需要做任何特殊的事情,tmux 1.8 就可以可靠地识别 xterm 样式Home和End序列(即不需要terminal-overrides下面描述的hack)。
这篇文章的其余部分描述了一种让这些密钥在 1.8 之前的tmux版本中工作的方法。
1.8 之前的tmux版本仅识别End何时看到kend附加终端的 terminfo 条目的功能中提供的序列(当您附加到tmux会话时由 TERM 指定)。默认情况下,tmux将客户端切换到“普通光标键”模式1。这最终意味着tmux将无法识别,End因为终端发送“普通光标键”序列,但tmux只知道“应用程序光标键”序列(来自kend)。
基本上,tmux似乎期望Home并且End不受光标键模式的影响。这种与xterm风格终端的不兼容导致无法正确识别密钥2。
这里有一种漏洞,您可以使用它来验证是否发生了这种情况:在活动窗格中运行tput smkx(或启动Emacs或Vim)。只要该窗格处于活动状态,tmux 就应该识别Home和End。发生这种情况是因为smkx向tmux发送一个序列,导致它发送smkx到客户端(这将客户端切换到“应用程序光标键”模式,该模式发送序列Home并且End该tmux将能够匹配来自khome和kend)。然而,这不是一个很好的解决方法,因为“应用程序”与“正常”状态也将在交互式或全屏程序(例如Emacs和Vim)启动/恢复和退出/挂起时设置和重置。
一个更好的解决方法是使用TMUX的terminal-overrides选项来改变kend(和khome),以‘正常的’序列并删除‘应用光标键’,从变化smkx和rmkx(以防止切换到‘应用光标键’模式,其中Home和End将发送(现在无法识别)序列)。箭头键有特殊支持,因此它们将始终被识别(假设xterm样式序列)。如果您使用TERM=xterm=256color连接到tmux,则可以在 ( ~/.tmux.conf) 中执行此操作:
set-option -ga terminal-overrides ',xterm-256color:kend=\E[F:khome=\E[H:smkx=\E=:rmkx=\E>'
Run Code Online (Sandbox Code Playgroud)
(注意:由于tmux处理 terminfo 条目的方式,您需要xterm-256color在覆盖生效之前断开所有现有客户端的连接。此外,上面使用的smkx和值rmkx假设键盘模式序列是光标键后剩下的全部模式序列已从每个中删除。)
最终,这可能是tmux 中的一个错误。它应该要么
TERM=screen根据窗格是否请求正常或应用程序光标或键盘模式发送适当的序列3。1实际上,它发送 terminfo 功能rmkx(“结束键盘传输模式”),对于xterm类似 terminfo 条目,它会切换到“普通光标键”模式和“普通 kaypad”模式。
2因为^[[F序列不被识别为单个键,所以它最终被处理为两个“键组合”:(^[[ESC [,被视为M-[)和一个普通的 F.
3修订控制历史表明此方法(始终处于键盘传输模式,为每个窗格模拟光标/键盘模式)在过去曾被使用过。我不清楚为什么将其更改为当前行为(活动窗格的跟踪键盘模式);这种方法可能存在一些问题。
| 归档时间: |
|
| 查看次数: |
2121 次 |
| 最近记录: |