Hlavní navigace

VIM na plný výkon (4)

13. 7. 2004
Doba čtení: 6 minut

Sdílet

Kolekce rad a nápadů pro snadnější pořizování zdrojových textů všeho druhu. V tomto dílu se zaměříme na nastavování chování VIMu podle typu editovaného souboru. Řeč bude o tzv. Filetype Plugins.

Vítám vás po delší době u dalšího pokračování seriálu o VIMu a jeho ladění na plný výkon a podle potřeb každého z nás. V předchozích kapitolách jsme se zabývali především globálními nastaveními. VIM však dovoluje uživatelům jednoduše definovat nastavení podle typu souboru. Stará se o to vlastnost zvaná Filetype Plugins.

Filetype Plugins

Mechanismus Filetype Plugins se zapíná volbou

filetype plugin on

kterou bych doporučoval vložit do vašeho .vimrc souboru (pokud ji tam už nemáte). Poté si můžete vytvořit adresář ~/.vim/ftplugin a do něj ukládat soubory s nastaveními specifickými pro konkrétní typy souborů. Názvy konfiguračních souborů v tomto adresáři musí odpovídat schématu <název>.vim, kde <název> je označení typu, kterého se konfigurace týká. Můžete tedy směle vytvářet např. souboryc.vim, java.vim nebo html.vim a do nich vkládat nastavení pro příslušné druhy souborů (v tomto případě pro jazyk C, Javu a HTML stránky).

Z minulých dílů už víme, že všechna nastavení uložená v .vimrc a v podadresáři ~/.vim/ jsou lokální pro každého uživatele. Kromě toho pochopitelně existují i globální nastavení, která jsou stejná pro všechny uživatele VIMu v systému.

Co se Filetype Plugins týče, situace je následující. VIM zpracovává nejprve soubory ve vašem domovském adresáři (~/.vim/ftplugin/) a teprve poté přistoupí k vykonání globálních Filetype Plugins (/usr/share/vim/ftplu­gin/). To může mít za následek jednu nepříjemnost, a to, že globální filetype pluginy mohou předefinovat vaše osobní nastavení. Abyste se proti tomu ubránili, můžete do svých filetype pluginů přidat řádek let b:did_ftplugin = 1 nebo rovnou celý globální plugin zkopírovat do ~/.vim/ftplugin a upravit, jak je ctěná libost. (Zmiňovaný příkaz let b:did_ftplugin = 1 zakáže nahrávání dalšího filetype pluginu pro aktuální buffer.)

Druhou možností, kam umístit náš filetype plugin, je podadresář ~/.vim/after/ftplu­gin/. V takovém případě bude náš plugin nahrán až po globálních filetype pluginech. b:did_ftplugin je v tomto případě ignorováno.

Pro více informací zkuste ve VIMu :help filetype-plugins.

Jistě už teď sami vidíte širé lány použití tohoto mechanismu. Pojďme si přesto ukázat, jaké jsou jeho konkrétní možnosti.

Psaní HTML

Píšete ve VIMu HTML stránky? (Jestli ne, tak to zkuste. Je to príma. :-) Jestli ano, jistě i vás irituje neustálé psaní &amp; místo &, přepínání na anglickou klávesnici jen proto, abyste napsali úhlové závorky kolem HTML značky atd. Na obojí je bohudík lék, jenž se opírá právě o zmiňované filetype plugins.

Založte si soubor ~/.vim/ftplugin/html­.vim a zapište do něj následující magický text:

imap <LocalLeader>< &lt;
imap <LocalLeader>> &gt;
imap <LocalLeader>& &amp;
imap <LocalLeader>n &nbsp; 

Příkaz konkrétně říká, že chceme vytvořit mapování fungující jen v INSERT módu (imap) na klávesy ,< (v případě, že je tzv. LocalLeader nastaven na , – viz dále) tak, že po jejich stisku se ve skutečnosti provede akce odpovídající stisknutí kláves napsaných v poslední části příkazu (tj. &lt; – napsání tohoto textu).

Aby vše správně fungovalo, musíte mít nějak nastaven tzv. lokální předřaďovač (LocalLeader). Dělá se to třeba následujícím řádkem v ~/.vimrc souboru:

let maplocalleader = "," 

Po všech těchto krocích by měla fungovat při psaní HTML souborů (přímo v INSERT módu) makra ,< (tj. čárka následovaná znakem „menší než“), ,> a ,& tak, že do textu vloží patřičné entity &lt;, &gt; a &amp;.

