Como posso colar (sobrescrever) com o vim?

25

Em vim eu uso yy e p o tempo todo para puxar e colar linhas. No entanto, se eu quiser substituir uma linha em vários locais no arquivo, não posso usar yy p dd p porque o dd exclui a linha para a área de transferência / registro. Embora eu deva saber usar melhor os registradores, acho que provavelmente existe uma maneira de p substituir a linha atual.

O Google não ajudou muito a encontrar nada, e os tutoriais do VIM que encontrei não cobriram isso. Acabei de pedir um livro da Amazon, mas espero que alguém me avise antes que chegue aqui;)

    
por cwd 12.12.2011 / 19:00

5 respostas

22

Por padrão, os comandos "colar" usam o registro " ("sem nome") . Efetivamente, qualquer comando que grava em um registrador também grava no registrador sem nome, de modo que os puxões, exclusões e mudanças afetam-no. É por isso que sua sequência de copiar e excluir colar cola o texto excluído em vez do texto arrancado.

O 0 register pode ajudar aqui. Todos os comandos que não especificam um registrador colocam o texto arrancado no registro 0 (além de " ). Ele não é afetado por operações de exclusão ou alteração, portanto, você pode usá-lo para colar uma linha arrancada várias vezes, mesmo que faça exclusões ou alterações intermediárias.

  1. yy : os registros 0 e " agora têm a linha removida.
  2. Mover para uma linha para substituir.
  3. dd : Registrar " agora tem a linha excluída, mas o registro 0 ainda tem a linha de yanked.
    "0P : Cole a linha originalmente retirada do registro 0 .
  4. Mover para a próxima linha a 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ê vai querer usar "0p em vez de "0P .)

Isso está muito próximo da resposta de Bruce Ediger , exceto que você não precisa especificar um registro quando inicialmente arrancando. O uso de um ou mais registradores nomeados pode ser muito útil, entretanto, se você precisar (por exemplo) substituir algumas linhas por AAA , mas outras linhas com BBB (colocar AAA no registro a e BBB in registre b (ou deixe um deles no registro 0 ), depois cole-os de acordo.

Você também pode colar 0 no modo visual de linha ( V ) para salvar um pressionamento de tecla: 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 _ ("blackhole") registro . Quando você exclui para ele, o " register não é afetado, então sua seqüência de yank-delete-paste ainda pode colar o texto arrancado do registrador sem nome.

  1. yy : Registre 0 e " ambos agora têm a linha arrancada.
  2. "_dd : nenhuma alteração nos registradores.
    P : cole o texto originalmente retirado do registro " .

Novamente, você pode achar um mapeamento mais conveniente:

noremap <Leader>d "_d
    
por 13.12.2011 / 10:47
11

Parece que Kevin tem uma resposta muito boa, mas se você quiser colocar os olhos em cada linha que você excluir, então substitua, existe uma solução um pouco 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 a serem excluídas e substituídas, e você pode voltar ao início do arquivo (1G) e pesquisar sempre que desejar. Se eu tiver duas ou mais linhas para reunir e colocar repetidamente, use "ayy para a primeira linha, "byy para a segunda, "cyy para a terceira e assim por diante. Eu criei um hábito (o que reduz a generalidade da receita) para diminuir a carga mental em mim.

    
por 12.12.2011 / 22:17
5

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

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

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

Se você digitar muito para você, pode arrancar a string de destino ( yy ) e usar o registrador " (padrão), inserindo-a com Ctrl + r " :

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

Ou, se você tiver uma cópia da sequência de substituição, poderá separar os dois em registradores separados com "ayy e "byy para inserir os registros a e b , respectivamente (você pode usar qualquer carta para seus registros). Então use Ctrl + r a e Ctrl + r b para colá-los nos campos de busca e substituição. / p> Não para bruce one-up, mas se você quiser verificar as linhas antes de substituí-las, basta adicionar a opção c :

:%s/find this line/replace with this/c
    
por 12.12.2011 / 19:26
2

Você pode usar V para realçar a linha que deseja substituir no Modo Visual e, em seguida, pressionar pp para colar sobre essa linha.

Isso só adiciona um pressionamento de tecla, por isso parece uma boa solução.

    
por 12.12.2011 / 19:12
2

Eu uso o comando c , "change", com bastante frequência para esse tipo de coisa, combinado com a pesquisa regular. Você pode pesquisar o arquivo para cada linha / peça de texto em que está interessado e, em seguida, usar comandos n. consecutivos ( n para o próximo e, em seguida, . para repetir a última alteração).

/^hello - encontre a linha que começa com oi;
c$goodbye - mude a linha para o adeus;
n. - repita a busca, repita a alteração

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

Tal como acontece com todas as coisas vi, é uma boa ideia ter muitas opções no seu bolso, dependendo do tipo de edição que pretende fazer.

    
por 13.10.2014 / 17:21

Tags