 |
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:
- 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.
- Vyvolání makra vyžaduje příliš mnoho kláves (než člověk namačká zavináč,
uplyne spousta času) a tudíž zpomaluje.
- 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 ).
© 1997, 1998 Pavel Satrapa
|