vim - come posso fare una 'modifica parola' usando l'attuale buffer di incollaggio


86

Ho un po 'di testo nel mio buffer di incollaggio, ad esempio ho fatto una yw(parola brutta) e ora ho "pippo" nel mio buffer.

Ora vado alla parola 'barra' e voglio sostituirlo con il mio buffer di pasta.

Per sostituire il testo manualmente ho potuto fare cwe quindi digitare la nuova parola.

Come posso fare una "modifica parola" ma usare il contenuto del mio buffer di pasta invece di digitare manualmente la parola sostitutiva?

L'opzione migliore che ho in questo momento è andare all'inizio della parola che voglio sostituire e fare dw(cancellare la parola), quindi andare nell'altra posizione e fare la yw(parola strattonata), quindi tornare all'area di sostituzione e fare p(incolla) che è un po 'goffo soprattutto se non si trovano sullo stesso schermo.

Risposte:


120

opzione 1

È possibile utilizzare i registri per farlo e creare una combinazione di tasti per il processo.

Strappi la parola che vuoi sostituire yw.

La parola strappata è nel 0registro che puoi vedere emettendo :registers.

Vai alla parola che vuoi sostituire e fai cw. Fai Ctrl+ rseguito da 0per incollare il 0registro.

La mappa per questo sarebbe simile a questa (assumendo Ctrl+ jcome la nostra combinazione di tasti):

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

Opzione 2 (più semplice)

Con la tua parola strappata, posiziona il cursore sulla parola che vuoi sostituire e fare viwp. Che è visual selezionare la parola interna e incollare.

Per gentile concessione di @tlo nei commenti: si potrebbe anche fare vep. Un carattere più corto. Il rovescio della medaglia deve posizionare il cursore all'inizio della parola e (come il mio) cambia il buffer.

Commento (da Michael):

Questo è buono. Nota aggiuntiva: il secondo metodo è davvero più semplice ma, com'è, funziona solo per UNA sostituzione perché dopo ogni sostituzione il buffer viene quindi modificato nel campo che è stato sostituito (testo precedente). Il primo metodo è un po 'più difficile da usare, MA ha il vantaggio che il buffer 0 rimane "così com'è", quindi puoi usare quel metodo per fare più di 1 sostituzione dello stesso testo.


14
Opzione 3 (ancora più semplice): con la parola strappata, posiziona il cursore sul primo carattere della parola che vuoi sostituire e fare vep.
fino al

Mi piace l'opzione 3 quando c'è solo 1 parola da cambiare. Se c'è più di una stessa parola da modificare, l'opzione 1 mi consente di utilizzare il. operatore per ripeterlo ..
typelogic

3
ve"0pfunzionerebbe per permetterti di ripetere la modifica
JKillian,

Se hai intenzione di mapparlo su qualcosa, è probabilmente meglio usarlo: in map <C-j> ciw<C-r>0<ESC>modo che non abbia importanza da dove nella parola premi ^j.
Paul Parker,

Chiunque voglia sapere perché CTRL-R fa la magia: :help insertquindi cerca CTRL-R /CTRL-R. Per come ve"0pfunziona, guarda:help registers
Paul Parker

12

ywper strappare la parola, quindi spostare il cursore sulla parola che si desidera sostituire e utilizzare "_dwper eliminarla, inviando il testo al registro null (quindi non sovrascrive il contenuto del "registro, dove il testo strappato / tagliato va di default ), quindi incollalo semplicemente con p.

È possibile utilizzare la seguente mappatura per semplificare un po 'le cose:

nnoremap <leader>d "_d

... quindi in modalità normale, è possibile utilizzare \dwper eliminare una parola, senza influire sul "registro.


3

Per fare questo nel modo VIM, usi intenzionalmente i registri yank, delete e altri.

Register "0è il registro yank. Tutto ciò che strattoni verrà messo qui, ma le eliminazioni non toccano mai il registro "0.

Quindi, nel tuo esempio, hai appena strappato una parola. Per sostituire una parola con ciò che hai appena strappato, approfitta delle eliminazioni che non toccano mai il registro yank. Quindi spostati sulla parola target, eliminala con dw, quindi incolla dal tuo registro yank con "0p, o meglio ancora, cwquindi ^R0(che è ripetibile).

Una chiusura opposta al registro yank è il registro delle piccole cancellazioni "-. Qualsiasi piccola eliminazione o rimozione di modifiche viene messa qui, ma gli yank non toccano mai "-. Una cancellazione viene considerata piccola se è inferiore a una riga intera.

Registri "1: "9sono i registri della cronologia di eliminazione. Con il "1contenuto dell'ultima eliminazione di grandi dimensioni o la rimozione delle modifiche e il "9contenimento dell'ultima eliminazione di grandi dimensioni o la rimozione delle modifiche. Solo eliminazioni che non sono piccole, vale a dire le eliminazioni di una linea o più, vengono spinti su "1- "9.

