在zsh的vi仿真中逃避不是幂等的?


6

我有zsh配置为使用vi keybindings。我注意到了一些“逃避”的意外行为。在vim(我没有测试过香草vi)如果我两次点击逃生,我可以点击'i'一次返回插入模式。在zsh如果我碰巧遇到逃生两次,点击'我'不会让我回到插入模式,我必须打两次。另一个例子是导航。如果我点击一次逃脱,我可以按预期使用'^'和'$'。但是,如果我不小心碰到了两次(或更多)逃生,他们将无法工作,直到我返回插入模式并再次逃脱。

我是否以某种方式将zsh配置错误,或者这只是zsh vi仿真中的已知差异?

Answers:


3

我也明白了。以前没有注意到它,因为我通常在我的shell中使用emacs绑定。似乎使用默认绑定,在vicmd模式下使用转义键会占用下一个字符。这似乎可能是处理未定义键的错误。

我能够通过使用以下方法在vicmd模式中为转义键定义noop绑定来解决此问题:

noop () { }
zle -N noop
bindkey -M vicmd '\e' noop

谢谢!我有点期待我可以通过在vicmd模式下绑定escape来做某事,但不确定这里是否还有其他事情发生。我很惊讶其他用户没有提出问题。也许我对一个vi用户太过心不在焉,一直在逃避。
user1063042

这一直困扰着我好几天,谢谢!
cchamberlain 2015年

2

我在这里没有足够的声誉来回复qqx的答案,所以我只需要提交一份单独的答案:

这不是一个bug; 会发生以下情况:第一次按ESC时,从vi插入模式切换到vi命令模式(显然)。然后在vi命令模式下再次按ESC键。问题是,默认情况下,ESC在命令模式下没有绑定任何东西,但是,有一些以ESC开头的多键小部件绑定 - 特别是由箭头键发送的控制序列。

因此,如果你在vi命令模式下按ESC,ZLE就会坐在那里等待小部件的第二次击键。这就是为什么,如果你点击'i'(或任何角色),它会被ZLE默默地消耗掉。

答案是将ESC绑定到任何东西 - 任何东西 - 在vi命令模式下,正如qqx在他的回答中所述。


0

这似乎不是zsh 5.6.2的问题。

需要考虑的事情是设置KEYTIMEOUT=1在你的~/.zshrc

KEYTIMEOUT

shell在等待读取绑定的多字符序列时按下另一个键的时间(以百分之一秒为单位)。

请参阅zsh PARAMETERS文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.