Como colar (sobrescrever) no vim?

31

No vimuso yye po tempo todo para puxar e colar linhas. No entanto, se eu quiser substituir uma linha em vários locais do arquivo, não posso usá-la yy p dd pporque ela dd exclui a linha da área de transferência / registro. Embora eu deva provavelmente saber usar melhor os registros, sinto que provavelmente existe uma maneira de psubstituir a linha atual.

cwd
fonte

Respostas:

27

Por padrão, os comandos de colar usam o "registro ("sem nome") . Efetivamente, qualquer comando que grava em um registro também grava no registro sem nome, portanto, puxa, exclui e altera tudo o afeta. É por isso que sua sequência de arrancar-excluir-colar cola o texto excluído em vez do texto arrancado.

O 0registro pode ajudar aqui. Qualquer comando de arranque que não especifique um registro coloca o texto arrancado no registro 0(além de "). Ele não é afetado pelas operações de exclusão ou alteração, portanto, você pode usá-lo para colar uma linha arrancada várias vezes, mesmo se você fizer exclusões ou alterações intermediárias.

  1. yy: Registros 0e "ambos agora têm a linha arrancada.
  2. Mover para uma linha para substituir.
  3. dd: O registro "agora tem a linha excluída, mas o registro 0ainda tem a linha arrancada.
    "0P: Cole a linha originalmente arrancada do registro 0.
  4. Vá para a próxima linha para substituir.
  5. dd"0P (o mesmo que acima)

(Devido à maneira como o posicionamento do cursor funciona ao substituir a última linha de um buffer, você desejará usar em "0pvez de "0P.)

Isso está muito próximo da resposta de Bruce Ediger , exceto que você não precisa especificar um registro ao puxar inicialmente. O uso de um ou mais registradores nomeados pode ser muito útil, se você precisar (por exemplo) substituir algumas linhas por AAA, mas outras por BBB(colocar AAAno registro ae BBBno registro b(ou deixar um deles no registro 0) e colá-las de acordo )

Você também pode colar a partir 0no modo visual linha-wise ( V) para salvar uma combinação de teclas: V"0p.

Se você não gosta de digitar "0, pode achar um mapeamento mais conveniente:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Uma abordagem alternativa é excluir o _registro ("blackhole") . Quando você o exclui, o "registro não é afetado; portanto, sua sequência de arrancar-excluir-colar ainda pode colar o texto arrancado do registro sem nome.

  1. yy: Registre-se 0e "agora ambos têm a linha arrancada.
  2. "_dd: Nenhuma alteração nos registros.
    P: Cole o texto originalmente arrancado do registro ".

Novamente, você pode achar um mapeamento mais conveniente:

noremap <Leader>d "_d
Chris Johnsen
fonte
2
Ou, tl; dr, basta usar yy(vá para a linha a ser substituída) S<C-r>0<Esc>. Tem a vantagem de ser repetível com o .comando
Wildcard)
11

Parece que Kevin tem uma resposta muito boa, mas se você deseja observar cada linha excluída e substituí-la, existe uma solução ligeiramente diferente.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Esse tipo de receita permite que você use a correspondência de padrões para encontrar linhas para excluir e substituir, e você pode voltar ao início do arquivo (1G) e pesquisar adiante quantas vezes quiser. Se eu tiver 2 ou mais linhas para reunir e colocar repetidamente, utilizo "ayya primeira linha, "byya segunda, "cyya terceira e assim por diante. Eu criei o hábito (que reduz a generalidade da receita) para diminuir a carga mental sobre mim.

Bruce Ediger
fonte
Muito agradável. Portanto, se eu usar "ayye dd, em seguida , ddnão substituirá o que está dentro a, mas se eu digitar, pele colará o que foi excluído usando dd. E se eu quisesse substituir o que há "ayycom o que estou excluindo, usaria "add- está certo?
Cwd
"ayy copia uma linha no registro 'a'." dd "corta uma linha em um registro padrão, não 'a'. 'p' cola o registro padrão, correto. E sim," add corta uma linha no registro 'a' , que substituiria o conteúdo do "comando ayy."
Bruce Ediger 16/12
5

Existem algumas maneiras de fazer isso :s, dependendo da quantidade de digitação que você deseja fazer. A maneira mais fácil é uma simples pesquisa e substituição:

:%s/find this line/replace with this/

O %pesquisará o arquivo inteiro e substituirá todas as ocorrências.

Se você digitar demais, poderá puxar a string de destino ( yy) e usar o "registro (padrão), inserindo-o com Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Ou, se você tiver uma cópia da sequência de substituição, poderá agrupar os dois em registros separados com "ayye "byypara os registros ae b, respectivamente (você pode usar qualquer letra para seus registros). Em seguida, use Ctrl+r ae Ctrl+r bcole-os na pesquisa e substitua os campos.

Não para Bruce de uma só vez, mas se você quiser verificar as linhas antes de substituí-las, basta adicionar a copção:

:%s/find this line/replace with this/c
Kevin
fonte
2

Você pode usar Vpara destacar a linha que deseja substituir no Modo Visual e pressionar ppe colar sobre essa linha.

Isso adiciona apenas um pressionamento de tecla, portanto parece uma solução muito boa.

mouche
fonte
Isso não funciona: após a pasta, a área de transferência contém o texto marcado porV
daniel kullmann
Apenas um p .
Aaron Thoma 4/15
2

Eu uso o ccomando "change" com bastante frequência para esse tipo de coisa, combinado com a pesquisa regular. Você pode procurar no arquivo cada linha / parte do texto em que estiver interessado e, em seguida, usar n.comandos consecutivos ( npara a próxima e depois .repetir a última alteração).

/^hello- encontre a linha começando com olá;
c$goodbye- mude de linha para adeus;
n.- repita a localização, repita a alteração

Se você quiser alterar a linha para uma já existente no arquivo, basta copiá-la para o buffer de entrada (supondo que sua GUI permita) e colar para obter o conteúdo do primeiro comando de alteração.

Como em todas as coisas do vi, é uma boa ideia ter muitas opções no bolso, dependendo do tipo de edição que você deseja fazer.

rghome
fonte