☰ menu
Pavel Satrapa

Hledání

Příkaz k vyhledání řetězce znaků můžete ve vim zadat dvěma základními způsoby. Klávesa / zahájí hledání směrem vpřed (ke konci souboru), zatímco ? požaduje hledání v protisměru (k začátku textu). Oba příkazy se zamozřejmě zadávají v normálním režimu.

Jakmile stisknete / či ?, ocitne se kurzor ve stavovém řádku, do jehož první pozice vepíše vámi zadaný příkaz, abyste věděli, na čem jste. Připište za něj hledaný řetězec a zahajte hledání klávesou [Enter]. Kurzor přistane na prvním znaku nejbližšího výskytu hledaného řetězce v daném směru.

Jestliže text požadovaný řetězec neobsahuje, ohlásí editor

Pattern not found

a kurzor ponechá na původní pozici. Speciálním případem je, když text sice hledaný řetězec obsahuje, ne však v požadovaném směru. Řekněme, že hledáte směrem vpřed, ale od aktuální pozice do konce souboru se řetězec nevyskytuuje. Zato je k nalezení v textu před kurzorem. Chování vim v tomto případě závisí na nastavení proměnné wrapscan. Pokud je zapnuta (implicitně je, lze nastavit příkazem :set wrapscan), editor bude po dosažení konce souboru pokračovat v hledání od jeho začátku. Najde-li jej, přesune kurzor obvyklým způsobem na jeho začátek a doprovodí svůj čin hlášením

Search hit BOTTOM, continuing at TOP

Zda editor má či nemá rozlišovat malá a velká písmena řídí proměnná ignorecase. Je-li nastaveno :set ignorecase, vim je nebude rozlišovat. Pokud naopak použijete :set noignorecase, budou malá a velká písmena považována za odlišná (to je implicitní stav). Při nastavení :set smartcase se rozlišování malých/velkých písmen snaží chovat inteligentně. Zapíšete-li hledaný řetězec malými písmeny, hledá malá i velká. Pokud použijete alespoň jedno velké písmeno, hledá řetězec přesně v tom tvaru, ve kterém jste jej zadali.

Hlavní kouzlo vyhledávání spočívá v tom, že pro specifikaci hledaného textu máte k dispozici velmi silné prostředky. Jedná se o tak zvané regulární výrazy. Jejich problematika je však poněkud obsáhlá, takže jsem jim věnoval samostatnou kapitolu.

Příjemnou vychytávkou je klávesa *, jejíž stisknutí najde následující výskyt slova obsahujícího kurzor (nemusí být na začátku). Tato vlastnost je velmi užitečná například při editaci programů – opisovat názvy podprogramů při vyhledávání není nic zábavného. Stejný efekt má klávesa #, ale hledá směrem k začátku souboru, nikoli ke konci.

V souvislosti s hledáním je záhodno zmínit dvě volby ovlivňující prezentaci výsledků. :set hlsearch zajistí, že budou barevně zvýrazněny všechny výskyty naposledy hledaného vzoru. Po zapnutí :set incsearch vám vim už během psaní hledaného řetězce bude ukazovat pozici prvního nalezeného výskytu. Čili kam se přesune kurzor, pokud teď stisknete [Enter]. Ovšem dokud tak neučiníte, pozice kurzoru se nezmění. Může to být trochu matoucí, osobně tuto druhou volbu nezapínám.

Opakování

Chcete-li zopakovat hledání stejného řetězce, stačí zadat /[Enter]. Jestliže totiž vynecháte hledaný řetězec, použije se automaticky ten předchozí. Totéž samozřejmě platí pro příkaz ?.

Aby věc byla ještě rychlejší, jsou pro opakované hledání připraveny dva speciální příkazy. n (jako „next“) přesně opakuje poslední hledání, zatímco N hledá tentýž řetězec, avšak v opačném směru, než poslední použité hledání. Pokud tedy přejedete nejvhodnější výskyt, můžete se pomocí N snadno a rychle vrátit.

Všimněte si, že dvojice kláves /, ? a n, N dělají totéž, avšak v opačných směrech. Přitom druhou klávesu ve dvojici dostanete z první pouhým stisknutím [Shift] (v případě / a ? mluvím o původní americké klávesnici). Tato logika, kdy [Shift] obrací směr příkazu, je ve vim poměrně častá. Setkali jsme se s ní například při vyhledávání znaku na řádku (f hledá vpřed, F vzad).

Strhující závěr

Na závěr jsem si nechal opravdovou lahůdku. Hledání je totiž pohyb se vším, co k němu náleží. Můžete je proto kombinovat s modifikátory, které jsem popsal v kapitole o editaci textu. Takže například d/ahoj vymaže vše od stávající pozice kurzoru až k nejbližšímu následujícímu výskytu řetězce „ahoj“. Zatím jsem neviděl editor, který by umožňoval něco podobného tak jednoduše.