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" 手册页会正确打开?
尝试按Control+[紧跟h.
终端不会将按键直接发送到外壳(如Control按下/释放)。相反,终端根据按下的键发送字符序列。序列中的键将被按下 - 好吧 - 依次按下,而不是一次按下。最大的例外是Control-keys 和Alt-keys,它们与其他键同时按下以创建特定序列。
正如您已经知道/注意到^
的那样用作 -Control键的符号,但它仅与以下字符结合使用时才具有此含义。^A
装置Control+a或Control+ A,密钥序列用于与组合大写和小写字符相同的Control(这也是为什么终端经常使用的原因Control+ Shift+SOMEKEY为自己的,而不是外壳相关的快捷方式)。
^[
字面意思是Control+ [。它也是由Escape. 所以^[a
意味着Control+[后跟a(小写!)。此外,Alt-key 还发送^[
序列,然后是按下它的键。所以Alt+a也发送^[a
. Alt+ Shift+a发送^[A
.
因此,对于您的示例,您可以按其中任何一个('+' 表示“同时”,',' 表示“按顺序”):
^[h
^[H
特殊键喜欢PgUp,Backspace,Return或KP_Enter也发送键序列。这些通常取决于终端模拟器。您可以使用quoted-insert
或vi-quoted-insert
小部件来显示按键顺序。默认情况下,它们绑定到^V
各自的模式。因此,按Control+v后跟有问题的组合键将显示您可以使用的序列bindkey
。因为termite
在我的机器上我得到:
^[[5~
, 这也是Control+ [, [, 5,~或Escape, [, 5,~或Alt+ [, 5,~^?
, 这也是Control+?^M
, 这也是Control+m^[OM
, 这也是Control+ [, Shift+ o, Shift+m或Alt+ 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 秒。