Vai alla prossima occorrenza della parola che ho appena cambiato


12

Se ho il seguente:

function foo(bar) {
    return bar + 1;
}

E io uso cwper cambiare il primo barin baz, come posso passare alla corrispondenza successiva bar, in modo da poter utilizzare .per fare lo stesso cambiamento?

Non posso usarlo *, perché cerca la parola corrente sotto il cursore e non ho stupidamente cercato per barla prima volta, quindi nnon funzionerà.

C'è un modo semplice per cercare la ricorrenza successiva della parola com'era prima che la cambiassi?

Io non voglio fare una ricerca e sostituzione, perché o ci sono altre occorrenze barnel mio file che io non voglio cambiare, o perché ci sono stati solo due casi di bar, e ho dimenticato :%s/bar/baz/prima ho iniziato e che è troppo molti sforzi per cambiare l'unica istanza rimanente.


2
Ciò non segue totalmente il flusso di lavoro che hai descritto, ma vim-oblique migliora la *ricerca. Soprattutto consente di *selezionare visivamente la parola corrente senza spostare il cursore. Una volta installato, è possibile eseguire *ciwl'inserimento della parola precedente nel registro di ricerca e modificare la parola. Quindi puoi usare ne ..
statox

Premendo n si passa alla ricorrenza successiva dell'ultimo modello cercato. Perché non l'hai provato?
SibiCoder,

... perché non ho cercato di arrivare alla prima occorrenza, quindi nnon funzionerà.
Roger Lipscombe,

Risposte:


14

Il testo appena modificato è cwstato tagliato nel registro senza nome in modo da poterlo riutilizzare con:

/<C-r>"<CR>

per passare alla ricorrenza successiva del testo coperto dall'ultima modifica.


5

Per estendere da romainl come flusso di lavoro completo ...

Se sei più interessato a eseguire una modifica di questo tipo e poi ti rendi conto che devi applicare le stesse modifiche su un paragrafo / funzione puoi usare i registri "e ..

Nel tuo esempio puoi eseguire la modifica iniziale dell'argomento. Se entri in modalità visiva (utilizzerei Visual Line solo per assicurarmi di selezionare tutto correttamente) e quindi applicare una ricerca e sostituzione.

V]] - Visual Line, alla fine del paragrafo / funzione.

  • : - Dato che sei in modalità visiva, questo diventa :'<,'>
  • s/ - Trova
  • CTRL+ "- last yank / delete item (barra nell'esempio)
  • / - e Sostituisci
  • CTRL+ .- ultimo inserto (baz nell'esempio)

Questo modello richiede un po 'di tempo per abituarsi poiché è necessario utilizzarlo. Il più delle volte vorresti semplicemente applicare la ricerca e la sostituzione all'intera funzione incluso l'argomento, ma è un bel modo per non eseguire l'anti-pattern "Fai il lavoro, renditi conto che avresti dovuto farlo meglio, annullare e ripetere correttamente."


2

Se non ti dispiace premere una combinazione diversa rispetto a cw, allora credo che puoi ottenere facilmente ciò che desideri, definendo una scorciatoia. Quello che puoi fare è posizionare quanto segue

nmap <leader>a "1yiw:let @/=@1^Mciw

nel tuo .vimrcfile. Si noti che ^M è un'acquisizione della chiave di ritorno e non dei caratteri ^e M. Puoi ottenerlo premendo Ctrl+ Vin modalità inserimento seguito da Enter. Ora, con questo definito, premendo <leader>afarà lo stesso di cw, ma ora la parola (prima della modifica) sarà nel tuo "ultimo registro di ricerca" (cioè il /registro), quindi premendo ndopo aver apportato la modifica e restituito in modalità normale ti porterà alla prossima occorrenza. Allo stesso modo, premendo si Naccederà alla ricorrenza precedente.

La scorciatoia Puoi ovviamente scegliere una scorciatoia diversa da quella <leader>a, ma trovo solo che si tratta di una scorciatoia molto accessibile. Personalmente ho impostato <leader>su in ,modo che ho solo bisogno di premere ,seguito da a, ma questo perché non uso una tastiera americana, in modo che la mia \sia nascosta in qualche modo (credo \sia l'impostazione predefinita <leader>).

Spiegazione L'idea è davvero semplice. Sposta la parola sotto il cursore nel registro di ricerca /e poi fai cw. Questo nmap <leader>a "/yciwera ciò a cui stavo mirando, ma sfortunatamente non penso che tu possa fare uno yank al registro di ricerca, quindi la soluzione è di strappare la parola sotto il cursore al 1registro, quindi impostare il /registro uguale a quello, e poi fare cw. Così "1yiwè la parte che trasporta la parola interna sotto il cursore nel registro 1. Se non conosci le parole interiori, puoi dare un'occhiata :help iw. Successivamente, :let @/=@1seguito da una cattura di Enterinserisce il contenuto del 1registro in /. A questo punto neNfunziona come occorrenza successiva e precedente della parola sotto il cursore, quindi ciwviene eseguita una a in modo che la parola sotto il cursore sia eliminata e Vim sia messo in modalità inserimento.

parola contro parola interiore Mi sono appena reso conto che supponevo che tu volessi l' intera parola sotto il cursore e non solo dal punto del cursore e in poi. Questo è il motivo per cui ho usato iwinvece che wovunque. In caso contrario, è necessario utilizzare

nmap <leader>a "1yw:let @/=@1^Mcw

anziché. Se il cursore si trova sulla prima lettera della parola, non c'è differenza.

dichiarazione di non responsabilità Questa soluzione probabilmente non funzionerà bene se si tenta di usarlo su qualcosa che contiene diverse cose da lettere, per esempio avendo il supporto cursore su una \o sostituendo iwcon iW, ib, iso ipo qualcosa del genere (anche se non so perché si farebbe vuoi questa funzione con intere frasi)

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.