Vim: copie e cole mais de uma vez

5

Eu uso o modo de destaque no vim para copiar alguns caracteres. Eu quero colar mais de uma vez. Minha técnica atual não funciona bem.

Exemplo de texto: Linux Solaris Irix HP-UX

Suponha que eu queira copiar a palavra Linux e cole sobre Solaris e Irix .

  1. Coloque o cursor em L in Linux
  2. Comando v (para hilite visual), então e (para final de palavra), depois y (para yank / copy)
  3. Agora, Linux está na minha "área de transferência do vim"
  4. Mover o cursor para S in Solaris (primeira instância)
  5. Comando v (para hilite visual), depois e (para final de palavra), depois p (para colar)
  6. O texto agora é: Linux Linux Irix HP-UX , mas agora Solaris está na minha "área de transferência do vim"
  7. Mover o cursor para I em Irix (segunda instância)
  8. Comando v (para hilite visual), depois e (para final de palavra), depois p (para colar)
  9. O texto é agora: Linux Linux Solaris HP-UX , que não é o que eu esperava.

Eu recorro ao uso de highlite / paste com o mouse (via X Terminal). Certamente, eu posso fazer isso melhor. Como?

    
por kevinarpe 02.05.2013 / 04:07

4 respostas

6

Eu faria isso dessa maneira (muito útil para muitas pastas):

  1. Vá para algum lugar na palavra Linux , então "ayiw para copiar a palavra
    • "a para selecionar o registro" a »
    • y para copiar
    • i para especificar que estamos "in" (a palavra, o parágrafo, ...)
    • w para escolher a palavra
  2. Chegou à próxima palavra w (ou em algum lugar da palavra)
  3. Cole na hora e salve como macro qbdiw "aPq
    • qb para iniciar a gravação da macro no registro «b»
    • d para excluir
    • i para especificar que estamos "in" (a palavra, o parágrafo, ...)
    • w para escolher a palavra
    • "a para selecionar o registro" a »(salvo anteriormente)
    • P para colar a palavra antes do cursor
    • q para parar de gravar a macro
  4. Em seguida, para usar a macro pela primeira vez, vá para a próxima palavra w e pressione @b
  5. Finalmente, e é onde a vantagem deste método pode ser vista, vá a cada palavra que você quer substituir e pressione @@

Dica: Substitua o w pelo W em qbdiw "aPq para selecionar a palavra com pontuação, como HP-UX

Problema: Quando a palavra é a última da linha, ela apaga o espaço antes da palavra.

    
por 02.05.2013 / 08:44
1

Use registros e evite o modo visual.

Move to 'L' (type 0fL)                  |L|inux Solaris Irix HP-UX
"lye                                    
'Linux' is now in the 'l' register.     
Move to 'S' (type fS)                   Linux |S|olaris Irix HP-UX
"sde"lP                                 Linux Linu|x| Irix HP-UX
'Solaris' is now in the 's' register.   
Move to 'I' (type fI)                   Linux Linux |I|rix HP-UX
"ide"lP                                 Linux Linux Linu|x| HP-UX

Você também pode simplesmente excluir 'Solaris' e 'Irix' e colar 'Linux' duas vezes no lugar deles.

0fLw2dwbyf<space>w2P
    
por 02.05.2013 / 04:16
1

Preciso disso com muita frequência, escrevi um plug-in para simplificar e permitir velocidade máxima: ReplaceWithRegister .

Este plugin oferece um comando two-in-one gr que substitui o texto coberto por um objeto {motion} / text, linha (s) inteira (s) ou a seleção atual pelo conteúdo de um registrador; o texto antigo é apagado no registo do buraco negro, ou seja, desapareceu. Ele manipula de forma transparente muitos casos de canto e permite uma repetição rápida por meio do comando padrão . . Caso você não goste, sua página tem links para alternativas.

    
por 02.05.2013 / 09:01
1

Você pode querer considerar "0p ao colar no modo visual.

Ref :help v_p

Move to L in Linux
ye     # Yank to end of word.
w      # Move to next word.
<C>ve  # Highlight Solaris.
"0p    # Paste Linux, Solaris ends up in unnamed register and Linux in 0
w      # Move to next word.
<C>ve  # Mark next word. (Or anywhere else)
"0p    # Paste Linux.

Ou, neste exemplo exato, pode-se também:

Posicionado em L no Linux

yww<C>v2f 2p
# Or
yww<C>v2el2p
yw           # Yank Linux 
w            # Move to S in Solaris
<C>v2el      # Enter visual mode, highlight two * end, and l to consume space.
2p           # Paste Linux twice.

'<C>v2f '    # Alternative to <C>v2el
    
por 02.05.2013 / 04:43

Tags