![如何避免 zsh 键绑定中的冲突?](https://linux22.com/image/1567761/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%20zsh%20%E9%94%AE%E7%BB%91%E5%AE%9A%E4%B8%AD%E7%9A%84%E5%86%B2%E7%AA%81%EF%BC%9F.png)
我想CtrlgCtrlb在 zsh 中绑定一个函数。
gb-widget() { echo "geebee" }
zle -N gb-widget
bindkey '^G^B' gb-widget
这不适用于CtrlgCtrlb,但可以与其他任意键绑定一起使用(CtrlgCtrlx例如 )。也许问题是Ctrlb已经别名为backward-char
:
$ bindkey | grep -F '^B'
"^B" backward-char
"^G^B" gb-widget
但我想保留 emacsCtrlb绑定。有什么方法可以实现吗?
答案1
该问题有时有效/有时无效的原因可能是由于$KEYTIMEOUT
。
当您按下当前键盘映射中绑定的多字符序列中的一个键时,zsh 会等待$KEYTIMEOUT
几毫秒,以便您按下第二个键。默认情况下,该值设置为 40。这已记录在案在 zsh 手册中。
因此,如果您按下^G
,您有 40 毫秒的时间来按下^B
,否则两次按键将被解释为单独输入,而不是一个序列的一部分。
您显然可以改变的值$KEYTIMEOUT
,例如使其更长,以便您有更多的时间按下第二个键。
(请注意,这可能会产生连锁反应,例如,如果您处于 vi 插入模式并尝试按下ESC进入 vi 命令模式,则 shell 将等待$KEYTIMEOUT
几毫秒,因为有以 开头的多字符键绑定ESC- 尤其是箭头键!)