Colisão de velocidade em <Esc> O (Inserir em Normal para Inserir nova linha acima do cursor)

16

Freqüentemente, quando estou no modo Inserir, pressiono Escpara entrar no modo Normal e, em seguida, pressiono imediatamente Opara iniciar uma nova linha acima do cursor e entrar no modo Inserir.

Mas quando faço isso, ocorre um atraso de 1 segundo depois que eu clico no botão Oantes de haver qualquer resposta visível. Além disso, se eu começar a digitar o novo texto durante esse 1 segundo de atraso, se o novo texto começa com qualquer um de um certo conjunto de caracteres (por exemplo j, k, m, n, o), eu acabar no meio de alguma outra operação que não fez pretendo, muitas vezes fazendo uma bagunça, momento em que tenho que parar e me mexer com desfazer e refazer até ter certeza de que desfiz o dano.

Para evitar esse desagradável, adquiri o hábito de parar por um segundo depois de cada vez que digito O. Mas isso me deixa mais lento e me impede de ser o demônio vim speed que eu seria.

O que causa isso? Existe uma correção ou solução alternativa?

Don Hatch
fonte

Respostas:

15

Isso acontece apenas no terminal, mas não no GVIM, certo? O motivo é que o Vim não pode distinguir entre as chaves de tipos individuais e uma sequência de escape ANSI iniciando com as mesmas chaves (por exemplo ^[O..., <Esc>seguidas Ono seu caso).

Você pode ler sobre todas as complexidades subjacentes em :help 'timeout'(e nas seguintes opções). Lá você também encontra uma configuração sugerida que alivia o problema:

:set timeout timeoutlen=1000 ttimeoutlen=100
Ingo Karkat
fonte
3
Você também pode usar set noesckeys; isso tem o efeito colateral de desativar as teclas de seta (e talvez algumas outras teclas?) no modo Inserir, portanto, pode não ser para todos.
Martin Tournoij
2
@Carpetsmoker Em relação a "definir noesckeys" ... isso funciona, mas apenas se estiver no modo Inserir. Eu sei que disse que estava no modo Inserir, para começar; no entanto, também costumo <Esc> O iniciando no modo Normal (principalmente quando não tenho 100% de certeza se estou iniciando no modo Inserir ou Normal), portanto, gostaria de algo que funcione também nesse caso.
Don Hatch
1
@DonHatch Você pode usar :nnoremap ^[O O, onde ^[é inserido pressionando <C-v><Esc>(também pode aparecer como <1b>).
Martin Tournoij
5

Como solução alternativa, em vez de ESCO, use Control+ OO. O Control+ Ocoloca você no modo normal de um comando e, em seguida, retorna ao modo de inserção quando isso é feito.

Ross Presser
fonte
1

E se:

Control+C O

Existem algumas sutilezas ao usar o Control+ que Cvocê deve conhecer.

mikeazo
fonte