Per qualsiasi operazione che modifica un registro, anche una copia viene sempre inserita nel registro predefinito, ovvero senza nome "". Questo è il registro usato quando non si nomina esplicitamente un registro.

Il registro "_è il registro del buco nero ed è sempre vuoto. Se lo elimini, nulla in nessun registro viene cambiato, nemmeno il ""registro predefinito o il registro del buco nero stesso. Il testo rimosso è completamente sparito, a parte la cronologia degli annullamenti. Tirare o incollare dal registro del buco nero non fa praticamente nulla.

Il registro del buco nero "_ti consente di fare cose come prima una piccola eliminazione, quindi una serie di altre eliminazioni in "_senza modificare il registro delle piccole eliminazioni "-, quindi incollare la tua prima piccola eliminazione.

Altri registri sono l'ultimo registro inserito "., i registri del nome file "%e "#il registro dei comandi, il registro di ":ricerca "/e il registro delle espressioni "=.

È possibile ottenere un elenco di tutti questi registri e dei relativi contenuti dal comando :register. Questo comando è molto utile per sperimentare e imparare cosa finisce dove.


2

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.


2

Per ripetere l'incollaggio utilizzare il comando modifica.

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

sostituirà la parola con i contenuti del reg. 0 e ripetiamolo con.

Questo è ottimo per cgn(VIM 7.4) per sostituire i modelli di ricerca:

  • Prima ricerca con /o*
  • cgn ^R0ESC
  • .per ripetere alla prossima partita o nper saltare

1

Poiché non è ancora incluso, di solito sostituisci le stringhe con :%s/.../.../e puoi farlo anche con la parola sotto il cursore.

  1. Inserisci la prima parte del comando, quello che stai cercando: :s/find/
  2. Quindi fai clic <ctrl-r>e scegli con il cursore la parola con cui desideri sostituirla.
  3. Quindi fai clic su <ctrl-w>(piccola "parola") o <ctrl-a>(grande "parola) per incollare la parola sotto il cursore nella riga di comando
  4. Quindi finisci il comando.

Vedi il link su come usare il cursore nella riga di comando .


1

Di solito uso questo: ywper strappare foo, quindi eliminare barcon dw, e come passaggio finale, mettere foodal registro 0che contiene il testo strappato usando "0p. Ripetere l'operazione con punto ( .) secondo necessità.

Inoltre, invece di ywe dw, è possibile utilizzare yiwe diw(notare l'extra i- significa all'interno ). Con ciò puoi strappare o cancellare una parola da qualsiasi posizione al suo interno , non solo all'inizio della parola.


0

Uso questo plugin per espandere la regione di selezione: https://github.com/terryma/vim-expand-region

Quindi la mia combinazione per cambiare una parola sarà: vvpin qualsiasi luogo di una parola.

Ho anche un trucco per salvare i contenuti dei registri senza nome dopo averli incollati, così posso ripeterlo.

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

(i miei appunti sono auto-selezionati)


0

Sto usando la mappatura dei tasti di seguito per sostituire la parola corrente con la parola copiata.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwcopia una parola. Passa a una parola. ,rrsostituisci la parola.
La chiave del leader è mappata a ,.


,rwavrebbe più senso, e su QWERTY è probabilmente un smidgen più facile e veloce da eliminare. Su DVORAK, ho scelto ,rc, che sebbene non abbia molto senso, è più facile e veloce di tutti. Su DVORAK, ,rwè uno spettacolo horror;)
Paul Parker

0

Innanzitutto, vai all'inizio della parola che vuoi strappare. Se sei nel mezzo della parola, fallo solo bper tornare all'inizio. Quindi fai uno yestrattone per l'intera parola, senza spazi finali ( yank to end). Infine, vai alla parola che vuoi sostituire, magari eseguendo walcune volte, e fai un vepper entrare nella vmodalità di selezione isual, seleziona fino alla eseconda parola e pasta il contenuto dell'ultimo strappo.

(Se qualcuno vuole sapere perché non ho semplicemente commentato la risposta accettata, per la piccola modifica dell'uso yepiuttosto che per yw, è perché la mia reputazione su questo stack è ancora troppo bassa.)


0
  1. usa ywper strappare il mondo, vai nel mondo che vuoi cambiare.
  2. utilizzare vper selezionare il mondo veo in vwbase alla situazione.
  3. entra pper pasterizzare il mondo che hai copiato per sostituire il blocco selezionato

0

Aggiungendo alle altre risposte migliori. Un po 'troppo ovvio ma potresti semplicemente incollare prima di eliminare. 'yw' quindi vai alla parola che vuoi sostituire, 'pldw' (incolla, sposta un carattere a destra, elimina la parola.

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.