vim - como posso fazer uma 'alteração de palavra' usando o buffer de colagem atual

86

Eu tenho algum texto no meu buffer de colagem, por exemplo, fiz uma yw(palavra puxada) e agora tenho 'foo' no meu buffer.

Agora vou para a palavra 'bar' e quero substituí-lo pelo meu buffer de colagem.

Para substituir o texto manualmente, eu poderia fazer cwe digitar a nova palavra.

Como posso fazer uma 'alteração de palavra', mas usar o conteúdo do meu buffer de colar em vez de digitar manualmente a palavra de substituição?

A melhor opção que tenho agora é ir para o início da palavra que quero substituir e fazer dw(excluir palavra), depois ir para o outro lugar e fazer a yw(palavra puxada), depois voltar para a área de substituição e fazer p(colar), que é meio desajeitado, especialmente se eles não estiverem na mesma tela.

Michael Durrant
fonte

Respostas:

120

Opção 1

Você pode usar registradores para fazer isso e criar uma combinação de teclas para o processo.

Arranque a palavra que você deseja substituir yw.

A palavra arrancada está no 0registro que você pode ver emitindo :registers.

Vá para a palavra que deseja substituir e fazer cw. Faça Ctrl+ rseguido de 0para colar o 0registro.

O mapa para isso seria algo como isto (assumindo Ctrl+ jcomo nossa combinação de teclas):

:map <C-j> cw<C-r>0<ESC>

Opção 2 (mais simples)

Com sua palavra puxada, passe o cursor sobre a palavra que deseja substituir e executar viwp. Qual é visual selecione a palavra interna e cole.

Cortesia de @tlo nos comentários: você também pode fazer vep. Um char mais curto. O lado negativo deve posicionar o cursor no início da palavra e (como o meu) altera o buffer.

Comentário (de Michael):

Isso é bom. Nota extra: o segundo método é realmente mais fácil, mas, como é, funciona apenas para UMA substituição, porque após cada substituição o buffer é alterado para o campo que foi substituído (texto antigo). O primeiro método é um pouco mais difícil de usar, mas tem a vantagem de o buffer 0 permanecer 'como está', para que você possa usar esse método para fazer mais de uma substituição do mesmo texto.

jmathew
fonte
14
Opção 3 (ainda mais simples): com sua palavra puxada, passe o cursor sobre o primeiro caractere da palavra que você deseja substituir e executar vep.
tlo
Gosto da opção 3 quando há apenas 1 palavra para alterar. Se houver mais de uma mesma palavra para alterar, a opção 1 permitirá que eu use o. operador para repeti-lo ..
typelogic 20/09/18
3
ve"0pfuncionaria para permitir que você repita sua alteração
JKillian
Se você deseja mapeá-lo para alguma coisa, provavelmente é melhor usar: map <C-j> ciw<C-r>0<ESC>para que não importe de onde na palavra você pressiona ^j.
Paul Parker
Qualquer pessoa que queira saber por que o CTRL-R faz a mágica: :help insertpesquise CTRL-R /CTRL-R. Para saber como ve"0pfunciona, veja:help registers
Paul Parker
12

ywpara puxar sua palavra e, em seguida, mova o cursor para a palavra que você deseja substituir e use-a "_dwpara excluí-la, enviando o texto para o registro nulo (para que não sobrescreva o conteúdo do "registro, para onde o texto arrancado / cortado é padrão) ) e, em seguida, basta colar com p.

Você pode usar o seguinte mapeamento para facilitar um pouco as coisas:

nnoremap <leader>d "_d

... portanto, no modo normal, você pode \dwexcluir uma palavra sem afetar o "registro.

evilsoup
fonte
3

Para fazer isso da maneira VIM, você usa intencionalmente os registros yank, delete e outros.

Register "0é o registro de arranco. Qualquer coisa que você puxar será colocada aqui, mas as exclusões nunca tocam em registrar "0.

Então, no seu exemplo, você acabou de arrancar uma palavra. Para substituir uma palavra pelo que você acabou de puxar, aproveite as exclusões que nunca tocam no registro de puxões. Então vá para a palavra alvo, apague-a com dwe cole a partir do seu registro yank com "0p, ou melhor ainda, cwentão ^R0(que é repetível).

Um oposto ao registro de arranco é o registro de pequenas exclusões "-. Qualquer pequena exclusão ou remoção de alteração é colocada aqui, mas os puxões nunca se tocam "-. Uma exclusão conta como pequena se for menor que uma linha completa.

Registradores "1- "9são os registros do histórico de exclusão. Com "1a exclusão da última exclusão grande ou remoção de alterações e "9a exclusão da exclusão grande mais antiga ou remoção de alterações. Somente exclusões que não são pequenas, ou seja, exclusões de uma linha ou mais, são pressionadas para "1- "9.

Para qualquer operação que altera um registro, uma cópia também é sempre colocada no padrão, também conhecido como registro sem nome "". Este é o registro usado quando você não nomeia explicitamente um registro.

