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 0
registro 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.
yy
: Registros 0
e "
ambos agora têm a linha arrancada.
- Mover para uma linha para substituir.
dd
: O registro "
agora tem a linha excluída, mas o registro 0
ainda tem a linha arrancada.
"0P
: Cole a linha originalmente arrancada do registro 0
.
- Vá para a próxima linha para substituir.
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 "0p
vez 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 AAA
no registro a
e BBB
no registro b
(ou deixar um deles no registro 0
) e colá-las de acordo )
Você também pode colar a partir 0
no 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.
yy
: Registre-se 0
e "
agora ambos têm a linha arrancada.
"_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
yy
(vá para a linha a ser substituída)S<C-r>0<Esc>
. Tem a vantagem de ser repetível com o.
comandoParece 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.
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
"ayy
a primeira linha,"byy
a segunda,"cyy
a terceira e assim por diante. Eu criei o hábito (que reduz a generalidade da receita) para diminuir a carga mental sobre mim.fonte
"ayy
edd
, em seguida ,dd
não substituirá o que está dentroa
, mas se eu digitar,p
ele colará o que foi excluído usandodd
. E se eu quisesse substituir o que há"ayy
com o que estou excluindo, usaria"add
- está certo?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: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 ":Ou, se você tiver uma cópia da sequência de substituição, poderá agrupar os dois em registros separados com
"ayy
e"byy
para os registrosa
eb
, 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
c
opção:fonte
Você pode usar
V
para destacar a linha que deseja substituir no Modo Visual e pressionarpp
e colar sobre essa linha.Isso adiciona apenas um pressionamento de tecla, portanto parece uma solução muito boa.
fonte
V
p
.Eu uso o
c
comando "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, usarn.
comandos consecutivos (n
para 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çãoSe 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.
fonte