Escape não é idempotente na emulação do zsh?

6

Eu configurei o zsh para usar o vi keybindings. Eu notei algum comportamento inesperado com "escape". No vim (eu não testei vanilla vi) se eu acertar o escape duas vezes, eu posso acertar 'i' uma vez para retornar ao modo de inserção. Em zsh, se acontecer de eu acertar o escape duas vezes, apertar 'i' não me retornará ao modo de inserção, eu tenho que acertar duas vezes. Outro exemplo disso surge na navegação. Se eu acertar a fuga uma vez, posso usar '^' e '$' como esperado. Mas se eu acidentalmente acertar escapar duas vezes (ou mais) eles não funcionam até eu voltar ao modo de inserção e escapar novamente.

De alguma forma eu tenho o zsh configurado incorretamente, ou isso é apenas uma diferença conhecida na emulação do zsh?

    
por user1063042 07.12.2012 / 23:29

3 respostas

3

Eu também entendo isso. Não tinha notado isso antes, já que geralmente uso bindings do emacs no meu shell. Parece que com as ligações padrão, usando a chave de escape no modo vicmd come o próximo caractere. Isso parece ser um bug no tratamento de chaves indefinidas.

Consegui resolver esse problema definindo uma ligação noop para a chave de escape no modo vicmd usando:

noop () { }
zle -N noop
bindkey -M vicmd '\e' noop
    
por 08.12.2012 / 02:31
2

Eu não tenho reputação suficiente aqui para responder a resposta do qqx, então vou ter que apresentar uma resposta separada:

Não é um erro; O que acontece é o seguinte: Quando você apertar ESC pela primeira vez, você passa do modo de inserção vi para o modo de comando vi (obviamente). Então você apertar ESC novamente no modo de comando vi. O problema é que, por padrão, ESC não está vinculado a nada no modo de comando, no entanto, existem widgets multi-chave começando com ESC que são ligados - notavelmente, o seqüências de controle enviadas pelas teclas de seta.

Portanto, se você pressionar ESC no modo de comando do VI, o ZLE permanecerá aguardando o segundo pressionamento de tecla do widget. É por isso que, se você acertar 'i' (ou qualquer personagem), ele será silenciosamente consumido pelo ZLE.

A resposta é ligar o ESC a algo - qualquer coisa - no modo de comando do VI, exatamente como o qqx afirmou em sua resposta.

    
por 20.09.2013 / 23:14
0

Isto não parece ser um problema com o zsh 5.6.2.

Algo a considerar seria definir KEYTIMEOUT=1 no seu ~/.zshrc .

KEYTIMEOUT

The time the shell waits, in hundredths of seconds, for another key to be pressed when reading bound multi-character sequences.

Veja a documentação do zsh PARAMETERS

    
por 09.11.2018 / 04:09

Tags