我有一个设置和一个 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+a或Control+ 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
特殊键如PgUp、Backspace、Return或KP_Enter也发送键序列。这些通常取决于终端仿真器。您可以使用quoted-insert
或vi-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+m或Alt+ Shift+ o、Shift+m
理论上,按键序列可以是任意长且复杂的。例如:
bindkey '^[xfooba^r' run-help
Alt+ x, f, o, o, b, a, Control+r将运行run-help
小部件。
有一点限制,因为zsh
在接受多字符序列之前,只等待另一个字符一定时间。该超时可以在参数中配置,KEYTIMEOUT
以百分之一秒为单位。默认值为40
0.4 秒。
答案2
^[
实际上意味着转义符。检查这里:https://en.wikipedia.org/wiki/ASCII
在您的情况下,您的 ALT 键似乎是 Escape 键的同义词: https://en.wikipedia.org/wiki/Alt_key