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.
© 2016 Pavel Satrapa