Makra

Obvykl²m prost°edkem pro v²raznΘ zrychlenφ prßce s editorem je definice a pou╛φvßnφ makroinstrukcφ. Dφky nim si m∙╛ete urΦitΘ Φasto opakovanΘ postupy p°edprogramovat a pak je realizovat stiskem jednΘ Φi n∞kolika mßlo klßves. Dob°e definovanß sada maker dokß╛e u╣et°it spoustu Φasu.

Makra na pomeranΦφch

Editor se makro zpravidla uΦφ odezφrßnφm. U╛ivatel °ekne "te∩ se dφvej" a editor si zapamatuje sekvenci provßd∞n²ch operacφ a╛ do okam╛iku, kdy u╛ivatel °ekne "dost". PotΘ lze zapamatovanou posloupnost operacφ kdykoli zopakovat.

V p°φpad∞ vim slou╛φ k tΘto Φinnosti p°φkaz qregistr. Jako jmΘno registru m∙╛e vystupovat libovolnΘ malΘ pφsmeno nebo Φφslice. Editor zahßjφ re╛im nahrßvßnφ a p°φkazy si uklßdß do uvedenΘho registru. Jakmile znovu pou╛ijete p°φkaz q (tentokrßt ji╛ bez jakΘkoli dou╣ky), nahrßvßnφ bude ukonΦeno.

Zapamatovanou sekvenci pak m∙╛ete kdykoli zopakovat prost°ednictvφm @registr.

P°φklad:
╚asto edituji textovΘ soubory, z nich╛ vytvß°φm WWW strßnky. Tu a tam chci v textu n∞kterΘ slovo zobrazit pφsmem psacφho stroje, co╛ v praxi znamenß p°ed n∞ vlo╛it znaΦku <CODE> a za n∞ </CODE>. Vzhledem k nßzvu znaΦky si takovΘ makro ulo╛φm pod pφsmenem "c". Nejprve je editor nauΦφm:
qc zapamatovat do registru "c"
i<CODE>[Esc] vlo╛it p°ed aktußlnφ znak znaΦku <CODE> a vrßtit se do normßlnφho re╛imu
e p°esunout kurzor na konec slova
a</CODE>[Esc] p°idat za aktußlnφ znak znaΦku </CODE> a vrßtit se do normßlnφho re╛imu
q ukonΦit nahrßvßnφ
V levΘm sloupci jsou klßvesy, kter²mi vytvo°φm makro, v pravΘm pak jejich vysv∞tlenφ. Makro p°edpoklßdß, ╛e v okam╛iku jeho vyvolßnφ stojφ kurzor na prvnφm znaku slova. Vyvolat je kombinacφ @c.
Makro lze kdykoli pozd∞ji p°edefinovat tak, ╛e prost∞ definujete p°φslu╣n² registr znovu. Pokud v╣ak p°φkazu q p°edßte velkΘ pφsmeno, nebude stßvajφcφ obsah registru vymazßn a zapamatovanΘ p°φkazy budou p°idßny na jeho konec.

Makra podle mistra kucha°e

Opravdovφ mu╛ovΘ a ╛eny v╣ak v²╣e popsan² druh maker p°φli╣ nepou╛φvajφ. Majφ k tomu tyto d∙vody:
  1. Majφ dostatek p°edstavivosti na to, aby v∞d∞li, co jednotlivΘ p°φkazy d∞lajφ a nemusφ se na n∞ b∞hem definice makra zbab∞le dφvat. To by bylo pod jejich profesionßlnφ Φest.
  2. Vyvolßnφ makra vy╛aduje p°φli╣ mnoho klßves (ne╛ Φlov∞k namaΦkß zavinßΦ, uplyne spousta Φasu) a tudφ╛ zpomaluje.
  3. Abeceda je p°φli╣ malß a nabφzφ jen 26 registr∙.
Syrovφ u╛ivatelΘ proto dßvajφ v∞t╣inou p°ednost klasickΘ definici maker p°evzatΘ z p∙vodnφho vi, zde v╣ak pon∞kud vylep╣enΘ.

Jejφm zt∞lesn∞nφm je p°φkaz

:map makro v²znam
╪φkß, ╛e kdykoli v normßlnφm re╛imu pou╛ijete makro, mß se ve skuteΦnosti provΘst sekvence p°φkaz∙, kterß byla definovßna jako jeho v²znam. V roli makra m∙╛e vystupovat tΘm∞° libovolnß klßvesa Φi jejich kombinace. P°i v²b∞ru v╣ak bu∩te opatrnφ, abyste si nevhodnou definicφ makra neod°φzli p°φstup k n∞kterΘmu z d∙le╛it²ch p°φkaz∙.

╚asto chcete, aby makro bylo spou╣t∞no urΦitou specißlnφ klßvesou (klßvesou v kombinaci s Ctrl, Alt nebo n∞kterou funkΦnφ klßvesou). Abyste do p°φkazu vlo╛ili odpovφdajφcφ k≤d, stiskn∞te nejprve Ctrl-V a pak k²╛enou klßvesu. Ctrl-V toti╛ vy°adφ p°φpadn² specißlnφ v²znam klßvesy, kterß nßsleduje za nφm.