Register "_é o registro do buraco negro e está sempre vazio. Se você excluir, nada em nenhum registro será alterado, nem mesmo o ""registro padrão ou o próprio buraco negro. O texto removido desapareceu completamente, além do histórico de desfazer. Recolher ou colar a partir do registro do buraco negro não faz essencialmente nada.

O registro do buraco negro "_permite fazer coisas como primeiro uma exclusão pequena, depois várias outras exclusões "_sem alterar seu registro de exclusões pequenas "-e colar sua primeira exclusão pequena.

Outros registradores são o último registro inserido "., o nome do arquivo "%e "#, o comando command ":, search search "/e expression expression "=.

Você pode obter uma lista de todos esses registros e seus conteúdos pelo comando :register. Esse comando é muito útil para experimentar e aprender o que acaba onde.

00prometheus
fonte
2

Eu preciso disso com tanta frequência que escrevi um plugin para simplificar e permitir a velocidade máxima: ReplaceWithRegister .

Este plug-in oferece um grcomando dois-em-um que substitui o texto coberto por um {motion} / objeto de texto, linha (s) inteira (s) ou a seleção atual pelo conteúdo de um registro; o texto antigo é excluído no registro do buraco negro, ou seja, foi removido. Ele lida de forma transparente com muitos casos de canto e permite uma repetição rápida através do .comando padrão . Caso você não goste, sua página possui links para alternativas.

Ingo Karkat
fonte
2

Para repetir a colagem, use o comando change.

cw ^R0ESC (^ R = Control + R; 0 para o registro 0)

substituirá a palavra pelo conteúdo de reg. 0 e vamos repetir com.

Isso é ótimo para cgn(VIM 7.4) substituir os padrões de pesquisa:

  • Primeira pesquisa com /ou*
  • cgn ^R0ESC
  • .repetir na próxima partida ou npular
Laktak
fonte
1

Como ainda não está incluído, você geralmente substitui as strings por :%s/.../.../e também pode fazê-lo com a palavra sob o cursor.

  1. Você insere a primeira parte do comando, o que está procurando: :s/find/
  2. Depois, clique <ctrl-r>e escolha com o cursor a palavra com a qual deseja substituí-la.
  3. Em seguida, você clica em <ctrl-w>(palavra "pequena") ou <ctrl-a>(palavra "grande") para colar a palavra sob o cursor na linha de comando
  4. Então você termina o comando.

Veja o link sobre como usar o cursor na linha de comando .

erikbwork
fonte
1

Eu costumo usar isso: ywpara puxar foo, depois excluir barcom dwe, como etapa final, colocar foodo registro 0que contém o texto arrancado usando "0p. Repita a colocação com ponto ( .) conforme necessário.

Além disso, em vez de ywe dw, você pode usar yiwe diw(observe o extra i- significa dentro ). Com isso, você pode puxar ou excluir a palavra de qualquer local dentro dela, não apenas no início da palavra.

Nino
fonte
0

Eu uso este plugin para expandir a região de seleção: https://github.com/terryma/vim-expand-region

Portanto, minha combinação para alterar uma palavra será: vvpem qualquer lugar da palavra.

Eu também tenho um truque para salvar o conteúdo do registro sem nome após colar, para que eu possa repetir isso.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(minha área de transferência é selecionada automaticamente)

user2656799
fonte
0

Estou usando o mapeamento de teclas abaixo para substituir a palavra atual pela palavra copiada.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwcopie uma palavra. Navegue até uma palavra. ,rrsubstitua a palavra.
A chave do líder é mapeada para ,.

Fisher
fonte
,rwfaria mais sentido, e no QWERTY é provavelmente um pouquinho mais fácil e rápido de montar. No DVORAK, eu escolhi ,rc, que, embora não faça muito sentido, é mais fácil e rápido do que todos eles. No DVORAK, ,rwé um show de terror;)
Paul Parker
0

Primeiro, navegue até o início da palavra que deseja puxar. Se você está no meio da palavra, basta bvoltar ao início. Em seguida, fazer yearrancar a palavra inteira, sem espaços à direita ( yANK para end). Por fim, vá para a palavra que deseja substituir - talvez fazendo walgumas vezes - e faça o veppara entrar no vmodo de seleção manual, selecione o número eda palavra e paspire o último conteúdo puxado.

(Se alguém quiser saber por que eu não simplesmente comentar sobre a resposta aceita, para a pequena modificação de usar ye, em vez de yw, é porque minha reputação neste pilha ainda é muito baixa.)

Anomalia
fonte
0
  1. use ywpara puxar o mundo, vá para o mundo que você deseja mudar.
  2. use vpara selecionar o mundo veou vwdependendo da sua situação.
  3. entre ppara alterar o mundo que você copiou para substituir o bloco selecionado
Ramwin
fonte
0

Adicionando às outras respostas melhores. Um pouco óbvio, mas você pode simplesmente colar antes de excluir. 'yw', em seguida, escolha a palavra que deseja substituir, 'pldw' (cole, mova um caractere para a direita, exclua a palavra.

Ali Almoullim
fonte