Abyste se kvůli spuštění těchto maker nemuseli přepínat do anglické klávesnice, můžete si do ~/.vim/ftplugin/html­.vim přidat ještě následující trojici příkazů:

imap <LocalLeader>? &lt;
imap <LocalLeader>: &gt;
imap <LocalLeader>7 &amp; 

Neustálé vypisování počátečních a ukončovacích HTML značek je rovněž velmi únavné. Někdo to řeší tak, že si pro všechny myslitelné HTML tagy vytvoří samostatná makra a pak píše např. ,1 místo <h1></h1>, ,p místo <p> a tak dále. Mimochodem, je to velmi jednoduché – pro trénink začínajících VIMařů uvedu alespoň jednu definici makra:

imap <LocalLeader>p   <p><CR>< 

Její použití způsobí, že kdykoliv v INSERT módu napíšete rychle za sebou ,p, vloží se do textu značka pro nový odstavec a odřádkuje se.

Jistě jste si v předchozí definici makra všimli zvláštního řetězce <CR>. Právě takovým způsobem se do maker zapisují stisky speciálních kláves. <CR> například znamená stisk klávesy Enter, <Esc> stisk klávesy Esc apod.

Nevíte-li, jaký řetězec dané klávese odpovídá, můžete si pomoci stiskem CTRL-V a dané klávesy. Tak např. stisk CTRL-V a šipky nahoru vloží do textu řetězec <Up> apod. (Uvedená kombinace kláves funguje samozřejmě pouze mimo normální režim. V módu NORMAL má význam sloupcových bloků.)

Vraťme se ale k psaní HTML kódu. Než vytvářet makro pro každou HTML značku zvlášť, zdá se mi lepší zavedení jediného univerzálního ma­kra:

imap <F6> <></><Esc>5hdiwp3lpT>i 

Makro funguje takto: jednoduše píšete text stránky, jak jste zvyklí, a když náhodou potřebujete vložit nějaký HTML tag, napíšete jeho název a stisknete klávesu F6. Z napsaného slova se vytvoří párová HTML značka a kurzor se nastaví doprostřed. Zadáte-li např. code a stisknete klávesu F6, VIM za vás díky tomuto makru vygeneruje značky<code></code> s kurzorem uprostřed.

Předchozí makro vypadá na první pohled poněkud zběsile, ale ve skutečnosti neobsahuje žádné neobvyklé příkazy. Pojďme se na něj podívat podrobněji. Jak bylo řečeno, makro předpokládá, že bylo zavoláno těsně za nějakým napsaným slovem. Nejprve se vypíšou prázdné úhlové závorky (<></>) a přejde se do normálního režimu (<Esc>). Příkaz 5h znamená posunutí kurzoru o pět sloupců vlevo, tj. na poslední znak slova před úhlovými závorkami. Příkaz diw je už trochu méně obvyklý. Znamená Delete Inner Word, tj. vymaž slovo pod kurzorem. Tímto příkazem se také kurzor ocitne na prvním znaku <, takže příkaz p vloží vymazané slovo dovnitř úhlových závorek. Následuje posunutí o tři sloupce vpravo (3l), opětovné vložení vymazaného slova mezi poslední úhlové závorky (p), návrat zpět za první > (T>) a vstup do INSERT módu (i). Ufff.

Někdy se ale přece jenom hodí jisté speciality:

imap <LocalLeader>a   <a href=""></a><Esc>5hi
imap <LocalLeader>tab <table><CR><tr><CR><td></td><CR></tr><CR></table>
imap <LocalLeader>img <img src="" alt="" border="0"><Esc>19hi 

…s tímto významem:

Tabulka č. 584
Makro  Vygeneruje se
,a <a href=""><a> a kurzor se nastaví mezi uvozovky
,tab kostra tabulky
,img <img src="" alt="" border=„0“> a kurzor se nastaví mezi uvozovky atributu src

Pro vkládání odkazů mám ještě jedno makro:

root_podpora

imap <LocalLeader>A <Esc>yiWi<a href="http://<Esc>Ea"></a><Esc>3hP4la 

Po napsání např. www.root.cz a stisku ,A se vygeneruje: <a href=„http­://www.root.cz“>www­.root.cz</a>.

Pokračování příště…

Byl pro vás článek přínosný?

Autor článku

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.