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 ?

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.


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.


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.


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ę).


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”.


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 .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.