☰ menu
Pavel Satrapa

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 lze 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.

Kromě Ctrl-V můžete použít i symbolické názvy speciálních kláves uzavřené mezi znaky „<“ a „>“. Například zmíněné Ctrl-V lze zapsat pěticí znaků „<C-V>“ a [Esc] je „<Esc>“. Přehled dostupných názvů získáte příkazem :help keycodes.

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><Esc>
:map <F5>ps iPavel.Satrapa@tul.cz<Esc>

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í 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 kombinací ,kk („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 ,kk <code class="klavesa"></code><Esc>F<i

Složitější je makro ,., které doplňuje párovou značku. Používám je tak, že napíši zahajovací značku (řekněme <strong>) a poté stisknu ,.. Editor doplní </strong> a vrátí kurzor mezi značky, abych mohl psát tělo. Definice je tato:

imap ,. </><Esc>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 (<Esc>), 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).