P°φklad:
Rozhodl jsem se, ╛e klßvesovou kombinacφ Ctrl-V budu do textu vklßdat "logo" programu vim. Jeliko╛ pracuji na HTML strßnkßch, mß tvar <EM>vim</EM>. Odpovφdajφcφ p°φkaz bych definoval takto:
:map ^V i<EM>vim</EM>^[
V╣imn∞te si specißlnφch znak∙ ^V a ^]. Prvnφ symbolizuje Ctrl-V (aktivaΦnφ klßvesa makra) a vlo╛il jsem jej klßvesovou kombinacφ Ctrl-V Ctrl-V. Druh² znak je zt∞lesn∞nφm zßv∞reΦnΘho [Esc], kter²m se po vlo╛enφ nßpisu vrßtφm do normßlnφho re╛imu. Tento znak jsem vlo╛il pomocφ Ctrl-V [Esc].

P∙vodn∞ v╣ak Ctrl-V v normßlnφm re╛imu zahßjφ vyznaΦovßnφ sloupcovΘho vizußlnφho bloku. O tuto mo╛nost bych nerad p°i╣el a volba tohoto k≤du proto nenφ p°φli╣ ╣╗astnß.

Rad∞ji si vytvo°φm dvojznaky pro vklßdßnφ jednotliv²ch text∙, kter²ch nepochybn∞ bude vφce. Odpovφdajφcφ makra budou v╛dy zahßjena funkΦnφ klßvesou [F5]. Podle nßsledujφcφch pφsmen se pak urΦφ, kter² text mß b²t vlo╛en. Definuji si dva: pro znaΦku 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 klßvesu, kterou zaΦφnß nßzev n∞kterΘho vφceznakovΘho makra (v p°edchozφm p°φkladu by to byla klßvesa [F5]), vim nezobrazφ ╛ßdn² v²sledek a Φekß na pokraΦovßnφ. Jak postupn∞ maΦkßte dal╣φ klßvesy, kontroluje je s definicφ makra. Jakmile jmΘno odpovφdß, provede p°φslu╣nΘ makro. Jestli╛e se v╣ak od nßzvu makra odch²lφte, provede p°φkazy, odpovφdajφcφ stisknutΘ posloupnosti klßves. O nic tedy nep°ijdete.

Standardn∞ mß editor nastaven urΦit² interval, po kter² Φekß na dopln∞nφ makra. Jestli╛e uplyne, ani╛ byste stiskli n∞jakou klßvesu, rezignuje na zkompletovßnφ makra a op∞t se zachovß, jako kdyby dosud namaΦkanß kombinace klßves nebyla zaΦßtkem makra.

Chcete-li se p°esv∞dΦit, jakß makra jsou v souΦasnΘ dob∞ definovßna, pou╛ijte samotn² p°φkaz :map. Zajφmß-li vßs v²znam urΦitΘ konkrΘtnφ klßvesy Φi kombinace klßves, zadejte :map makro.

O likvidaci makra se postarß :unmap makro a pokud snad chcete zru╣it narßz v╣echny definice, pou╛ijte :mapclear.

Makra a re╛imy

V p°edchozφ Φßsti jsem si dovolil situaci pon∞kud zjednodu╣it. vim toti╛ p°ipou╣tφ definici maker v r∙zn²ch re╛imech a podle toho se pon∞kud li╣φ p°φkazy, kterΘ je t°eba pou╛φvat. Poznajφ se zpravidla podle p°edpony, kterß se p°idß ke jmΘnu p°φkazu. Nßsledujφcφ tabulka uvßdφ p°ehled zßkladnφch p°φkaz∙ a re╛imy, v nich╛ pracujφ.
P°φkaz Re╛im
normßlnφ (p°φkazov²) vizußlnφ vklßdßnφ p°φkazov² °ßdek
:map + +    
:nmap +      
:vmap   +    
:map!     + +
:imap     +  
:cmap       +

Velmi zajφmavß jsou makra ve vklßdacφm re╛imu, proto╛e jimi si m∙╛ete podstatn∞ usnadnit a zrychlit vytvß°enφ textu.

P°φklad:
Jako p°φklad uvedu jedno z m²ch HTML maker. Pou╛φval jsem je p°i psanφ t∞chto strßnek pro vklßdßnφ informacφ o klßvesßch, kterΘ je pot°eba stisknout. Vyvolß se klßvesou Ctrl-K ("K" jako╛to "klßvesa") a vlo╛φ do textu °et∞zec <CODE CLASS=klavesa></CODE>. PotΘ vrßtφ kurzor mezi ob∞ znaΦky, abych mohl ihned psßt k≤d klßvesy. Definice makra vypadß nßsledovn∞:
:imap ^K <CODE CLASS=klavesa></CODE>^[F<i
Slo╛it∞j╣φ je makro Ctrl-Q, kterΘ dopl≥uje pßrovou znaΦku. Pou╛φvßm je tak, ╛e napφ╣i zahajovacφ znaΦku (°ekn∞me <STRONG>) a potΘ stisknu Ctrl-Q. Editor doplnφ </STRONG> a vrßtφ kurzor mezi znaΦky, abych mohl psßt t∞lo. Definice je tato:
imap ^Q </>^[2F<lywf>f/pF<i
Editor nejprve p°ipφ╣e zßklad ukonΦujφcφ znaΦky (</>), vrßtφ se do normßlnφho re╛imu (^[), p°esune se za zaΦßtek zahajujφcφ znaΦky (2F<l), zkopφruje slovo (yw), p°ejde na lomφtko v ukonΦujφcφ znaΦce (f>f/), vlo╛φ za n∞j zkopφrovanΘ slovo (p), vrßtφ se na zahajovacφ < tΘto znaΦky (F<) a vrßtφ se zp∞t do vklßdacφho re╛imu (i).
<-- predchozi  [obsah]  dalsi -->
© 1997, 1998 Pavel Satrapa