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
div 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å 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øjeg
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
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
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
:%s/pattern/replace/
og tryk derefter påu
for at fortryde, du kan se de dele, som Vim ændrede hvis du har aktiverethlsearch
. Og du kan erstatte denne tekst igen med^R
.