Tento článek se snaží představit širokému čtenářstvu Roota.cz jedno z možných řešení tzv. skeletons v editoru VIM. Uváděné řešení mi doma funguje celkem spolehlivě, takže by mělo chodit i vám – pokud ne, je zde diskuse… Rovněž bude kladen důraz na to, aby vše, co se bude dít, bylo náležitě vysvětleno a popsáno.
V nápovědě VIMu se dozvíte, že funkci koster dokumentů máte nakonfigurovat něčím podobným jako:
autocmd BufNewFile *.c 0r ~/vim/skeleton.c autocmd BufNewFile *.h 0r ~/vim/skeleton.h autocmd BufNewFile *.java 0r ~/vim/skeleton.java
tzn. pro všechny nové soubory (autocmd BufNewFile), které vyhoví zadaným výrazům (*.c, *.h, *.java), se má před první řádek (0) načíst (r = příkaz read) příslušné soubory
skeleton.c, skeleton.h či skeleton.java.
My však půjdeme ještě dál a uděláme mechanismus šablon trochu inteligentnější. Nejprve si vytvořte samostatný adresář, kam si budete šablony ukládat. V dalším textu bude předpokládáno, že to bude adresář ~/.vim/skeletons.
Nyní již k samotnému obsahu .vimrc souboru. Zde se nachází vše potřebné k automatizovanému zavádění koster. Celý zdroják je bohatě komentován, takže by jeho činnost měla být zřejmá každému (pokud nemáte chuť se v něm hrabat, jednoduše si jej jenom zkopírujte do svého .vimrc souboru):
" Funkce se vykoná po každém otevření nového souboru
function! SKEL_on_new_file()
" Jestliže je soubor jen ke čtení nebo nemá příponu,
" konči.
if (&modifiable == 0) || (expand("%:e") == "")
return
endif
" Do proměnné skels ulož seznam názvů patřičných
" šablonových souborů.
let skels = expand("~/.vim/skeletons/*." . expand("%:e"))
" Jestliže je seznam prázdný (žádný vhodný šablonový
" soubor neexistuje), konči.
if skels == ""
return
endif
let pom = skels . "\n"
let s = "Vyberte si šablonu:\n"
let i = "A"
" Budeme vytvářet nabídku šablon
while pom != ""
let s = s . i . ": " . fnamemodify(substitute
(pom, "\n.*$", "", ""), ":t:r") . "\n"
let pom = substitute(pom, "^[^\n]*\n", "", "")
let i = nr2char(char2nr(i) + 1)
endwhile
if i == "B"
" Jestliže i == "B", znamená to, že existuje
" jenom jeden soubor s šablonou. Nebudeme se tedy
" na nic ptát a rovnou ho použijeme...
exe "0r " . substitute(skels, "\n.*$", "", "")
call SKEL_replace()
else
" ...jinak se zeptáme uživatele, kterou šablonu si vybral
let in = toupper(input(s))
" Jestliže je výběr v pořádku, načteme patřičnou šablonu.
if (char2nr(in) != 0) && (char2nr(in) >= nr2char("A")) &&
(char2nr(in) < char2nr(i))
let pom = skels . "\n"
let i = "A"
" Hledáme název souboru, který uživatel zvolil.
while i != in[0]
let pom = substitute(pom, "^[^\n]*\n", "", "")
let i = nr2char(char2nr(i) + 1)
endwhile
exe "0r " . substitute(pom, "\n.*$", "", "")
call SKEL_replace()
endif
endif
endfunction
" Náhrady řetězců v načtené šabloně
function! SKEL_replace()
" Vymazání posledního prázdného řádku - oproti
" šablonovému souboru je tam vždy navíc (aspoň u mě).
exe "$d"
" Přesun kurzoru na začátek.
normal 1G
" Několik prima regulárních výrazů...
exe "%s/skeletonVIM_CREATION_DATETIME/" .
strftime("%Y\\/%m\\/%d %H:%M") . "/ge"
exe "%s/skeletonVIM_CREATION_DATE/" .
strftime("%Y\\/%m\\/%d") . "/ge"
exe "%s/skeletonVIM_CREATION_TIME/" . strftime("%H:%M") . "/ge"
exe "%s/skeletonVIM_FILE_BASE/" . expand("%:t:r") . "/ge"
exe "%s/skeletonVIM_FILE_NAME/" . expand("%:t") . "/ge"
exe "%s/skeletonVIM_FILE_EXT/" . expand("%:e") . "/ge"
exe "%s/skeletonVIM_FILE_MACRO/__" . toupper(expand("%:t:r")
. "_" . expand("%:e")) . "__/ge"
exe "%s/skeletonVIM_USER_NAME/" . $USERNAME . "/ge"
endfunction
" Pokud spuštěná verze VIMu podporuje auto-commands...
if has("autocmd")
" ...zaregistruj funkci SKEL_on_new_file() na provedení
" po každém otevření nového souboru.
augroup skeletons
au!
autocmd BufNewFile * call SKEL_on_new_file()
augroup END
endif
Mechanismus funguje tak, že po otevření nového souboru editorem VIM se do něj automaticky vloží obsah patřičné šablony. Soubory s šablonami se hledají v adresáři ~/.vim/skeletons/; rozhodující je přípona názvu. Pokud k určité příponě existuje více souborů se šablonami, dostane uživatel na výběr jejich seznam a sám si určí, kterou z nich chce použít.
Po načtení kostry do editovacího bufferu se provedou náhrady speciálních řetězců. Tak například, máte možnost do šablonového souboru zapsat třeba identifikátor skeletonVIM_CREATION_DATE, který se bude při zakládání nového souboru nahrazovat aktuálním datem. Připravil jsem pro vás tyto identifikátory (pro šikovné čtenáře jistě nebude problém dopsat si další):
- skeletonVIM_CREATION_DATETIME – aktuální datum a čas ve formátu „rok/měsíc/den hodina:minuta“
- skeletonVIM_CREATION_DATE – aktuální datum ve formátu „rok/měsíc/den“
- skeletonVIM_CREATION_TIME – aktuální čas ve formátu „hodina:minuta“
- skeletonVIM_FILE_BASE – základ jména vytvořeného souboru (bez cesty a přípony)
- skeletonVIM_FILE_NAME – jméno souboru s příponou
- skeletonVIM_FILE_EXT – pouze přípona souboru
- skeletonVIM_FILE_MACRO – název souboru ve speciálním formátu vhodném pro použití v definicích preprocesoru jazyka C. Jmenuje-li se soubor „MujSoubor.h“, bude tento řetězec nahrazen sekvencí __MUJSOUBOR_H__.
- skeletonVIM_USER_NAME – jméno uživatele, který soubor vytvořil (bere se z proměnné prostředí $USERNAME)
Trochu víc vše osvětlí následující příklad – základní šablona pro soubory s příponou java (tj. kód jazyka JAVA). Soubor uložte třeba jako ~/.vim/skeletons/default.java:
/*
* File name: byVIM_FILE_NAME
* Date: byVIM_CREATION_DATETIME
* Author: byVIM_USER_NAME
*/
import java.lang.*;
/** */
public class byVIM_FILE_BASE {
/** Constructor */
public byVIM_FILE_BASE() {
} // byVIM_FILE_BASE()
} // class byVIM_FILE_BASE
/* end of byVIM_FILE_NAME */
Od této chvíle bude každý nový soubor s příponou java otevřen s
předpřipraveným fragmentem kódu, který byste jinak museli psát ručně (viz
obrázek).

Pro jistotu ještě jeden příklad. Předpokládejme, že máme vytvořeny dvě šablony pro soubory s příponou c: ~/.vim/skeletons/default.c a
~/.vim/skeletons/GNU.c. Jak už bylo zmíněno, editor se před nahráním
kostry dotáže, kterou že má vlastně použít:
Vyberte si šablonu: A: GNU B: default
Pokud odpovíte a (a ENTER), nahraje se kostra GNU souboru, zvolením b nějaká standardní šablona a prostým stiskem ENTERu nebo zadáním čehokoliv jiného se otevře prázdný soubor.
Líbilo? Pokud se tohle nasavení rozhodnete používat nebo pokud používáte něco jiného (lepšího), nezapomeňte se o své postřehy podělit! :-) Všechno potřebné k provozování šablon ve VIM včetně několika ukázkových koster dokumentů naleznete zde.
Tip na závěr: konverze zdrojáku se zvýrazněnou syntaxí do HTML provedete nejjednodušeji pomocí VIMu zvolením položky menu Syntax/Convert to HTML :-)