理解键绑定的问题

理解键绑定的问题

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

~ bindkey | grep help    
"^[H" run-help
"^[h" run-help

为什么当我按“Control + [ + h”时,光标下的单词会被删除并且没有任何反应,但如果我按“Alt + h”,手册页会正确打开?

答案1

尝试按Control+ ,[然后立即按h

终端不会将按键直接发送到 shell(如Control按下/释放)。相反,终端根据按下的键发送字符序列。顺序中的按键要按顺序按下,而不是同时按下。最大的例外是Control- 键以及Alt与其他键同时按下以创建特定序列的 - 键。

正如您已经知道/注意到的那样^,它用作Control-key 的符号,但它仅与以下字符结合使用时才具有此含义。^A表示Control+aControl+ A,大小写字符组合的键顺序相同(这也是终端经常使用+ +作为自己的快捷键而不是与 shell 相关的快捷键的Control原因)。ControlShiftSOMEKEY

^[字面意思是Control+ [。也是由 发送的Escape。所以^[a表示Control+[后面跟着a(小写!)。此外,Alt-键还发送^[序列,后跟按下的键。所以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+ oShift+mAlt+ Shift+ oShift+m

理论上,按键序列可以是任意长且复杂的。例如:

bindkey '^[xfooba^r' run-help

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

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

答案2

^[实际上意味着转义符。检查这里:https://en.wikipedia.org/wiki/ASCII

在您的情况下,您的 ALT 键似乎是 Escape 键的同义词: https://en.wikipedia.org/wiki/Alt_key

相关内容