Noen ganger bruker jeg :s
med en komplisert regexp som kanskje eller ikke er riktig, eller jeg er ikke sikker på om jeg vil erstatte alle treff.
Er det noen måte jeg kan fortelle Vim å bekrefte hver kamp den finner før den faktisk erstatter teksten?
Svar
Ja! Bruk c
flagget for :substitute
. Fra :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}
Eksempel på bruk er enkelt som kake:
%s/old/new/gc
Dette er veldig nyttig, men visste ikke om dette før for to uker siden 🙂 Og det er til og med tilgjengelig i ol «vi 🙂
Bonustips: Det kan også være lurt å bruke :set nowrapscan
; Dette forhindrer Vim i å pakke seg opp når den treffer bunnen. Jeg har funnet dette å være spesielt nyttig når jeg bruker c
flagget.
Kommentarer
- Jeg vil også legge til at hvis du vil erstatte alle forekomster av
old
i samme linje (ikke bare den første forekomsten), bør du legge tilg
på slutten av kommandoen, så totalt vil du ha%s/old/new/gc
- Åh, ja; jeg har
set gdefault
så jeg pleier å glemme å legge det til i eksempler @ e271p314 😅
Svar
I tillegg til det Carpetsmoker sa:
Innstillingen &incsearch
(set incsearch
) i Vim er veldig nyttig. Du kan bruk det sammen med et nyttig og lite kjent triks.
Trikset er å prøve ut den komplekse regexen din ved å bare bruke /
eller ?
-kommando. Vim vil bruke &incsearch
-innstillingen for å vise kamper interaktivt. Hvis du er fornøyd med regex, kan du bruke :%s//replacement
for å få vim til å bruke forrige søk.
Legg merke til hvordan delen i //
er tomt (det er der du legger teksten til søk). Hvis du lar det stå tomt, ber du Vim om å bruke forrige søkeekseks. Med dette kan du skrive ut en kompleks regex med /
og ha alle fordelene med set incsearch
, og deretter bruke %s//replacement
kommando for å faktisk utføre søket og erstatte det.
Hvis du vil ha noe som ligner på incsearch for :s
kommandoer, sjekk ut vim-over , men jeg foretrekker bare å bruke den opprinnelige Vim-måten.
Kommentarer
Svar
Min favoritt interaktive erstatning er å søke ved hjelp av / og gå gjennom kampene med n .
Deretter velg samsvar med g n og deretter s til erstatter teksten med det jeg liker .
Og Gjenta ved å gå til neste kamp og trykke .
Kommentarer
- Dette er et veldig hyggelig triks, fordi det er: (1) interaktiv, (2) du kan gå forrige kamp hvis du ved et uhell hoppet over det (noe du ikke kan gjøre med
:s/old/new/gc
).
Svar
alternativ som lar deg forhåndsvise resultatet av :s
-kommandoen mens du skriver det.
Svar
Til fordel for alle, ble incsearch
oppdatert i vim8 for også å vise forhåndsvisning når du skriver inn mønsteret
:%s/pattern/replace/
og trykk deretter påu
for å angre, du kan se delene som Vim endret hvis du har aktiverthlsearch
. Og du kan erstatte denne teksten igjen med^R
.