Incolla più volte


93

Qual è il modo migliore per sostituire più righe con il contenuto degli appunti?

Il problema che ho è che quando tiro una riga e la incollo su un'altra riga, lo "strappo" viene sostituito con la riga che ho appena sostituito. Ora, se voglio sostituire un'altra linea con la stessa linea, devo tornare su e tirarla di nuovo.

Deve esserci un modo migliore per farlo.

Risposte:


106

Ho questo nel mio .vimrc:

xnoremap p pgvy

(nota: funzionerà solo con il registro predefinito, ma questa mappatura è facile da ricordare). Sarebbe possibile scrivere una versione più elaborata. Inoltre, puoi ancora usare P per ottenere il vecchio comportamento.


28
Intelligente. "p" per incollare, "gv" per riselezionare ciò che era stato originariamente selezionato. "y" per copiarlo di nuovo.
Amjith

@SibbsGambling, probabilmente stai usando una versione precedente a Vim 7? Quindi aggiorna Vim o usa v invece di x ( vnoremap). Il file della version7.txtguida di Vim afferma che xmap e smap sono apparsi in quella versione.
Benoit

1
@Benoit Hmm, ho 7.4.52, ma né xnoremapvnoremapfunziona
Sibbs Gambling

8
Perché non è questo il comportamento predefinito?
Seth

27

"0dovrebbe avere il contenuto del tuo strattone. È un po 'più noioso digitare, ma "0pdovresti fare quello che vuoi.

In alternativa, non selezionare e sostituire le vecchie linee in anticipo. Se trovi quelle righe con una ricerca, premi n.più e più volte (dopo un'iniziale p), quindi quando sono tutte incollate, nddsegui tutte le n.s necessarie.

Il più grande cambiamento mentale che ho dovuto fare quando sono passato a Vim è capire come applicare le modifiche di gruppo in sequenza. Cioè, piuttosto che fare un mucchio di modifiche su una riga e poi fare un mucchio delle stesse modifiche su un'altra riga, farò la prima modifica su un gruppo di righe (usando .con grande effetto), quindi la seconda modifica su un gruppo di linee, ecc. In alternativa, l'uso delle macro può essere d'aiuto in quanto sono fantastiche, ma a volte un po 'più noiose per lavorare correttamente con modifiche "complesse".


2
suona come un luogo in cui regex con i :%s/.../.../gccomandi di tipo di conferma potrebbe essere più vicino a ciò che desideri
Milimetric

@Milimetric +1 non sapevo che potessi confermare in questo modo.

1
Upvoting perché le macro possono rendere questo non un problema. Basta fare la modifica una volta e puoi fare qualcosa come 5@m(per una macro chiamata m)
skatenerd

Grazie per l'ottima spiegazione. Ora lo uso xnoremap p "0pnel mio ~ / .vimrc
nexayq

13

Uso spesso un altro registro, copia la riga che ti serve in un registro con nome "aye poi incollo da lì"ap


11

Quando incolli una selezione in Vim, sostituirà il registro predefinito con il contenuto della selezione. Se incollare una selezione sta cancellando il contenuto del registro degli appunti, molto probabilmente hai la seguente riga nel tuo .vimrc

set clipboard=unnamed

Un'opzione è rimuoverlo e utilizzare il registro degli appunti esplicito "+

Un'altra opzione consiste nell'usare uno qualsiasi degli altri registri denominati esplicitamente (az). Dopo il primo incolla, ritira la linea, "cad esempio, e poi usa "cpper incollare da lì in avanti.


In realtà il valore predefinito (qui, su Ubuntu) era clipboard = autoselect; ancora, grazie per la risposta più elegante finora.
Tobu

8

usa npdove nè il numero di quanto tempo vuoi incollare le linee, ad esempio 3pincollerà 3 linee.


7
Non funziona quando si desidera incollare la stessa riga su righe non contigue.
Tobu

@Tobu ma risponde al titolo di questa domanda "come si incolla più volte"
icc97

6

Invece di usare copia / incolla, spesso è meglio usare un comando oggetto di testo come ciwper cambiare la parola interna. Questo metodo ha il vantaggio di essere facilmente ripetibile utilizzando il .comando repeat.

  1. yiw Copia la parola interna (copia la parola sotto il cursore, pronuncia "prima").
  2. ... Spostare il cursore su un'altra parola (dire "secondo").
  3. ciw<C-r>0 Cambia "secondo", sostituendolo con "primo" (è Ctrl-R).
  4. ... Spostare il cursore su un'altra parola (dire "terza").
  5. . Cambia "terzo", sostituendolo con "primo".

1
ciw<C-r>0non funziona nel mio caso. ciwpassa alla modalità di inserimento dove <C-r>diventa inutile. C'è una semplice spiegazione per questo? Potrebbe avere a che fare con il texteditor (non sto usando pur VIM ma le associazioni di tastiera VIM in RStudio)
Bushroot

@Bushroot <C-r>è concepito per essere utilizzato in modalità di inserimento, poiché è il modo in cui incolli da un registro senza lasciare la modalità di inserimento - in Vim, cioè; Non ho familiarità con RStudio ma immagino che tu abbia ragione e che non abbiano implementato questa particolare associazione di tasti.
Insetto

@ Sean H: Sì. Non hanno implementato l'associazione chiave. Funziona bene in VIM e anche con i collegamenti VIM in altri programmi (ad esempio Visual Studio Code).
Bushroot
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.