Come sostituire il testo interno con il testo strappato


17

Un modello di modifica che incontro frequentemente è il seguente: Voglio strappare un pezzo di testo tra virgolette o parentesi e sostituire quel pezzo di testo all'interno di un'altra coppia di virgolette / parentesi.

Ad esempio, se voglio copiare il nome della classe foo bare incollarlo da qualche altra parte:

<span class="foo bar">

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

Quello che so è questo: se mi muovo all'interno della classe span, uso yi"per strappare il testo tra virgolette.

Ora ho questo nel mio registro, quindi dovrei essere in grado di sostituire il contenuto della classe del div con esso. Ma non riesco a trovare un modo pratico per farlo.

Se lo uso ciwfinisco per sovrascrivere il mio registro con il contenuto da modificare, quindi perdo il mio testo strappato.

La cosa migliore che posso inventare è passare alla prima citazione della classe del div, colpire p, quindi eliminare la citazione successiva con dt".

Di solito però rovino la mia posizione e la incollo da qualche parte tra virgolette unendo le due stringhe, e sta rovinando tutto.

Spero che ci sia un modo per fare una combinazione "sostituisci il testo interno con il mio contenuto strappato per favore" per renderlo più facile.

Risposte:


19

Puoi usare vi"pquando sei dentro "". Questo può sostituire il testo nel registro yank, quindi è importante quando si desidera utilizzare più volte il testo originale strappato.

EDIT : Ulteriori informazioni dal commento di Octaviour riguardo a renderlo riutilizzabile più di una volta:

Per fare ciò, farei uno strattone ad un registro chiamato, che fa i due comandi: "ayi"e e vi""apse usi il registro a.


2
Elaborerò questa soluzione. Prima devi strappare il testo che vuoi copiare. Quindi vai nel punto che desideri incollare, seleziona visivamente usando vi ". Un comando incolla ora posizionerà simultaneamente il contenuto del registro senza nome sul cursore ed eliminerà il testo selezionato. Pertanto vi" p realizza esattamente ciò che vuoi, ma sostituisce il contenuto del registro senza nome, impedendoti di incollare lo stesso testo due volte. Per fare ciò vorrei fare uno strappo ad un registro chiamato, che rende i due comandi: "ayi" e e vi "" ap se usi il registro a.
Ottavio

Grazie per l'elaborazione. Aiuta a precisare le cose con movimenti vim, rende più facile ricordare in seguito. Non è ancora facile come speravo, ma ha senso in un certo senso. Tuttavia, l'utilizzo del comando punto per farlo ripetere e sostituire rapidamente una seconda volta non sembra funzionare. Speravo fosse una scorciatoia. :)
Jurgenb

11

È possibile utilizzare il registro numerato. Per prima cosa "foo-bar" yi", che riempirà il "0registro, vedi :h "0. Quindi eseguire ci"<c-r>0per sostituire con il contenuto del registro 0.

Vedere :h i_CTRL-Rper una descrizione dell'ultima parte.


2
Perché non semplicemente strapparlo nel registro senza nome ( yi") e incollarlo dal registro in 0cui è memorizzato dopo aver eliminato il testo per cambiare ( ci"<c-r>0)? In termini di vimgolf si vincono 2 battute e non si scherza con i registri.
statox

non appena
premo

@ n3wjack Probabilmente perché non hai premuto CTRL+rprima a, questo è ciò che <c-r>significa.
statox

1
@ KarlYngveLervåg In realtà ciwinserisce il testo eliminato nel registro senza nome ma i registri vengono spostati, ecco perché devi usare <c-r>0invece di <c-r>". Vedere :h quote_number.
statox

1
Penserei, più specificamente, che il punto qui non riguarda il registro senza nome, ma piuttosto il registro numerato. Il "0registro è compilato solo dal comando yank e non sarà disturbato ad es c.
Karl Yngve Lervåg,

9

Ecco un'altra soluzione. Non è il migliore in termini di Vimgolf, ma utilizza il registro del buco nero:

Una volta che sei sulla foo barcorda puoi usarla normalmente usando yi".

Quindi all'interno delle parentesi per cambiare: "_di"P

Che è:

"_       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

Il vantaggio del registro del buco nero è che non rovinerà gli altri registri. Vedi :h quote_per maggiori dettagli.

(Nota che questa risposta è qui solo per parlare del registro black out. Uso personalmente la selezione visiva come suggerito da @grodzik.)


Penso che tu abbia bisogno di un maiuscolo Pper quello. Quando di"il cursore verrà lasciato sulle ultime virgolette e pverrà incollato dopo, dove Pverrà incollato prima della posizione corrente.
jecxjo,

@jecxjo Esatto, ho modificato la mia risposta, grazie!
statox

8

Ne ho bisogno così spesso, ho scritto un plugin per semplificare e consentire la massima velocità: ReplaceWithRegister .

Questo plugin offre un grcomando due in uno che sostituisce il testo coperto da un oggetto {motion} / testo, intere righe o la selezione corrente con il contenuto di un registro; il vecchio testo viene cancellato nel registro del buco nero, cioè è sparito. Gestisce in modo trasparente molte custodie angolari e consente una rapida ripetizione tramite il .comando standard . Se non ti piace, la sua pagina contiene collegamenti ad alternative.


Grande! Questo dovrebbe essere Vanilla Vim.
Philipp Moers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.