Kan jag göra ett interaktivt: ersättare (sök & ersätta)?

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: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 till g 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

  • Jag brukade använda en variant av detta: Använd bara :%s/pattern/replace/ och tryck sedan på u för att ångra, du kan se de delar som Vim ändrade om du har aktiverat hlsearch. Och du kan ersätta den här texten igen med ^R.

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

I Neovim finns också

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *