Kan jeg gjøre en interaktiv: erstatning (søk & erstatte)?

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 til g 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

  • Jeg brukte en variant av dette: Bare bruk :%s/pattern/replace/ og trykk deretter på u for å angre, du kan se delene som Vim endret hvis du har aktivert hlsearch. Og du kan erstatte denne teksten igjen med ^R.

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

I Neovim er det også

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *