理解键绑定的问题

Pav*_*rin 2 keyboard-shortcuts zsh escape-characters

我有一个设置和一个 zsh 会话

~ bindkey | grep help    
"^[H" run-help
"^[h" run-help
Run Code Online (Sandbox Code Playgroud)

为什么当我按下 "Control + [ + h" 光标下的单词会被删除而什么也没有发生,但如果我按下 "Alt + h" 手册页会正确打开?

Ada*_*hon 8

尝试按Control+[紧跟h.

终端不会将按键直接发送到外壳(如Control按下/释放)。相反,终端根据按下的键发送字符序列。序列中的键将被按下 - 好吧 - 依次按下,而不是一次按下。最大的例外是Control-keys 和Alt-keys,它们与其他键同时按下以创建特定序列。

正如您已经知道/注意到^的那样用作 -Control键的符号,但它仅与以下字符结合使用时才具有此含义。^A装置Control+aControl+ A,密钥序列用于与组合大写和小写字符相同的Control(这也是为什么终端经常使用的原因Control+ Shift+SOMEKEY为自己的,而不是外壳相关的快捷方式)。

^[字面意思是Control+ [。它也是由Escape. 所以^[a意味着Control+[后跟a(小写!)。此外,Alt-key 还发送^[序列,然后是按下它的键。所以Alt+a也发送^[a. Alt+ Shift+a发送^[A.


因此,对于您的示例,您可以按其中任何一个('+' 表示“同时”,',' 表示“按顺序”):

  • 为了 ^[h
    • Alt+h
    • Escape,h
    • Control+ [,h
  • 为了 ^[H
    • Control+ [, Shift+h
    • Alt+ Shift+h
    • Escape, Shift+h

特殊键喜欢PgUpBackspaceReturnKP_Enter也发送键序列。这些通常取决于终端模拟器。您可以使用quoted-insertvi-quoted-insert小部件来显示按键顺序。默认情况下,它们绑定到^V各自的模式。因此,按Control+v后跟有问题的组合键将显示您可以使用的序列bindkey。因为termite在我的机器上我得到:

  • PgUp: ^[[5~, 这也是Control+ [, [, 5,~Escape, [, 5,~Alt+ [, 5,~
  • Backspace: ^?, 这也是Control+?
  • Return: ^M, 这也是Control+m
  • KP_Enter: ^[OM, 这也是Control+ [, Shift+ o, Shift+mAlt+ Shift+ o, Shift+m

理论上,密钥序列可以是任意长和复杂的。例如:

bindkey '^[xfooba^r' run-help
Run Code Online (Sandbox Code Playgroud)

Alt+ x, f, o, o, b, a, Control+r将运行run-help小部件。

有一点限制,因为zsh在接受多字符序列之前,只等待另一个字符的特定时间。这个超时可以在KEYTIMEOUT参数中配置,以百分之几秒为单位。默认为40,因此为 0.4 秒。