Šablona dokumentu pro ConTeXt
dond Pátek, 13 březen, 2009 v 2:10 odp.Varování: tenhle článek je technický (a hodně). Povídání o blondýnkách bude zase příště.
V souvislosti s přípravou deníčku o Španělsku jsem se zase začal trochu věnovat lámání v TeXu – konkrétně v ConTeXtu (o tom jindy). Při přípravě maker jsem hodně experimentoval, studoval a zkoušel, což mj. znamená, že jsem vytvářel spoustu souborů. Pro ty účely jsem zrevidoval některé postupy, které jsem dlouho používal pro editaci TeXových zdrojáků. Kupříkladu, narozdíl od dob, kdy jsem všechno (tj. diplomku, články a dokumentaci k tehdy několika zdrojákům) psal v PlainTeXu, už mě nebaví při vytváření každého nového dokumentu ťukat záhlaví, v němž je typicky definice velikosti stránky, písma, popis, co je to za soubor, atp.
Zapátral jsem v paměti a vzpomněl si, že jsem si kdysi podle jakéhosi návodu na webu připravil šablonu pro vytváření nových Java tříd. Pohrabal jsem se ve vimfiles a trochu oprášil experimentování s makry ViMu. Výsledek je k vidění níže – není to žádná světobornost, ale funguje to a ušetří to ruční psaní pár řádek. Původní článek o systému šablon (v článku se jim říká kostry) však doporučuji pozornosti, v něm popsaný systém je flexibilnější a může se hodit, pokud chce mít člověk šablon víc.
A jak to funguje? Do _vimrc přibyla řádka
au BufEnter *.context source ~/vimfiles/template_context.vim
která ViMu říká, že při otevření souboru s příponou .context má provést, co najde v template_context.vim. Korektní by bylo tenhle soubor načíst při události BufNewFile, ale z nějakého důvodu to na Windows nefunguje (v linuxu ano). Kód v šabloně proto obsahuje pojistku, která zjistí, jestli načítaný soubor něco obsahuje – pokud ano, šablona se nevkládá. Do prázdného souboru se načte obsah template.context, který obsahuje samotnou šablonu. Funkce pro načtení šablony poté zavolá několik regulárních výrazů, které v načteném textu vymění vzorové řetězce za aktuální hodnoty (jméno souboru, datum, příp. další) a skočí na určený řádek. Obsah template_context.vim vypadá takhle
""
" vkladani sablony pro ConTeXt, 11. 3. 2009 dond
" fce pro nacteni obsahu sablony
function! TEMPLATE_on_new_context_file()
if(&modifiable==0)
return
endif
" kontrola, jestli editor otevira neprazdny soubor (do nej se sablona nenacita)
if(line2byte(line("$")+1)>1)
return
endif
" nacteme sablonu
let template=expand("~/vimfiles/templates/template.context")
exe "0r ".template
" odstranime posledni prazdny radek, ktery vznikl :0r
$d
" nahradime retezce v sablone
call TEMPLATE_replace()
" skocime na zacatek textu
1
:18
endfunction
" fce pro vlozeni aktualnich informaci
function! TEMPLATE_replace()
exe "%s/TEMPLATE_CREATION_DATE/".strftime("%d. %m. %Y")."/ge"
exe "%s/TEMPLATE_FILE_NAME/".expand("%:t")."/ge"
exe "%s/TEMPLATE_USERNAME/".$USERNAME."/ge"
endfunction
" nakonec zavolame pripravenou funkci
call TEMPLATE_on_new_context_file()
a šablona template.context obsahuje
%%% % TEMPLATE_FILE_NAME % % TEMPLATE_USERNAME TEMPLATE_CREATION_DATE \setupoutput[pdftex] \enableregime[utf] \mainlanguage[cz] \usetypescript[modern][ec] \setupbodyfont[rm,12pt] %\setuppagenumbering[location=] \setuppapersize[A4][A4] \setuplayout[backspace=2cm,header=0pt,footer=0pt,width=middle,topspace=2cm,height=middle,location=middle] \starttext \stoptext % TEMPLATE_FILE_NAME % vim: set enc=utf-8 :
Nakonec to nebylo nic těžkého, líbí se mi (esteticky) způsob zjištění (ne)prázdnosti načítaného souboru v bufferu. Mám rád svůj oblíbený editor. :-)