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
oldi samme linje (ikke bare den første forekomsten), bør du legge tilgpå slutten av kommandoen, så totalt vil du ha%s/old/new/gc - Åh, ja; jeg har
set gdefaultså 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åufor å angre, du kan se delene som Vim endret hvis du har aktiverthlsearch. Og du kan erstatte denne teksten igjen med^R.