Come ottenere un'anteprima per il comando di sostituzione?


9

Molto spesso mi trovo nel bisogno di eseguire una sostituzione che avrà corrispondenze risparmiate su un file di grandi dimensioni e con espressioni di ricerca e sostituzione non banali.

Ad esempio, supponiamo che io abbia alcune chiamate di funzione come okFunction(arg1, arg2 arg3). Gli args differiranno con ogni chiamata di funzione, ovviamente. Ora dì che ho scoperto una funzione migliore che non ha bisogno arg2. Posso facilmente regolare l'intero file con

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

Sebbene concettualmente semplice, non sono sicuro di avere la sintassi giusta in questo schema piuttosto lungo. La cbandiera aiuta davvero qui, ma il problema è che quando si chiede conferma, vim non mostrerà con quale partita verrà sostituita. Voglio dire, mostrerà l'espressione sostitutiva, ma non il risultato valutato. Se confermo la sostituzione con y, vim passerà immediatamente alla prossima partita e non sarò in grado di vedere se ho fatto degli errori.

Ho trovato il plugin vim-over che risolve parzialmente il problema, ma solo se tutti i calcoli sono visibili sullo schermo quando si digita il comando. Una volta premuto Invio, il comportamento è esattamente lo stesso che ho descritto sopra e non ottengo un'anteprima.

Quindi, c'è un modo per ottenere vim per valutare l'espressione sostitutiva quando si chiede conferma sui comandi sostitutivi?


2
che è un elemento whishlist nel tracker vim-bug (scusate se non lo trovo attualmente)
Christian Brabandt,

2
Per quello che vale di solito uso la sostituzione sulla prima riga per sostituirla senza il %, controlla che il risultato sia quello che mi aspettavo e poi uso la sostituzione con %(sono solo alcune battute:) :<up><c-b>%. Chiaramente un'opzione di anteprima sarebbe molto più efficiente di così. Sebbene non sia disponibile alcuna patch, si potrebbe avvolgere la sostituzione in una funzione vimscript con questo tipo di opzione, ma suona come un sacco di lavoro ...
statox

2
@ChristianBrabandt Lo ha trovato . È ancora con priorità non classificata ...
Vitor Eiji

2
@VitorEiji non era quello a cui stavo pensando. Ma in realtà non importa, poiché al momento non è possibile. Neovim fornisce l'opzione 'inccommand', che potrebbe funzionare (o no, non proprio adesso)
Christian Brabandt,

Il male prevede la sostituzione; Non so come, però.
Geremia,

Risposte:


2

Una soluzione alternativa sono le macro. Evidenzia tutte le aree problematiche ed esegui la sostituzione su una riga alla volta. Quindi decidere se lo vuoi o no. Una volta che hai finito nnella prossima area.

Per il tuo caso in particolare:

  1. Cerca aree: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Inizia a registrare una macro qq.
  3. Applicare :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Ferma la registrazione della macro q
  5. Annulla ( u) o vai al risultato di ricerca successivo ( n).
  6. Applica macro @q.
  7. Ripetere i passaggi 5 e 6 secondo necessità.

Ovviamente non è esattamente quello che stavi cercando, ma di solito è quello che faccio.


questo è figo! Non ho mai capito che quando fai una ricerca con /esso si comporta anche come una selezione visiva - bello.
the_velour_fog

@the_velour_fog " /... si comporta come una selezione visiva." In realtà no. Il motivo per cui funziona è perché :s//agisce sulla riga corrente e l'utilizzo nti porta alla ricorrenza successiva.
Tumbler41,

1
Se non specifichi un motivo per :s/pattern/replacementuserà l'ultima stringa di ricerca, quindi nel passaggio 3 puoi effettivamente applicare :s//betterFunction(\1, \3)/gper salvare un po 'di digitazione.
Haegin,

@ Tumbler41 ah, grazie per il chiarimento. Sì, faccio anche questa tecnica di base della ricerca , quindi applico la macro , di solito prima popolo l'archivista e uso :vimgrep /pattern/ ##quindi applica la macro , in questo modo se si scopre che il mio modello in realtà corrisponde in modo coerente e la cosa macro è troppo noiosa, posso quindi rapidamente tornare a :argdo %s/.../..../gce iniziare a volare attraverso l'operazione
the_velour_fog
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.