Fuga non idempotente nell'emulazione vi di zsh?

Ho zsh configurato per utilizzare il legame a vi. Ho notato un comportmento imprevisto con "fuga". In vim (non ho testato la vaniglia vi) se mi ha colpito due volte la fuga, posso colpire 'i' una volta per tornare alla modalità di inserimento. In zsh se capisco di fuggire due volte, colpendo 'i' non mi restituirà per inserire la modalità, devo batterla due volte. Un altro esempio di questo viene in navigazione. Se faccio una fuga una volta, posso usare '^' e '$' come previsto. Ma se ho accidentalmente colpito due volte (o più) di fuga, non funzionano finché non return a inserire la modalità e scappa nuovamente.

Devo in qualche modo configurare erroneamente zsh, o questa è solo una differenza nota nell'emulazione di zsh?

Lo ottengo pure. Non l'avevo notato prima, dato che generalmente uso i legami di emacs nel mio guscio. Sembra che con i bindings predefiniti, utilizzando il tasto di escape in modalità vicmd mangia il carattere successivo. Questo sembra essere un bug nella gestione di chiavi non definite.

Ho potuto aggirare questo problema definendo un legame di noop per la chiave di fuga in modalità vicmd utilizzando:

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

Non ho abbastanza reputazione qui per rispondere alla risposta di qqx, quindi dovrò solo presentare una risposta separata:

Non è un bug; ciò che accade è il seguente: Quando si colpisce ESC la prima volta, si passa dalla modalità di inserimento vi alla modalità di command vi (ovviamente). Poi si preme nuovamente ESC in modalità command vi. Il problema è che, per impostazione predefinita, ESC non è legato a nulla in modalità di command, tuttavia , ci sono widget multi-chiave che iniziano con ESC che sono vincolati – in particolare, le sequenze di controllo inviate dai tasti freccia.

Quindi, se si colpisce ESC in modalità di command vi, ZLE siede in attesa della seconda battuta del widget. Ecco perché, se si colpisce 'i' (o qualsiasi carattere), viene consumato in silenzio da ZLE.

La risposta è quella di bind ESC a qualcosa – qualsiasi cosa – nel modo di command vi, esattamente come qqx ha dichiarato nella sua risposta.