比如我想把<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
是^[OF
,cat -v
(并按下 End 键)的结果是^[[F
。
比如我想把<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
是^[OF
,cat -v
(并按下 End 键)的结果是^[[F
。
xtermUp风格的终端为, 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)。
这篇文章的其余部分描述了一种让这些密钥工作的方法tmux 1.8 之前的版本。
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. 发生这种情况是因为向tmuxsmkx
发送一个序列,导致它发送到客户端(这会将客户端切换到“应用程序光标键”模式,该模式发送序列,并且tmux将能够与来自和的序列匹配)smkx
HomeEndkhome
kend
)。然而,这不是一个很好的解决方法,因为“应用程序”与“正常”状态也会在交互式或全屏程序(例如Emacs和Vim)启动/恢复和退出/挂起时设置和重置。
更好的解决方法是使用tmux的terminal-overrides
选项将kend
(and ) 更改为“正常”序列,并从andkhome
中删除“应用程序光标键”更改(以防止切换到“应用程序光标键”模式,并将发送 (现在无法识别)序列)。箭头键具有特殊的支持,因此它们将始终被识别(假设xterm样式序列)。如果您用于连接到tmux,您可以在 ( ) 中执行此操作:smkx
rmkx
HomeEndTERM=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中的一个错误。它可能应该要么
TERM=screen
根据窗格是否请求正常或应用程序光标或键盘模式3发送适当的序列。1实际上,它发送 terminfo 功能rmkx
(“结束键盘传输模式”),该功能 - 对于xterm
类似 terminfo 条目 - 切换到“普通光标键”模式和“普通 kaypad”模式。
2由于^[[F
序列不被识别为单个键,它最终被处理为两个“组合键”:^[[
(ESC [
,被视为M-[
)和一个普通的 F
.
3修订控制历史表明这种方法(始终处于键盘传输模式,模拟每个窗格的光标/键盘模式)在过去的某个时间点使用过。我不清楚为什么将其更改为当前行为(活动窗格的跟踪键盘模式);这种方法可能存在一些问题。