在tmux中,如何将<end>和<home>键绑定到其他函数?</home> </end>

时间:2013-03-04 06:13:09

标签: macos tmux

例如,我想将<End>键绑定为tmux中的前缀键。

这个问题部分回答了我的问题:How would I go about binding the HOME key as a tmux prefix?

我在Mac OS 10.8上使用bash。

我试图改变

set -g prefix C-a 

set -g prefix End

但这不起作用。 tput kend | cat -v ; echo的结果为^[OFcat -v(并按结束键)的结果为^[[F

1 个答案:

答案 0 :(得分:4)

xterm 式终端为每个 Up Down Right 左,主页结束。在“正常光标键”模式下,序列以^[[开头(ESC [);在“应用程序光标键”模式下,序列以^[O(ESC O)开头。 End 的序列以F结尾,因此在“正常光标键”模式下为^[[F,在“应用程序光标键”模式下为^[OF

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


本文的其余部分介绍了使这些密钥在1.8之前的 tmux 版本工作的方法。


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

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

这里有一种循环漏洞可用于验证是否发生这种情况:运行tput smkx(或启动 Emacs Vim )在您的活动窗格中。只要该窗格处于活动状态, tmux 就应该识别 Home End 。发生这种情况是因为smkx tmux 发送一个序列,导致它向客户端发送smkx(将客户端切换到“应用程序光标键”模式,该模式发送序列为 tmux Home End 将能够与来自khomekend的序列进行匹配。然而,这不是一个非常好的解决方法,因为“应用程序”与“正常”状态也将通过交互式或全屏程序设置和重置(例如 Emacs Vim < / em>)当他们开始/恢复并退出/暂停时。

更好的解决方法是使用 tmux terminal-overrides选项将kend(和khome)更改为“正常”序列并删除“应用程序光标键“从smkxrmkx更改(以防止切换到”应用程序光标键“模式,其中 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>'

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

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

  • 包含 Home End 在箭头键识别正常模式和应用程序模式序列的特殊支持中,或
  • 始终将客户端终端置于“键盘发送”模式,并根据窗格是否请求正常或应用程序光标或键盘模式 3 发送rmkx的相应序列。 / LI>

1 实际上,它发送terminfo功能TERM=screen(“结束键盘传输模式”),对于rmkx - 像terminfo条目 - 切换到“正常游标”键“模式”正常的kaypad“模式 2 由于xterm序列未被识别为单个密钥,因此最终会被处理为两个“密钥组合”:^[[F(ESC ^[[,其中被视为[)和普通M-[ 3 修订控制历史记录表明此方法(始终处于键盘传输模式,模拟每个窗格的光标/键盘模式)在过去的某个点使用。我不清楚为什么它被改为当前行为(活动窗格的轨道键盘模式);这种方法可能存在一些问题。