☰ menu
Pavel Satrapa

Pohyby v textu

vim nabízí velmi široký sortiment příkazů pro pohyby v textu. Samozřejmě nemá smysl snažit si je všechny vsoukat do hlavy hned zpočátku. Začněte se skromnější kolekcí a snažte se ji postupně rozhojňovat.

Svého času jsem se domníval, že vůbec nemá smysl zatěžovat si hlavu myriádou nejrůznějších pohybových příkazů. Například taková } vás přesune na konec odstavce. No bóže, to je toho! Stačí pár pohybů o řádek dolů a dostanu se tam také. Vtip spočívá v tom, že vim dovede zkombinovat libovolný pohybový příkaz s příkazem editačním (podrobněji o tom pohovořím v části o editaci textu). Výsledkem je, že bych líbal nohy tomu, kdo vymyslel, že pravá složená závorka mne přesune na konec odstavce, protože díky ní mohu zcela triviálně pouhými dvěma znaky odstavec vymazat, přeformátovat či zkopírovat do vyrovnávací paměti. A to jsou operace, které potřebuji velmi často.

Základní pohyby

Pohyby vždy vycházejí z normálního režimu. Základní čtveřice samozřejmě umožňuje posunout se o jeden znak doleva, doprava, nahoru a dolů. V každém slušném editoru tuto funkci zabezpečují kurzorové klávesy. Ve vim ji mají na starosti klávesy h, l, k a j.

h-doleva; l-doprava, k-nahoru, j-dolu

Teď se pravděpodobně domníváte, že autoři vim se udeřili hlavou o futro nebo je postihlo něco daleko horšího. Nám pamětníkům to trochu připomíná ovládání her pro ZX Spectrum. Pro zmíněnou obludnost však existují dva rozumné důvody:

  1. Ovládání je převzato z editoru vi, který vznikal v době, kdy K. Kurzor ještě chodil po houbách a zdaleka ne každý terminál oplýval po něm pojmenovanými klávesami.

  2. Lidé, píšící na rozdíl ode mne všemi deseti, nemusejí přestěhovávat ruce ze základní klávesnice a zoufale se tak brzdit.

A abych vás uklidnil ještě více: jen zcela výjimečně se ocitnete v situaci, kdy byste skutečně museli tyto klávesy používat (pokud nechcete). Většina moderních počítačů, terminálů a jejich emulátorů totiž má stejné funkce i na obvyklých kurzorových klávesách. Můžete tedy pracovat tak, jak jste zvyklí.

Druhým nejčastějším pohybem je posun o jednu obrazovku. Ten ve vim zajistí klávesové kombinace Ctrl-F (směrem dolů, Forward) a Ctrl-B (vzhůru, Backward). V běžných implementacích můžete pro tyto pohyby používat i obvyklé klávesy [PageDown] a [PageUp].

Opakování příkazů

Než se pustím do podrobnějšího pitvání nejrůznějších pohybových kreací, dovolím si upozornit na jednu velmi důležitou věc. Téměř všechny příkazy vim lze provádět opakovaně. Pokud nejprve napíšete číslo n a po něm určitý příkaz, bude proveden n-krát. Například pohyb o 20 znaků doleva by zajistil příkaz 20h. Opakovat lze skutečně prakticky všechno, včetně věcí dosti komplikovaných.

Příklad:

vim je ideální nástroj pro neposlušné žáky. Mají-li stokrát napsat „Nemám vyrušovat při vyučování.“, stačí zadat

100oNemám vyrušovat při vyučování.[Esc]

Pohyby na řádku

V rámci jednoho řádku máte k dispozici několik příkazů, posouvajících kurzor na určené pozice. Nejprve si vezměme extrémy:

