Kan jeg foretage en interaktiv: erstatning (søg & erstatte)?

Nogle gange bruger jeg :s med en kompliceret regexp, som måske eller måske ikke er korrekt, eller jeg er ikke sikker på, om jeg vil erstatte alle matches.

Er der nogen måde, jeg kan bede Vim om at bekræfte hvert match, det finder, før det rent faktisk erstatter teksten?

Svar

Ja! Brug c flag til :substitute: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å brug er simpelt som pie:

%s/old/new/gc 

Dette er meget nyttigt, men vidste ikke dette før for 2 uger siden 🙂 Og det er endda tilgængeligt i ol “vi 🙂

Bonus tip: Det kan også være en god idé at bruge :set nowrapscan; dette forhindrer Vim i at indpakke til toppen, når den rammer bunden. Jeg har fundet dette at være særligt nyttigt når jeg bruger c flag.

Kommentarer

  • Jeg vil også tilføje, at hvis du vil erstatte alle forekomster af old i samme linje (ikke kun den første forekomst), skal du tilføje g i slutningen af kommandoen, så i alt har du %s/old/new/gc
  • Åh, ja; jeg har set gdefault så jeg har en tendens til at glemme at tilføje det i eksempler @ e271p314 😅

Svar

Ud over hvad Carpetsmoker sagde:

Indstillingen &incsearch (set incsearch) i Vim er virkelig nyttig. Du kan brug det sammen med et nyttigt og lidt kendt trick.

Tricket er at prøve din komplekse regex ved bare at bruge / eller ? kommando. Vim bruger indstillingen &incsearch til at vise kampe interaktivt. Hvis du er tilfreds med regex, kan du bruge :%s//replacement for at få vim til at bruge den forrige søgning.

Bemærk hvordan delen i // er tomt (det er her, du placerer teksten til søgning). Hvis du lader det være tomt, beder du Vim om at bruge den forrige søgning regex. Med dette kan du skrive en kompleks regex med / og have alle fordelene ved set incsearch og derefter bruge %s//replacement kommando for faktisk at udføre søgningen og erstatte den.

Hvis du vil have noget, der ligner incsearch for :s kommandoer, så tjek vim-over , men jeg foretrækker bare at bruge den native Vim-måde.

Kommentarer

  • Jeg brugte en variant af dette: Brug bare :%s/pattern/replace/ og tryk derefter på u for at fortryde, du kan se de dele, som Vim ændrede hvis du har aktiveret hlsearch. Og du kan erstatte denne tekst igen med ^R.

Svar

Min yndlings interaktive erstatning er at søge ved hjælp af / og gå igennem kampene ved hjælp af n .

Derefter vælg match ved hjælp af g n og derefter s til erstatter teksten med hvad jeg vil .

Og Gentag ved at gå til næste kamp og trykke på .

Kommentarer

  • Dette er et meget flot trick, fordi det er: (1) interaktivt, (2) du kan gå i forrige kamp, hvis du ved et uheld sprang over det (noget, du ikke kan gøre ved hjælp af :s/old/new/gc).

Svar

I Neovim er der også

mulighed, der giver dig mulighed for at få vist resultatet af :s -kommandoen, mens du skriver det.

Svar

Til gavn for alle blev incsearch opdateret i vim8 for også at vise forhåndsvisning, når du skriver mønsteret

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *