Por que o texto inserido anteriormente é redefinido após o uso de uma tecla de seta?

7

Da ajuda :help i_ctrl-a:

CTRL-A      Insert previously inserted text.  {not in Vi}

Digamos que eu tenho um buffer vazio e estou no modo normal.
Eu digito ipara entrar no modo de inserção.
Digito (), movo o cursor um caractere para a esquerda pressionando <C-h>(que mapeei <left>no modo de inserção), digito fooe volto ao modo normal pressionando escape.

O buffer contém: (foo)
pensei, erroneamente, que o texto inserido anteriormente seria, (foo)mas não é.
O texto inserido anteriormente é apenas o fooque pode ser verificado digitando :registers .ou pressionando <C-a>novamente no modo de inserção.

Por que pressionar uma tecla de seta redefine o texto inserido anteriormente?
Existe uma maneira de fazer com que o registrador de pontos armazene todo o texto que foi inserido na última vez em que entrei no modo de inserção, mesmo pressionando uma tecla de seta?

saginaw
fonte

Respostas:

6

No modo de inserção, a tecla de seta esquerda realmente sai do modo de inserção, move o cursor e entra novamente no modo de inserção. Isso divide sua alteração em duas alterações: inserção ()e inserção foo. Esse comportamento é discutido em

:help ins-special-special

A solução é remapear a tecla de seta esquerda para incluir CTRL-G U. É difícil encontrar o exemplo no manual de referência do Vim porque não está diretamente marcado. Primeiro vá para

:help i_CTRL-G_U

então role para baixo 42 linhas até "Um exemplo para usar CTRL-G U:" Para a tecla de seta esquerda, use este mapeamento:

inoremap <Left> <C-G>U<Left>

Parece funcionar, mas a exibição do .registro pelo :registerscomando parece estranha depois de executar o seu (foo)exemplo. Na minha máquina Windows, fica assim:

".  ()^GU<80>klfoo
garyjohn
fonte
11
Muito obrigado ! Isso me incomodava há muito tempo e nunca encontrei a solução. Eu modifiquei meu vimrc com inoremap <C-h> <C-g>U<Left>e inoremap <C-l> <C-g>U<Right>e sua solução funciona perfeitamente! A propósito, na minha máquina Linux, eu tenho a mesma saída estranha que você para o :registerscomando, por isso não vem do Windows.
Saginaw
2
<c-g>Uveio com um patch recente. Isso pode explicar por que você perdeu isso até agora.
Luc Hermitte
Você acha que há uma maneira de fazê-lo funcionar com Ctrl + Direita / Esquerda também? Tentei mapeamentos análogos, mas eles não parecem funcionar.
Patryk Czachurski