我有zsh配置为使用vi keybindings。我注意到了一些“逃避”的意外行为。在vim(我没有测试过香草vi)如果我两次点击逃生,我可以点击'i'一次返回插入模式。在zsh如果我碰巧遇到逃生两次,点击'我'不会让我回到插入模式,我必须打两次。另一个例子是导航。如果我点击一次逃脱,我可以按预期使用'^'和'$'。但是,如果我不小心碰到了两次(或更多)逃生,他们将无法工作,直到我返回插入模式并再次逃脱。
我是否以某种方式将zsh配置错误,或者这只是zsh vi仿真中的已知差异?
我有zsh配置为使用vi keybindings。我注意到了一些“逃避”的意外行为。在vim(我没有测试过香草vi)如果我两次点击逃生,我可以点击'i'一次返回插入模式。在zsh如果我碰巧遇到逃生两次,点击'我'不会让我回到插入模式,我必须打两次。另一个例子是导航。如果我点击一次逃脱,我可以按预期使用'^'和'$'。但是,如果我不小心碰到了两次(或更多)逃生,他们将无法工作,直到我返回插入模式并再次逃脱。
我是否以某种方式将zsh配置错误,或者这只是zsh vi仿真中的已知差异?
Answers:
我也明白了。以前没有注意到它,因为我通常在我的shell中使用emacs绑定。似乎使用默认绑定,在vicmd模式下使用转义键会占用下一个字符。这似乎可能是处理未定义键的错误。
我能够通过使用以下方法在vicmd模式中为转义键定义noop绑定来解决此问题:
noop () { }
zle -N noop
bindkey -M vicmd '\e' noop
我在这里没有足够的声誉来回复qqx的答案,所以我只需要提交一份单独的答案:
这不是一个bug; 会发生以下情况:第一次按ESC时,从vi插入模式切换到vi命令模式(显然)。然后在vi命令模式下再次按ESC键。问题是,默认情况下,ESC在命令模式下没有绑定任何东西,但是,有一些以ESC开头的多键小部件被绑定 - 特别是由箭头键发送的控制序列。
因此,如果你在vi命令模式下按ESC,ZLE就会坐在那里等待小部件的第二次击键。这就是为什么,如果你点击'i'(或任何角色),它会被ZLE默默地消耗掉。
答案是将ESC绑定到任何东西 - 任何东西 - 在vi命令模式下,正如qqx在他的回答中所述。
这似乎不是zsh 5.6.2的问题。
需要考虑的事情是设置KEYTIMEOUT=1
在你的~/.zshrc
。
KEYTIMEOUT
shell在等待读取绑定的多字符序列时按下另一个键的时间(以百分之一秒为单位)。