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 :-)