0 na začátek řádku (obvykle i [Home])
^ na první neprázdný znak řádku
$ na konec řádku (obvykle i [End]

Znaky ^ a $ jsou v Unixu standardně používány pro označování začátku a konce. Jejich výskyt zde by vás proto neměl překvapit. Příkazy 0 (je to nula, nikoli velké „o“) a ^ se od sebe liší na řádcích, které začínají skupinou mezer či tabulátorů. 0 vás přesune na první znak bez ohledu na jeho hodnotu. Naproti tomu ^ způsobí přesun na první viditelný znak (různý od mezery a tabulátoru).

Hodláte-li přeskočit na určitý sloupec, použijte klávesu | (svislá čára). Před ní musíte uvést číslo požadovaného sloupce. Bez něj vás přesune do sloupce číslo 1. Přesun do dvanáctého sloupce zajistí 12|.

Jistou zvláštností je vyhledávání určitého znaku na řádku. Hledá se vždy od pozice kurzoru směrem vpřed či vzad (podle příkazu) a pouze na aktuálním řádku. Příkaz je vždy následován znakem, který má být nalezen. K dispozici máte následující:

fznak na následující výskyt znaku
Fznak na předchozí výskyt znaku
tznak před následující výskyt znaku
Tznak za předchozí výskyt znaku
; opakuje poslední hledání na řádku
, opakuje poslední hledání na řádku, ale v opačném směru

Rozdíl mezi f a t spočívá v tom, že f se zastaví až na hledaném znaku, zatímco t o jednu pozici před ním. Malá písmena se od velkých liší směrem – malá hledají vpřed, velká vzad. Chování bude nejlepší demonstrovat na příkladu:

Příklad:

Vyjděme z následujícího textu (pozice kurzoru je vyznačena šipkou):

Marie si vyrazila do města.
    ^ 

Příkaz fa posune kurzor takto:

Marie si vyrazila do města.
            ^

zatímco ta jen o jednu pozici méně:

Marie si vyrazila do města.
           ^

Zopakujeme-li toto poslední hledání klávesou ;, dostaneme:

Marie si vyrazila do města.
               ^

A v protisměru z této pozice dá Fs

Marie si vyrazila do města.
      ^

zatímco Ts opět zastaví dříve:

Marie si vyrazila do města.
       ^

Pohyby mezi řádky

Ty nejběžnější již byly řečeny – kurzorové klávesy nahoru a dolů a pohyby o celou obrazovku. Poznamenám jen, že vim se snaží při posunu na sousední řádek udržovat kurzor ve stejném sloupci. Je-li některý řádek kratší, posune kurzor na jeho poslední znak. Pokud se následující řádek opět prodlouží, vrátí se do původního sloupce.

Klávesy + a - vás taktéž posunou na následující resp. předchozí řádek. Kurzor se však přemístí na jeho první neprázdný znak.

Pro dálkové přesuny můžete použít příkaz G. Před ním zadejte číslo a vim vás přenese na řádek daného čísla. Například skok na osmnáctý řádek souboru obstará 18G. Pokud neuvedete číslo, ocitnete se na konci souboru.

Zajímavou možnost ztělesňuje %. Udává požadovanou pozici v procentech z celkové velikosti souboru (přesněji řečeno z počtu jeho řádků). Pokud se tedy chcete přesunout na prostřední řádek textu, stačí zadat 50%.

Logické poskoky

Všechny dosavadní pohybové příkazy pracovaly s fyzickými jednotkami, jako je sloupec, znak, řádek či obrazovka. vim nabízí kromě nich i přesuny podle logických kategorií – o slovo, větu či odstavec.

Pro posuny o slovo slouží následující skupina příkazů:

w, W na začátek následujícího slova
e, E na konec tohoto slova
b, B na nejbližší předchozí začátek slova

Rozdíl mezi malými a velkými písmeny při jednotlivých pohybech spočívá v tom, jak se interpretuje slovo. Pro malá písmena (w, e, b) je za slovo považována souvislá posloupnost písmen, číslic a podtržítek nebo souvislá posloupnost ostatních neprázdných znaků. Proto bude řetězec „ahoj.“ považován za dvě slova – první je tvořeno písmeny slova „ahoj“, druhé tečkou.

Při použití velkého písmene (W, E, B) je za slovo považována posloupnost neprázdných znaků. V tomto případě by tedy řetězec „ahoj.“ byl považován za jedno slovo, protože neobsahuje mezeru.

Příklad:

Vyjděme z této situace (pozici kurzoru vyznačuje šipka):

Jede vlak, ale nákladní.
      ^

Příkazem w se kurzor přesune na čárku za slovem „vlak“. Naproti tomu W jej posune až na první písmeno slova „ale“.

Po provedení 3e se ocitneme na písmeni „e“, ukončujícím „ale“. První e totiž postrčí kurzor na „k“, druhé na konec „slova“ tvořeného čárkou a třetí na konec „ale“.

Naproti tomu 2b z původní pozice přemístí kurzor na první znak věty. 2B má stejný význam.

Ještě zajímavější jsou posuny po větších celcích. Například ) přesune kurzor na začátek nejbližší následující věty. Přitom za konec věty je počítán znak „.“, „!“ nebo „?“ následovaný mezerou či koncem řádku. Chcete-li se vrátit na nejbližší předchozí začátek věty, použijte (.

Za konec odstavce je považován prázdný řádek. Příkaz } vás přemístí za nejbližší následující konec odstavce, zatímco { před nejbližší předcházející. Smazat tři odstavce (od aktuální pozice kurzoru směrem dolů) tedy můžete pomocí 3d}.

Poslední ze základních pohybů je velmi cenný při hledání nesrovnalostí v závorkování. Pomocí příkazu % se můžete přesunout na odpovídající párovou konstrukci. Za párové jsou přitom považovány všechny tři typy závorek (...), [...], {...}, komentářové dvojznaky podle konvencí jazyka C /*...*/ a instrukce makroprocesoru #if, #ifdef, #else, #elif a #endif. Při hledání párového prvku se samozřejmě berou v úvahu případné vnořené konstrukce, takže se najde skutečně závorka (či jiný prvek), která je párová k té pod kurzorem.

Příklad:

Pokud v situaci

(  (  )  (  ()  ()  )  )
         ^

použijete %, ocitnete se zde:

(  (  )  (  ()  ()  )  )
                    ^

Když nyní znovu stisknete %, vrátí se kurzor na původní pozici.

Povšimněte si dvojakosti příkazu %. Pokud mu předcházelo číslo, přesune vás na řádek, vzdálený o uvedený počet procent od začátku textu. Jestliže jste před ním žádné číslo nezadali, přeskočí na párovou závorku. Když v tomto okamžiku nestojí na žádné z výše uvedených párových konstrukcí, neudělá nic.