Někdy používám :s
s komplikovaným regexp, který může nebo nemusí být správný, nebo nejsem jistě, když chci nahradit všechny shody.
Existuje nějaký způsob, jak mohu říct Vimovi, aby potvrdil každou nalezenou shodu, než skutečně nahradí text?
Odpověď
Ano! Pro :substitute
div použijte příznak c
>. From :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}
Příklad použití je jednoduchý jako koláč:
%s/old/new/gc
To je velmi užitečné, ale do 2 týdnů jsem o tom nevěděl 🙂 A je to dokonce k dispozici v ol „vi 🙂
Bonusový tip: Můžete také použít :set nowrapscan
; to zabrání tomu, aby se Vim při nárazu do spodní části zabalil nahoru. Zjistil jsem, že to je zvláště užitečné při použití příznaku c
.
Komentáře
- Také bych dodal, že pokud chcete nahradit všechny instance
old
ve stejném řádku (nejen první výskyt), měli byste přidatg
na konci příkazu, takže celkem budete mít%s/old/new/gc
- ach, jo; mám
set gdefault
takže mám tendenci to zapomenout přidat do příkladů @ e271p314 😅
odpověď
Kromě toho, co Carpetsmoker řekl:
Nastavení &incsearch
(set incsearch
) ve Vimu je opravdu užitečné. Můžete použijte jej spolu s užitečným a málo známým trikem.
Trik spočívá v vyzkoušení komplexního regexu pomocí /
nebo ?
příkaz. Vim použije nastavení &incsearch
k interaktivnímu zobrazování shod. Onc Pokud jste s regexem spokojeni, můžete použít :%s//replacement
k tomu, aby vim použil předchozí vyhledávání.
Všimněte si, jak se část v je prázdné (do tohoto místa jste vložili text, který chcete vyhledat). Necháte-li toto pole prázdné, říkáte Vimu, aby použil předchozí regex vyhledávání. Díky tomu můžete pomocí /
vypsat složitý regulární výraz a mít všechny výhody set incsearch
a poté použít %s//replacement
příkaz ke skutečnému provedení hledání a nahrazení.
Pokud chcete něco podobného incsearch pro :s
příkaz, podívejte se vim-over , ale raději používám nativní způsob Vim.
Komentáře
Odpovědět
Moje oblíbená interaktivní substituce je hledat pomocí / a procházet zápasy pomocí n .
Poté vyberte shodu pomocí g n a poté s až nahradit text textem, co se mi líbí .
A opakujte přesunutím na další zápas a stisknutím klávesy .
Komentáře
- Toto je velmi pěkný trik, protože je: (1) interaktivní, (2) můžete jít na předchozí zápas, pokud jste omylem přeskočili to (něco, co pomocí
:s/old/new/gc
) udělat nemůžete.
Odpovědět
, která vám umožní zobrazit náhled výsledku příkazu :s
během jeho psaní.
Odpověď
Ve prospěch všech byla incsearch
ve vim8 aktualizována, aby při psaní vzoru zobrazovala také náhled
:%s/pattern/replace/
a poté stisknoutu
pro vrácení zpět, uvidíte části, které Vim změnil pokud mátehlsearch
povoleno. A tento text můžete znovu nahradit^R
.