Desfazer <CR> no modo de inserção


21

Às vezes, no modo de inserção, eu bato <CR>por engano e tenho que bater no backspace várias vezes (depende do recuo) para voltar aonde estava.

por exemplo

<div>
  <p> This is some text []</p>
</div>

O cursor é []e eu apertei <CR>:

<div>
  <p> This is some text 
  []</p>
</div>

Agora eu tenho que pressionar backspace duas vezes para voltar à linha anterior (esse caso não é tão ruim, mas não tem muito recuo).

Você conhece uma maneira melhor de fazer?


1
ctrl+wduas vezes parece funcionar e ser muito fácil
reergymerej

Respostas:


10

E se:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>irá executar um comando no modo normal ( :left 0), que removerá todo o recuo, isso também colocará o cursor no início da linha. <BS>você voltará para a última linha.

Isto é um pouco como um "para trás J".

Infelizmente, o mapeamento de Shift + Enter ou Ctrl + Enter não parece possível, então eu escolho <C-\>como estando "próximo ao enter".


"Perto do enter" depende do seu teclado: os britânicos têm `` ao lado do turno da mão esquerda :-)
TripeHound

2
Por que não usar em <C-u>vez de <C-o>:left 0<CR>?
jamessan 01/09/2015

@jamessan Isso funciona como um "retrocesso J": Então foo<CR>bar<C-\>, deixamos você com foobar. IMHO é mais útil, mas YMMV.
Martin Tournoij 01/09/2015

Certo, mas o que estou dizendo é que <C-u>(ou seja, i_CTRL-U ) deve ser o mesmo que <C-o>:left 0<CR>.
jamessan 01/09/2015

1
@jamessan Bem, isso depende da posição do cursor. A digitação foo<CR>bar<C-u>deixará você com foo<CR>(+ qualquer recuo automático que o Vim possa ter adicionado). <C-o>:left 0<CR>sempre se comportará da mesma maneira, independentemente da posição do cursor.
Martin Tournoij 01/09/2015

21

Eu tenho isso no meu vimrc, a segunda parte é relevante:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

O que isso faz: sempre que você pressionar Enterno modo de inserção, ele também "interromperá a sequência de desfazer, iniciará uma nova alteração" (consulte h: i_CTRL-G_u). Isso significa que, se você acertar Enterpor engano, agora poderá desfazer sua alteração sem remover as linhas inseridas anteriores, com ESC u aou com Ctrl-o u, conforme proposto pela Statox. Basicamente, cada linha pode ser desfeita separadamente.

fonte

EDIT / UPDATE: Se você usar a emulação Vim no Emacs, também conhecido como modo maligno , poderá usar este pacote para obter um efeito semelhante.


Agora estou curioso sobre a primeira parte e como <c-y>se relaciona com o menu pop-up.
8bittree

2
Veja esta resposta: vi.stackexchange.com/a/3844/1800 . Ctrl-yno modo de inserção, a seleção pop-up atual será concluída e o mapeamento acima permitirá Entera conclusão também.
21715 VanLaser

Bom truque. No entanto, eu provavelmente substituiria a última parte "<c-g>u<cr>"por &paste ? "<cr>" : "<c-g>u<cr>", caso contrário, da próxima vez que você colar por engano 200 linhas de HTML, você se divertirá muito desfazendo-a. :)
lcd047

2
... e a explicação: quando pasteestá
ativado

1
Gosto mais desta solução, porque as outras soluções baseadas em Backspace, Ctrl-W e Ctrl-U podem não funcionar, dependendo de como a backspaceopção está definida.
DoubleDown #

4

O jeito que eu faço é Ctrl-wBackspace.

Ctrl-wpara excluir a última palavra (esqueci se isso é padrão ou não), e como são apenas espaços, isso me levará de volta ao início da linha. Então Backspaceme levará de volta à linha anterior onde eu estava.


Doce, eu não sabia sobre o Ctrl-wuso no modo de inserção. Mas o Carpetsmoker ♦ ainda é mais rápido. Portanto, a ligação padrão de `Ctrl- \` não parece tão útil.
nobe4

1
Ctrl + w é "Vim padrão" ;-) Veja: :help i_CTRL-W. E pressioná-lo duas vezes parece fazer o truque também?
Martin Tournoij

1
Eu só vi na página de ajuda que <C-u>pode ser mais útil como ele apaga todos os personagens na nova linha
nobe4

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.