Ibland använder jag :s
med en komplicerad regexp som kanske eller kanske inte är korrekt, eller så är jag inte säker på om jag vill ersätta alla matchningar.
Finns det något sätt jag kan säga till Vim att bekräfta varje match som den hittar innan den faktiskt ersätter texten?
Svar
Ja! Använd c
-flaggan för :substitute
div Från. :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}
Exempel på användning är enkelt som cirkel:
%s/old/new/gc
Detta är väldigt användbart, men visste inte om detta förrän för två veckor sedan 🙂 Och det är även tillgängligt i ol ”vi 🙂
Bonustips: Du kanske också vill använda :set nowrapscan
; detta förhindrar att Vim slår in till toppen när den träffar botten. Jag har tyckt att det här är särskilt användbart när jag använder flaggan c
.
Kommentarer
- Jag skulle också vilja tillägga att om du vill ersätta alla förekomster av
old
i samma rad (inte bara den första förekomsten) bör du lägga tillg
i slutet av kommandot så totalt har du%s/old/new/gc
- Åh, ja, jag har
set gdefault
så jag glömmer att lägga till det i exempel @ e271p314 😅
Svar
Förutom vad Carpetsmoker sa:
Inställningen &incsearch
(set incsearch
) i Vim är väldigt användbar. Du kan använd det tillsammans med ett användbart och lite känt trick.
Tricket är att prova din komplexa regex genom att bara använda /
eller ?
-kommando. Vim använder inställningen &incsearch
för att visa matchningar interaktivt. Om du är nöjd med regex kan du använda :%s//replacement
för att vim ska använda den tidigare sökningen.
Lägg märke till hur delen i //
är tomt (det är där du lägger texten att söka). Om du lämnar det tomt säger du till Vim att använda föregående sökregex. Med detta kan du skriva ut en komplex regex med /
och ha alla fördelarna med set incsearch
och sedan använda %s//replacement
kommando för att faktiskt utföra sökningen och ersätta.
Om du vill ha något som liknar incsearch för :s
kommandon, kolla in vim-over , men jag föredrar bara att använda det ursprungliga Vim-sättet.
Kommentarer
Svar
Min favorit interaktiva ersättning är att söka med / och gå igenom matchningarna med n .
Sedan välj matcha med g n och sedan s till ersätter texten med vad jag vill .
Och upprepa genom att gå till nästa match och trycka på .
Kommentarer
- Detta är ett mycket trevligt knep, eftersom det är: (1) interaktivt, (2) du kan gå tidigare match om du av misstag hoppade över det (något som du inte kan göra med
:s/old/new/gc
).
Svar
alternativ som låter dig förhandsgranska resultatet av kommandot :s
medan du skriver det.
Svar
Till förmån för alla uppdaterades incsearch
i vim8 för att också visa förhandsvisning när du skriver in mönstret
:%s/pattern/replace/
och tryck sedan påu
för att ångra, du kan se de delar som Vim ändrade om du har aktiverathlsearch
. Och du kan ersätta den här texten igen med^R
.