Jedną z najlepszych funkcji w Vim-ie jest wyszukiwanie i zamiana tekstu. Vim
oferuje tak potężny mechanizm, że aż trudno go całego objąć! Owszem, jest
szukanie zwykłego kawałka tekstu, ale to nie wszystko, co Vim umie. Podawałeś
kiedyś w komendach (na przykład DOS-owych) maskę plików? Takie copy *.*
a: . Właśnie to *.* to maska. Wyszukiwanie w Vim-ie potrafi znajdować
podobne maski. Ale od początku.
Żeby wyszukać jakiś kawałek tekstu, w trybie poleceń wciśnij / , a następnie
tekst, jakiego szukasz. Jak skończysz pisać, wciśnij
[Enter]. Zostaniesz przeniesiony do najbliższego
pasującego fragmentu (gdybyś wcisnął pytajnik, przeniosłoby cię do tyłu).
Teraz poruszasz się literką małe n do następnego pasującego fragmentu
w kierunku szukania, a dużym N w przeciwnym kierunku (dość często jest tak, że
gdy mała literka robi coś w jedną stronę, to duża/otrzymana z Shift-em robi to
w stronę przeciwną). Jeśli zaczyna cię denerwować fakt, że wszystko jest
podświetlone, wpisz w trybie poleceń :nohlsearch
(lub krócej :noh). Jeśli chcesz znaleźć tekst ze
znakiem \, to musisz go wpisać podwójnie (np.
C:\\WINDOWS odpowiada szukaniu tekstu C:\WINDOWS).
Jeśli chcesz szukać kropki, powinieneś ją poprzedzić backslashem (czyli
znaczkiem \ ): szukanemu plik\.txt odpowiada znalezione
plik.txt.
No to teraz maski. Jeśli spotkałeś się już z wyrażeniami regularnymi, to
wiesz, z czym to się je. W Vim-ie szukamy właśnie wyrażenia regularnego. Jeśli
zaś nie wiesz, jak to wygląda, to już wyjaśniam. Otóż w wyrażeniu takim pewne
sekwencje znaków mają specjalne znaczenie. Weźmy taką gwiazdkę. Znaczy ona
tyle, że litera stojąca bezpośrednio przed gwiazdką może wystąpić raz, kilka
razy lub wcale. Podobnie działa znak zapytania, z tym że znak przed
pytajnikiem może wystąpić raz lub wcale. A jeśli chcesz szukać znaku zapytania
lub gwiazdki, to musisz znaczek poprzedzić backslashem. Przykład:
\*szukamy mnie\? To będzie szukać tekstu
*szukamy mnie? A takie cóś
asdf? znajdzie
asd lub
asdf. Dobra, to teraz trudniejsze rzeczy.
Wyrażenie [asdf]lukrecja będzie szukać
alukrecja, slukrecja, dlukrecja lub
flukrecja. Po prostu wybiera literę spośród
podanych wewnątrz nawiasu kwadratowego. A jak znaleźć nawias kwadratowy?
Poprzedzić go backslashem: szukamy \[nawiasów\]
kwadratowych. To teraz znajdźmy wszystkie ciągi złożone z 3-6 literek
'a': a\{3,6\} Pewnie już kumasz, jak to mniej
więcej działa, nie? (KONIECZNIE wypróbowuj wszystkie podane składniki,
będziesz wiedział, jaki dają efekt) Połączmy to:
[abcde]\{3,10\} będzie szukało ciągów złożonych
z trzech do dziesięciu liter, gdzie litery to dowolne ze zbiioru a-e (czyli
trafi zarówno 'aaa', jak 'aac' i 'acebdacab' itd.) Oczywiście, że nie musisz
wpisywać całego alfabetu spomiędzy liter 'a' i 'e', wystarczy użyć
[a-e]. Proste, nie? (jak chcesz szukać tak minusa,
to umieść go zaraz za otwierającym nawiasem). I jeszcze dwie rzeczy: początek
linii oznacza się daszkiem ^, a koniec - dolarem $. To wymaga dalszego
wyjaśnienia. Otóż ani znak nowej linii poprzedzający wystąpienie ciągu, ani
taki znak kończący nie zostaną zaznaczone. I tak ^szukany
tekst$ znajdzie wszystkie linie z tekstem
szukany tekst, który przylega do początku
i końca linii - i tylko te literki: szukany
tekst. Żadnych zejść do nowej linii nie zaznaczy. Jeśli chcesz jednak,
żeby zaznaczył, to musisz wstawić zamiast ^ czy $ znak '\n' (zależy,
gdzie chcesz ten znak zaznaczyć). Co jeszcze? To powinno ci wystarczyć,
a pewnie nawet będzie więcej, niż będziesz potrzebować. Ale jeśli jednak nie
wystarczy, to odsyłam cię do tematu regexp w pomocy Vim-a.
Oczywiście dorzucam tu jeszcze moje
doświadczenia z wyrażeniami regularnymi.
To by było wyszukiwanie. Teraz zamiana. Do tego służy komenda
:substitute, pisana krócej
:s Składnia: :zakres
s/co_szukamy/na_co_zmieniamy/opcje Zakres szukania domyślnie to jedna
linijka (ta, w której stoi kursor). Gdy chcesz zamieniać w zaznaczeniu, to
przejdź do trybu zaznaczania (VISUAL), zaznacz
fragment i wciśnij dwukropek. Tu masz od razu wpisany zakres. A jeśli chcesz
przeszukać cały plik, to za zakres wstawiasz znak procenta %
(:%s/...).
Opcje szukania. Przy zamianie
tekstu domyślnie zamieniane jest tylko pierwsze wystąpienie pasującego tekstu.
Żeby zamienić wszystkie, w opcjach musisz podać literkę małe g:
:s/qaz/wsx/g zamieni wszystkie wystąpienia
qaz na wsx
w aktualnej linijce. Jest jeszcze opcja małe i oraz opcja duże I. Pierwsza
mówi, że wielkość liter nie ma znaczenia, druga - że ma znaczenie. Domyślnie
jest ustawione, że wielkość liter się liczy. Chyba nie wspomniałem, że
pierwszy tekst (ten szukany) to wyrażenie regularne, a drugi tekst (to, na co
zamieniamy) to w zasadzie tylko zwykły tekst. To by było na tyle.