Interaktywne wyszukiwanie / zamiana wyrażenia regularnego w Vimie?

265

Znam regex dla globalnej zamiany,

     %s/old/new/g

Jak zabierasz się za interaktywne wyszukiwanie w Vimie ?

kal
źródło

Odpowiedzi:

462

Dodaj flagę c (w wierszu polecenia vim):

:%s/old/new/gc

wyświetli monit „tak / nie” przy każdym wystąpieniu „starego”.

„stary” jest podświetlony w tekście;  w dolnej części okna jest napisane „zastąpić nowym (t / n / a / q / l / ^ E / ^ y)?)”

Wbudowana pomoc Vima zawiera przydatne informacje o opcjach dostępnych po wybraniu zamiany z potwierdzeniem. Posługiwać się:

:h :s

Następnie przewiń do sekcji potwierdzającej opcje. Zrzut ekranu poniżej:

Tekst z napisem „[C] Potwierdź każde zastąpienie. [...] CTRL-Y, aby przewinąć ekran w dół”

Na przykład, aby zastąpić to i wszystkie pozostałe dopasowania, użyj a.

Mark Biek
źródło
30
+1, nauczyłem się dziś czegoś nowego! vim ma tak wiele ukrytych tajemnic .. :)
Marc Novakowski
10
Nauka poleceń vim przypomina trochę grę w Nethacka. Nigdy nie wiesz, jakie cuda przyniesie jedna postać.
Mark Biek
22
Wyobrażam sobie, że „c” oznacza „potwierdź”
matpie
8
Szczerze mówiąc, nie staram się wyglądać na tak ponurego, ale wszystko to można znaleźć, wykonując polecenie „: help: s”, które doprowadziłoby cię prosto do „: help: s_flags”.
Jeremy Cantrell,
13
@jeremy: to wymaga wiedzy o istnieniu polecenia pomocy oraz wiedzy, że należy wpisać przełącznik „dwukropek”, aby przejść do odpowiedniego pliku pomocy. Jak i gdzie można się tego nauczyć?
Dennis
79

Mark Biek wskazał za pomocą:

%s/old/new/gc

dla wyszukiwania globalnego zamień z potwierdzeniem dla każdej zamiany. Ale lubię także interaktywnie sprawdzać, czy stary tekst jest poprawnie dopasowany. Najpierw przeprowadzam wyszukiwanie za pomocą wyrażenia regularnego, a następnie ponownie używam tego wzorca:

/old.pattern.to.match
%s//replacement/gc

s//Użyje ostatniego wyszukiwania wzorca.

Vincent Scheib
źródło
9
Jedną z największych zalet używania / uczenia się vima jest głębokość króliczej nory!
Ken
2
Fajnie, zawsze szukałem, a następnie użyłem <Cr> /, aby wkleić ostatnie wyszukiwanie do polecenia zastępczego.
Atilla Filiz
Dokładnie to, czego brakuje mi w Sublime Text!
Xenofex,
Ta odpowiedź jest szczególnie przydatna, ponieważ wyobrażam sobie, że wiele razy decydujesz się na zastąpienie wystąpień słowa, jest to słowo, którego właśnie szukałeś.
M_M
20

Myślę, że szukasz cnp. s/abc/123/gcSpowoduje to, że VIM potwierdzi zamiany. Zobacz: pomoc: zastąp za więcej informacji.

Logan Capaldo
źródło
9

Zwykle używam polecenia find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

To find "old", substitute 3 characters for "new", find next, repeat substitute, i tak dalej.

Jest to uciążliwe dla masowych substytucji, ale pozwala selektywnie ignorować niektóre stare wystąpienia (wystarczy nacisnąć nponownie, aby znaleźć następne zamiast .powtarzać substytucję).

paxdiablo
źródło
Używam tego również, nawet do podobnych tekstów. (3cW <texthere> <ESC> <przenieś do nowej lokalizacji>. <move>. <move>.)
strager
1
To nie jest antypattern! To jest słodkie. Możesz wyszukiwać w przeciwnym kierunku za pomocą N. Naprawdę dobrze, jeśli widzisz słowo i chcesz je zmienić. * cwNewText <ESC> Nnn (To odskoczy od słowa pod kursorem, ale potem wróci zaraz po zmianie następnego wystąpienia.
PEZ
co jest <CR>?
Sother
9

Jeśli chcesz policzyć liczbę wystąpień „abc”, możesz to zrobić %s/abc//gn. Nie zastępuje to niczego, a jedynie podaje liczbę wystąpień „abc”.

Amjith
źródło
3

Jeśli twój tekst zastępujący musi się zmienić dla każdego dopasowanego wystąpienia (tj. Nie po prostu wybierając Tak / Nie, aby zastosować pojedynczą zamianę), możesz użyć wtyczki Vima, którą stworzyłem, o nazwie interaktywne zastępowanie .

hwrod
źródło