Como desfazer apenas texto colado no vim?

10

TL; DR; versão - Como desfazer o texto que foi colado no meu buffer de cópia do SO sem desfazer outro texto digitado desde que entrei no modo de inserção?

Descrição mais longa:

  1. Coloque algo no buffer de cópia do SO (por exemplo, destaque algum texto e faça Command-cno Mac)
  2. Entre no modo de inserção no vim ( i)
  3. Digite algo (por exemplo asdf)
  4. Sem sair do modo de inserção, cole do seu buffer de cópia no vim ( Command-vno Mac)
  5. Acertar escape
  6. Tente desfazer a pasta ( u)

Desfaz tudo desde a última vez em que você entrou no modo de inserção. Em outras palavras, ele é limpo asdfe todo o texto em que colei.

Como faço para apenas desfazer o texto que colou em? Preciso sempre sair do modo de inserção e voltar antes de colar o texto apenas para ter a opção de desfazer o texto colado?

Javid Jamae
fonte

Respostas:

4

Uma maneira é explicitamente sair e voltar ao modo de inserção antes da colar. Se você estender os comandos de colagem, também poderá definir automaticamente um ponto de desfazer antes da colagem:

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

O acima é para o i_CTRL-Rcomando interno. Não sei como Command-vé implementado no MacVim, mas o prefixo <C-G>uao :imapcomando deve obter o mesmo efeito.

Ingo Karkat
fonte
1
Funciona como um encanto, obrigado! Eu provavelmente deveria ficar com métodos vim padrão para colar de qualquer maneira.
Javid Jamae
Basta adicionar o seguinte: :h i_CTRL-G_u(por exemplo, "quebrar desfazer sequência, iniciar nova alteração" no modo de inserção).
toraritte
2

No MacVim, você precisa remover o mapeamento do Edit > Pasteitem de menu para substituir o atalho e, em seguida, pode remapear o Cmd-V ( D-vna linguagem MacVim) para o comando apropriado em cada modo. Eu adicionei isso ao meu ~/.gvimrce agora tudo funciona maravilhosamente:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

O <C-g>ué necessário apenas no modo de inserção para corrigir o histórico de desfazer; o noremape cnoremapsão simplesmente para restaurar o comportamento pasta padrão nos modos normal e de comando.

Agradeço a Ingo Karkat por me indicar a direção certa aqui.

Sophie Alpert
fonte
1

Na verdade, a solução é que você precisa primeiro entrar no modo de comando (por exemplo Esc) e entrar novamente no modo de inserção, mas só funciona se eu digitar manualmente, mas parece "aleatoriamente" parar de funcionar se eu testá-lo ~/.vimrc. O Google não ajuda em nada.

Gasto muito tempo tentando corrigir esse problema e apenas descobri o motivo no meu caso:

Não mapeie a chave de colar da mesma forma que a chave de colar existente no terminal

por exemplo, Ctrl+Shift+Virá colar no meu terminal Konsole, mas se eu atribuir esta chave <C-S-v>no ~/.vimrc, o "undo por apenas pasta única, em vez de múltiplas pastas" não vai funcionar.

No meu caso, eu tenho que usar em <C-v>vez de <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Seu caso pode ser diferente, mas o ponto é o mesmo: não atribua os mesmos conflitos de chave de colar com a chave de emulador de terminal existente.

Eu provei 100% dessa conclusão definindo minha chave de colar terminal Ctrl+Ve agora <C-v>paro de funcionar, mas está <C-S-v>funcionando.

Observe também que o vim é muito sensível e estranho. Eu acho que preciso usar ie, em seguida, 2 teclas direitas manualmente para fazê-lo funcionar na posição correta do cursor, isso significa que eu tenho que colocar ie 2 teclas direitas ~/.vimrctambém. Seu caso pode ser diferente, mas o ponto é o mesmo, garanta que as teclas + ordem em ~ / .vimrc correspondam 100% ao que você digita manualmente.

林果 皞
fonte