Como substituir texto interno por texto arrancado

17

Um padrão de edição com o qual frequentemente encontro é o seguinte: quero puxar um pedaço de texto entre aspas ou colchetes e substituir esse pedaço de texto dentro de outro par de aspas / colchetes.

Por exemplo, se eu quiser copiar o nome da classe foo bare colá-lo em outro lugar:

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

O que sei é o seguinte: se eu for para a classe do período, uso yi"para puxar o texto entre aspas.

Agora eu tenho isso no meu registro, então devo poder substituir o conteúdo da classe da div por ele. Mas não consigo encontrar uma maneira prática de fazer isso.

Se eu usar ciwisso, você substituirá meu registro com conteúdo para alterar, então eu perco meu texto arrancado.

A melhor coisa que posso encontrar é passar para a primeira citação da classe div, pressionando pe excluindo para a próxima citação com dt".

Normalmente, eu estrago minha posição, e colo em algum lugar dentro das aspas, unindo as duas strings, e isso está atrapalhando as coisas.

Espero que haja uma maneira de fazer uma combinação "substituir o texto interno pelo meu conteúdo arrancado, por favor" para facilitar isso.

jurgenb
fonte

Respostas:

19

Você pode usar vi"pquando estiver dentro "". Isso pode substituir o texto no registro de arrancamento, por isso é importante quando você deseja usar o texto arrancado original mais de uma vez.

EDIT : Informações adicionais do comentário do Octaviour sobre como torná-lo reutilizável mais de uma vez:

Para fazer isso, eu puxaria para um registrador nomeado, que cria os dois comandos: "ayi"e e vi""apse você usar registrador a.

Grodzik
fonte
2
Vou elaborar esta solução. Você primeiro arranca o texto que deseja copiar. Então você vai para o local que deseja colar, selecione visualmente usando vi ". Um comando de colar agora coloca simultaneamente o conteúdo do registro sem nome no cursor e exclui o texto selecionado. Portanto, vi" p realiza exatamente o que você deseja, mas ele substitui o conteúdo do registro sem nome, impedindo que você cole o mesmo texto duas vezes. Para fazer isso, eu puxaria para um registrador nomeado, que cria os dois comandos: "ayi" e vi "" ap se você usar o registrador a.
Oct
Obrigado por elaborar. Ajuda a soletrar as coisas com movimentos do vim, facilita a lembrança depois. Ainda não é tão fácil quanto eu esperava que fosse, mas faz sentido de uma maneira divertida. Usar o comando dot para repetir e substituir rapidamente uma segunda vez não parece funcionar. Eu esperava que isso fosse um atalho. :)
jurgenb
11

Você pode usar o registro numerado. Primeiro arranque "foo-bar" com yi", o que preencherá o "0registro, veja :h "0. Em seguida, ci"<c-r>0substitua pelo conteúdo do registro 0.

Veja :h i_CTRL-Rpara uma descrição da última parte.

Karl Yngve Lervåg
fonte
2
Por que não simplesmente puxá-lo no registro sem nome ( yi") e colá-lo no registro 0em que está armazenado depois que você excluiu o texto para alterar ( ci"<c-r>0)? Em termos de vimgolf, você ganha 2 pressionamentos de tecla e não mexe com seus registros.
statox
assim que eu bater 'a' eu acabar no modo de edição, porém, isso não copia um registo
jurgenb
@ n3wjack Provavelmente porque você não pressionou CTRL+rantes a, é isso que <c-r>significa.
Statox
1
@ KarlYngveLervåg Na verdade ciw, o texto excluído é inserido no registro sem nome, mas os registros são alterados, é por isso que você precisa usar em <c-r>0vez de <c-r>". Veja :h quote_number.
Statox
1
Eu pensaria, mais especificamente, que o ponto aqui não é sobre o registro sem nome, mas sobre o registro numerado. O "0registro é preenchido apenas pelo comando yank e não será perturbado, por exemplo c.
Karl Yngve Lervåg
8

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
Ótimo! Isso deve ser baunilha vim.
Philipp Moers
8

Aqui está outra solução. Não é o melhor em termos de Vimgolf, mas usa o registro do buraco negro:

Quando estiver na foo barcorda, você pode puxá-la normalmente usando yi".

Em seguida, dentro dos colchetes para mudar: "_di"P

Qual é:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

A vantagem do registro do buraco negro é que ele não estragará os outros registros. Veja :h quote_para mais detalhes.

(Observe que esta resposta está aqui apenas para falar sobre o registro de blecaute. Eu pessoalmente uso a seleção visual, conforme sugerido por @grodzik.)

statox
fonte
Eu acho que você precisa de uma letra maiúscula Ppara essa. Quando di"o cursor for deixado nas últimas aspas e pserá colado depois, onde como Pserá colado antes da posição atual.
jecxjo
@jecxjo Isso mesmo, editei minha resposta, obrigado!
Statox