Posso fare un interattivo: sostituire (cercare e sostituire)?


17

A volte lo uso :scon una regexp complicata che può o non può essere corretta, o non sono sicuro di voler sostituire tutte le partite.

C'è un modo in cui posso dire a Vim di confermare ogni corrispondenza trovata prima che sostituisca effettivamente il testo?

Risposte:


20

Sì! Usa la cbandiera per :substitute. Da :help substitute:

[c]     Confirm each substitution.  Vim highlights the matching string (with
        hl-IncSearch).  You can type:                           :s_c
            'y'     to substitute this match
            'l'     to substitute this match and then quit ("last")
            'n'     to skip this match
            <Esc>   to quit substituting
            'a'     to substitute this and all remaining matches {not in Vi}
            'q'     to quit substituting {not in Vi}
            CTRL-E  to scroll the screen up {not in Vi, not available when
                        compiled without the +insert_expand feature}
            CTRL-Y  to scroll the screen down {not in Vi, not available when
                        compiled without the +insert_expand feature}

Esempio di utilizzo è semplice come torta:

%s/old/new/c

Questo è molto utile, ma non lo sapevo fino a 2 settimane fa :-) Ed è disponibile anche in vecchio vi :-)

Suggerimento bonus: potresti anche voler usare :set nowrapscan; questo impedisce a Vim di spostarsi verso l'alto quando colpisce il fondo. Ho trovato che ciò è particolarmente utile quando si usa la cbandiera.


19

Oltre a ciò che ha detto Carpetsmoker:

L' impostazione &incsearch( set incsearch) in Vim è davvero utile. Puoi usarlo insieme a un trucco utile e poco conosciuto.

Il trucco è provare la tua regex complessa semplicemente usando il comando /o ?. Vim utilizzerà l' &incsearchimpostazione per mostrare le partite in modo interattivo. Una volta che sei soddisfatto del regex, puoi usare :%s//replacementVim per usare la ricerca precedente.

Notare come la parte in //è vuota (è qui che si inserisce il testo da cercare). Se lo lasci vuoto, stai dicendo a Vim di usare la regex di ricerca precedente. Con questo, è possibile digitare una regex complessa con /e avere tutti i vantaggi di set incsearch, quindi utilizzare il %s//replacementcomando per eseguire effettivamente la ricerca e sostituire.

Se vuoi qualcosa di simile a incsearch per i :scomandi, dai un'occhiata a vim-over , ma preferisco semplicemente usare il modo nativo di Vim.


Usavo una variante di questo: basta usare :%s/pattern/replace/e quindi premere uper annullare, è possibile vedere le parti che Vim è cambiato se si è hlsearchabilitato. E puoi sostituire di nuovo questo testo con ^R.
Martin Tournoij,

7

La mia sostituzione interattiva preferita è quella di cercare utilizzando /e passare attraverso le partite utilizzando n.

Quindi seleziona la corrispondenza usando gne quindi sper sostituire il testo con quello che mi piace.

E ripeti passando alla partita successiva e premendo.


Questo è un trucco molto carino, perché è: (1) interattivo, (2) puoi andare alla partita precedente se l'hai saltato accidentalmente (qualcosa che non puoi fare usando :s/old/new/gc).
Ayrat,

3

In Neovim c'è anche l' 'inccommand'opzione che ti consente di vedere in anteprima il risultato del :scomando mentre lo digiti.


1

A beneficio di tutti, è incsearchstato aggiornato in vim8 per mostrare anche l'anteprima durante la digitazione del modello

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.