Seek and destroy! I mean, seek and replace!

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.


Pomocy!!!
Powrót do jadłospisu