Hlavní navigace

VIM na plný výkon (4)

Michal Burda

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:

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ě…

Našli jste v článku chybu?

15. 7. 2004 13:37

Dalibor Straka (neregistrovaný)

Oboji zpusobi, ze makra nebudou fungovat jak byste cekali. Protoze na cilovy pocitac dorazi paket s druhym znakem makra o dost pozdeji nezli byl ve skutecnosti stisknut a vim situaci nevyhodnoti jako makro.

Takze: Bacha na pomalou linku, je to velmi iritujici.



14. 7. 2004 16:16

Petr Mach (neregistrovaný)

Zverejneni mi nevadi, i kdyz bych odkaz na zdroj uvital :-).

Fungovat to nemuze, protoze se z toho vola jeste jedna moje funkce, ktera slouzi k prekladu absolutnich cest na relativni a tu jste nekde zasantrocil :-).



Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Vychytané vály a válečky na vánoční cukroví

Vychytané vály a válečky na vánoční cukroví

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Měšec.cz: Komu musí od ledna zvýšit mzdu?

Komu musí od ledna zvýšit mzdu?

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Měšec.cz: Stavební spoření: alternativa i pro seniory

Stavební spoření: alternativa i pro seniory

Podnikatel.cz: Snížení DPH na 15 % se netýká všech

Snížení DPH na 15 % se netýká všech

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu