Makra

Obvyklym prostredkem pro vyrazne zrychleni prace s editorem je definice a pouzivani makroinstrukci. Diky nim si muzete urcite casto opakovane postupy predprogramovat a pak je realizovat stiskem jedne ci nekolika malo klaves. Dobre definovana sada maker dokaze usetrit spoustu casu.

Makra na pomerancich

Editor se makro zpravidla uci odeziranim. Uzivatel rekne "ted se divej" a editor si zapamatuje sekvenci provadenych operaci az do okamziku, kdy uzivatel rekne "dost". Pote lze zapamatovanou posloupnost operaci kdykoli zopakovat.

V pripade vim slouzi k teto cinnosti prikaz qregistr. Jako jmeno registru muze vystupovat libovolne male pismeno nebo cislice. Editor zahaji rezim nahravani a prikazy si uklada do uvedeneho registru. Jakmile znovu pouzijete prikaz q (tentokrat jiz bez jakekoli dousky), nahravani bude ukonceno.

Zapamatovanou sekvenci pak muzete kdykoli zopakovat prostrednictvim @registr.

Priklad:
Casto edituji textove soubory, z nichz vytvarim WWW stranky. Tu a tam chci v textu nektere slovo zobrazit pismem psaciho stroje, coz v praxi znamena pred ne vlozit znacku <CODE> a za ne </CODE>. Vzhledem k nazvu znacky si takove makro ulozim pod pismenem "c". Nejprve je editor naucim:
qc zapamatovat do registru "c"
i<CODE>[Esc] vlozit pred aktualni znak znacku <CODE> a vratit se do normalniho rezimu
e presunout kurzor na konec slova
a</CODE>[Esc] pridat za aktualni znak znacku </CODE> a vratit se do normalniho rezimu
q ukoncit nahravani
V levem sloupci jsou klavesy, kterymi vytvorim makro, v pravem pak jejich vysvetleni. Makro predpoklada, ze v okamziku jeho vyvolani stoji kurzor na prvnim znaku slova. Vyvolat je kombinaci @c.
Makro lze kdykoli pozdeji predefinovat tak, ze proste definujete prislusny registr znovu. Pokud vsak prikazu q predate velke pismeno, nebude stavajici obsah registru vymazan a zapamatovane prikazy budou pridany na jeho konec.

Makra podle mistra kuchare

Opravdovi muzove a zeny vsak vyse popsany druh maker prilis nepouzivaji. Maji k tomu tyto duvody:
  1. Maji dostatek predstavivosti na to, aby vedeli, co jednotlive prikazy delaji a nemusi se na ne behem definice makra zbabele divat. To by bylo pod jejich profesionalni cest.
  2. Vyvolani makra vyzaduje prilis mnoho klaves (nez clovek namacka zavinac, uplyne spousta casu) a tudiz zpomaluje.
  3. Abeceda je prilis mala a nabizi jen 26 registru.
Syrovi uzivatele proto davaji vetsinou prednost klasicke definici maker prevzate z puvodniho vi, zde vsak ponekud vylepsene.

Jejim ztelesnenim je prikaz

:map makro vyznam
Rika, ze kdykoli v normalnim rezimu pouzijete makro, ma se ve skutecnosti provest sekvence prikazu, ktera byla definovana jako jeho vyznam. V roli makra muze vystupovat temer libovolna klavesa ci jejich kombinace. Pri vyberu vsak budte opatrni, abyste si nevhodnou definici makra neodrizli pristup k nekteremu z dulezitych prikazu.

Casto chcete, aby makro bylo spousteno urcitou specialni klavesou (klavesou v kombinaci s Ctrl, Alt nebo nekterou funkcni klavesou). Abyste do prikazu vlozili odpovidajici kod, stisknete nejprve Ctrl-V a pak kyzenou klavesu. Ctrl-V totiz vyradi pripadny specialni vyznam klavesy, ktera nasleduje za nim.

Priklad:
Rozhodl jsem se, ze klavesovou kombinaci Ctrl-V budu do textu vkladat "logo" programu vim. Jelikoz pracuji na HTML strankach, ma tvar <EM>vim</EM>. Odpovidajici prikaz bych definoval takto:
:map ^V i<EM>vim</EM>^[
Vsimnete si specialnich znaku ^V a ^]. Prvni symbolizuje Ctrl-V (aktivacni klavesa makra) a vlozil jsem jej klavesovou kombinaci Ctrl-V Ctrl-V. Druhy znak je ztelesnenim zaverecneho [Esc], kterym se po vlozeni napisu vratim do normalniho rezimu. Tento znak jsem vlozil pomoci Ctrl-V [Esc].

Puvodne vsak Ctrl-V v normalnim rezimu zahaji vyznacovani sloupcoveho vizualniho bloku. O tuto moznost bych nerad prisel a volba tohoto kodu proto neni prilis stastna.

Radeji si vytvorim dvojznaky pro vkladani jednotlivych textu, kterych nepochybne bude vice. Odpovidajici makra budou vzdy zahajena funkcni klavesou [F5]. Podle nasledujicich pismen se pak urci, ktery text ma byt vlozen. Definuji si dva: pro znacku vim (makro [F5]v) a svou elektronickou adresu (makro [F5]ps):

:map <F5>v i<EM>vim</EM>^[ :map <F5>ps iPavel.Satrapa@vslib.cz^[
Stisknete-li klavesu, kterou zacina nazev nektereho viceznakoveho makra (v predchozim prikladu by to byla klavesa [F5]), vim nezobrazi zadny vysledek a ceka na pokracovani. Jak postupne mackate dalsi klavesy, kontroluje je s definici makra. Jakmile jmeno odpovida, provede prislusne makro. Jestlize se vsak od nazvu makra odchylite, provede prikazy, odpovidajici stisknute posloupnosti klaves. O nic tedy neprijdete.

Standardne ma editor nastaven urcity interval, po ktery ceka na doplneni makra. Jestlize uplyne, aniz byste stiskli nejakou klavesu, rezignuje na zkompletovani makra a opet se zachova, jako kdyby dosud namackana kombinace klaves nebyla zacatkem makra.

Chcete-li se presvedcit, jaka makra jsou v soucasne dobe definovana, pouzijte samotny prikaz :map. Zajima-li vas vyznam urcite konkretni klavesy ci kombinace klaves, zadejte :map makro.

O likvidaci makra se postara :unmap makro a pokud snad chcete zrusit naraz vsechny definice, pouzijte :mapclear.

Makra a rezimy

V predchozi casti jsem si dovolil situaci ponekud zjednodusit. vim totiz pripousti definici maker v ruznych rezimech a podle toho se ponekud lisi prikazy, ktere je treba pouzivat. Poznaji se zpravidla podle predpony, ktera se prida ke jmenu prikazu. Nasledujici tabulka uvadi prehled zakladnich prikazu a rezimy, v nichz pracuji.
Prikaz Rezim
normalni (prikazovy) vizualni vkladani prikazovy radek
:map + +    
:nmap +      
:vmap   +    
:map!     + +
:imap     +  
:cmap       +

Velmi zajimava jsou makra ve vkladacim rezimu, protoze jimi si muzete podstatne usnadnit a zrychlit vytvareni textu.

Priklad:
Jako priklad uvedu jedno z mych HTML maker. Pouzival jsem je pri psani techto stranek pro vkladani informaci o klavesach, ktere je potreba stisknout. Vyvola se klavesou Ctrl-K ("K" jakozto "klavesa") a vlozi do textu retezec <CODE CLASS=klavesa></CODE>. Pote vrati kurzor mezi obe znacky, abych mohl ihned psat kod klavesy. Definice makra vypada nasledovne:
:imap ^K <CODE CLASS=klavesa></CODE>^[F<i
Slozitejsi je makro Ctrl-Q, ktere doplnuje parovou znacku. Pouzivam je tak, ze napisi zahajovaci znacku (rekneme <STRONG>) a pote stisknu Ctrl-Q. Editor doplni </STRONG> a vrati kurzor mezi znacky, abych mohl psat telo. Definice je tato:
imap ^Q </>^[2F<lywf>f/pF<i
Editor nejprve pripise zaklad ukoncujici znacky (</>), vrati se do normalniho rezimu (^[), presune se za zacatek zahajujici znacky (2F<l), zkopiruje slovo (yw), prejde na lomitko v ukoncujici znacce (f>f/), vlozi za nej zkopirovane slovo (p), vrati se na zahajovaci < teto znacky (F<) a vrati se zpet do vkladaciho rezimu (i).
<-- predchozi  [obsah]  dalsi -->
© 1997, 1998 Pavel Satrapa