Como faço para desfazer somente o texto colado no vim?

9

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

Descrição mais longa:

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

Desfaz tudo desde a última vez que você entrou no modo de inserção. Em outras palavras, apaga asdf mais todo o texto que colei.

Como eu apenas desfaz o texto que colou? 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?

    
por Javid Jamae 27.02.2014 / 21:38

3 respostas

3

Uma maneira é explicitamente descartada e retornada ao modo de inserção antes da colagem. Se você estender os comandos "Colar", você também pode 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 comando i_CTRL-R interno. Não sei como o Command-v é implementado no MacVim, mas o prefending <C-G>u no comando :imap deve ter o mesmo efeito.

    
por 28.02.2014 / 09:15
2

No MacVim, você precisa desmapear o item de menu Edit > Paste para sobrescrever o atalho, então você pode remapear o Cmd-V ( D-v no jargão do MacVim) para o comando apropriado em cada modo. Eu adicionei isso ao meu ~/.gvimrc e 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; os noremap e cnoremap são simplesmente para restaurar o comportamento padrão de colar nos modos normal e de comando.

Obrigado a Ingo Karkat por me apontar na direção certa aqui.

    
por 24.07.2014 / 10:08
0

Na verdade, a solução é que você tenha que ir primeiro para o modo de comando (ex. Esc ) e entrar novamente no modo de inserção, mas ele só funciona se eu digitar manualmente mas parecer "aleatoriamente" parar de funcionar se eu testar em ~/.vimrc . O Google não ajuda em nada.

Eu passo muito tempo tentando corrigir esse problema e acabei de descobrir o motivo no meu caso:

Não mapeie a chave de colagem com a chave de colagem existente no terminal

por exemplo. Ctrl + Shift + V irá colar no meu terminal do Konsole, mas se eu atribuir essa chave <C-S-v> em ~/.vimrc , o "desfazer para apenas uma pasta em vez de várias pastas" não funcionará. / p>

No meu caso, tenho que usar <C-v> em 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 colagem com a chave de emulador de terminal existente.

100% provaram esta conclusão colocando minha chave de colar terminal para Ctrl + V e agora <C-v> para de funcionar, mas <C-S-v> funcionando.

Note também que o vim é muito sensível e estranho. Eu descubro que tenho que usar i e depois 2 chaves para a direita manualmente para fazer com que funcione na posição correta do cursor, isso significa que eu tenho que colocar i e 2 chaves à direita no ~/.vimrc também. Seu caso pode ser diferente, mas o ponto é o mesmo, assegure-se de que as chaves + ordem em ~ / .vimrc 100% combinam com o que você digita manualmente.

    
por 21.01.2018 / 19:51

Tags