Come posso incollare (sovrascrivere) con vim?


31

In vimuso yye ptutto il tempo per strappare e incollare le linee. Tuttavia, se voglio sostituire una riga di più posizioni nel file, non posso usarla yy p dd pperché dd elimina la riga negli appunti / registro. Anche se probabilmente dovrei sapere come usare meglio i registri, credo che ci sia probabilmente un modo per psostituire la riga corrente.

Risposte:


27

Per impostazione predefinita, i comandi incolla utilizzano il "registro ("senza nome") . In effetti, qualsiasi comando che scrive in un registro scrive anche nel registro senza nome, quindi gli strappi, le cancellazioni e le modifiche influiscono su di esso. Questo è il motivo per cui la sequenza yank-delete-paste incolla il testo eliminato anziché il testo strappato.

Il 0registro può aiutare qui. Qualsiasi comando yank che non specifica un registro inserisce il testo strappato nel registro 0(oltre a "). Non è interessato dalle operazioni di eliminazione o modifica, quindi è possibile utilizzarlo per incollare più volte una linea strappata anche se si effettuano eliminazioni o modifiche intermedie.

  1. yy: I registri 0ed "entrambi ora hanno la linea strappata.
  2. Passa a una linea da sostituire.
  3. dd: Il registro "ora ha la linea eliminata, ma il registro 0ha ancora la linea strappata.
    "0P: Incolla la riga originariamente strappata dal registro 0.
  4. Passa alla riga successiva per sostituire.
  5. dd"0P (come sopra)

(A causa del modo in cui funziona il posizionamento del cursore quando si sostituisce l'ultima riga di un buffer, si dovrà usare "0pinvece di "0P.)

Questo è molto vicino alla risposta di Bruce Ediger , tranne per il fatto che non è necessario specificare un registro durante lo strappo iniziale. L'uso di uno o più registri con nome può essere molto utile, tuttavia, se è necessario (ad esempio) sostituire alcune righe con AAA, ma altre righe con BBB(mettere AAAnel registro ae BBBnel registro b(o lasciare uno di essi nel registro 0), quindi incollarle di conseguenza ).

È inoltre possibile incollare da 0in modalità visiva line-saggio ( V) per salvare una sequenza di tasti: V"0p.

Se non ti piace dover digitare "0, potresti trovare una mappatura più conveniente:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Un approccio alternativo consiste _nell'eliminare al registro ("buco nero") . Quando lo elimini, il "registro non è interessato, quindi la sequenza yank-delete-paste può ancora incollare il testo strappato dal registro senza nome.

  1. yy: Registrati 0ed "entrambi ora hanno la linea strappata.
  2. "_dd: Nessuna modifica ai registri.
    P: Incolla il testo originariamente strappato dal registro ".

Ancora una volta, potresti trovare una mappatura più conveniente:

noremap <Leader>d "_d

2
Oppure, tl; dr, basta usare yy(sposta sulla linea per essere sostituito) S<C-r>0<Esc>. Ha il vantaggio di essere ripetibile con il .comando.
Wildcard il

11

Sembra che Kevin abbia una risposta abbastanza buona, ma se vuoi mettere gli occhi su ogni riga che elimini, quindi sostituire, esiste una soluzione leggermente diversa.

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.

Questo tipo di ricetta ti consente di utilizzare la corrispondenza dei motivi per trovare le righe da eliminare e sostituire, e puoi tornare all'inizio del file (1G) e cercare in avanti tutte le volte che vuoi. Se ho 2 o più righe da raccogliere e posizionare ripetutamente, le uso "ayyper la prima riga, "byyper la seconda, "cyyper la terza e così via. Ho preso l'abitudine (che riduce la generalità della ricetta) di ridurre il carico mentale su di me.


Molto bella. Quindi, se uso "ayye quindi dd, ddnon sostituirà ciò che è dentro a, ma se scrivo pincollerà ciò che è stato appena eliminato utilizzando dd. E se volessi sostituire ciò che è dentro "ayycon quello che sto eliminando, allora userei "add- giusto?
Cwd

"ayy copia una riga nel registro 'a'." dd "taglia una riga in un registro predefinito, non 'a'. 'p' incolla il registro predefinito, corretto. E sì," aggiungi taglia una riga nel registro "a" , che sostituirà il contenuto del "comando ayy.
Bruce Ediger,

5

Ci sono un paio di modi per farlo :s, a seconda di quanta digitazione vuoi fare. Il modo più semplice è una semplice ricerca e sostituzione:

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

Il %cercherà l'intero file e sostituire tutte le occorrenze.

Se questa è troppa digitazione per te, puoi strappare la stringa di destinazione ( yy) e usare il "registro (predefinito), inserendolo con Ctrl+r ":

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

Oppure, se si dispone di una copia della stringa di sostituzione, è possibile tirare i due in registri separati con "ayye "byydare uno strattone nelle ae bregistri, rispettivamente, (è possibile utilizzare qualsiasi lettera per i vostri registri). Quindi utilizzare Ctrl+r ae Ctrl+r bper incollarli nella ricerca e sostituire i campi.

Non per un singolo Bruce, ma se vuoi controllare le linee prima di sostituirle, aggiungi semplicemente l' copzione:

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

2

È possibile utilizzare Vper evidenziare la linea che si desidera sostituire in modalità visiva e quindi premere ppper incollare su quella linea.

Questo aggiunge solo un tasto, quindi sembra una soluzione abbastanza buona.


Questo non funziona: dopo aver incollato, gli appunti contengono il testo che è stato contrassegnato dalV
daniel kullmann il

Solo un singolo p.
Aaron Thoma,

2

Uso il ccomando "modifica" abbastanza frequentemente per questo tipo di cose, combinato con una ricerca regolare. Puoi cercare nel file ogni riga / pezzo di testo che ti interessa e quindi utilizzare i n.comandi consecutivi ( nper successivo e poi .per ripetere l'ultima modifica).

/^hello- trova la riga che inizia con ciao;
c$goodbye- cambia riga in arrivederci;
n.- ripeti trova, ripeti modifica

Se vuoi cambiare la linea con una già presente nel file, puoi semplicemente copiarla nel buffer di input (supponendo che la tua GUI lo consenta) e quindi incollare per ottenere il contenuto del primo comando di modifica.

Come per tutte le cose vi, è una buona idea avere molte opzioni in tasca, a seconda del tipo di modifica che vuoi fare.

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.