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