« Uggh | Home

Archive for the ViM Category

Vlnka

Posted on Úterý, 23 únor, 2010 at 11:38 odp. by dond

(Varování: Tento text neníGoogle Wave. Tento text naopak je dost technický.)

Protože často píšu příspěvky (sem, do diskuzí, do Astropisího redakčního systému) v HTML a často je píšu buď jenom částečně (tedy kousek, který se pak někam vloží), nebo před zamýšleným zveřejněním (do foroty – ostatně jako tomu bylo v případě tohoto textu), píšu je pochopitelně ve svém oblíbeném editoru. Jelikož tento disponuje vnitřním skriptovacím rozhraním, připravil jsem si jednoduchou pomůcku, která mi vloží nezlomitelné mezery tam, kde to je (většinou) vhodné. Jde o velmi primitivní náhradu za program vlna od Petra Olšáka, ale pro moje potřeby naprosto stačí.

Funguje to tak, že z inicializačního .vimrc souboru načtu soubor HtmlVlna.vim, který obsahuje definici funkce Vlna_recode(), jejíž volání je namapované na funkční klávesu F12.

au FileType html source ~/.vim/plugin/HtmlVlna.vim
au FileType html map <F12> :call VLNA_recode()

Takže píšu, když mám pocit, že jsem sepsal všechno, co jsem chtěl světu sdělit, zmáčknu F12 a funkce VLNA_recode() najde mezery za jednopísmennými předložkami a spojkami a nahradí je nezlomitelnou mezerou. Mechanizmus hledání je velmi primitivní a celá funkce vypadá takhle:

function! VLNA_recode()
  " skocime na zacatek souboru
  execute "normal gg"

  " najdeme vsechno, co chceme nahradit
  while search('[^<]\<[AaIiKkOoSsUuVvZz]\>\s\+',"W")>0
" vypisem cislo radky, kterou menime
echo "Vlnkuju radek ".line(".")

" samotna vymena znaku - hlidani pocatecniho '<' zabrani vlozeni &nbsp; do <a href=...
s/\([^<]\)\<\([AaIiKkOoSsUuVvZz]\)\>\s\+/\1\2\&nbsp;/g

" spocitame, kolik jsme nezlomitelnych mezer jsme nahradili
let s:currLine=getline(".")
let s:index=0
let s:nbspCount=0
while match(s:currLine,'&nbsp;',s:index)>-1
  let s:found=match(s:currLine,'&nbsp;',s:index)
  let s:index=s:found+5 " posunem kurzor na konec
  let s:nbspCount=s:nbspCount+1
endwhile

let s:tmp=trunc(s:nbspCount/10.0)
let s:nbspCount=s:nbspCount-float2nr(10*s:tmp)

" vypiseme pocet nalezenych nezlom. mezer
if s:nbspCount==1
  echon " [".s:nbspCount." nezlomitelna mezera]\n"
elseif s:nbspCount>2&&s:nbspCount<5
  echon " [".s:nbspCount." nezlomitelne mezery]\n"
else
  echon " [".s:nbspCount." nezlomitelnych mezer]\n"
endif
  endwhile
endfunction

Všechnu práci tedy obstará jeden regulární výraz (na ř. 11), zbytek je jen omáčka okolo, která vypisuje informace o vyměněných mezerách.

V tomhle příspěvku funkce našla a nahradila 17 mezer. :-)

Pochopitelně vím, že snažit se na webu o splnění typografických pravidel tímto způsobem je poněkud nesystematické (přinejlepším), ale o ničem lepším nevím. Přinejmenším mně vadí jednopísmenné částice na koncích řádků, proto tuhle úpravu dělám – vím, že podle typografických pravidel patří nezlomitelná mezera pouze za neslabičné předložky nebo předložky na začátku věty; většinou ji ale dávám všude, protože samotná písmena na koncích řádků prostě vypadají divně (a obvykle jsou tam poměrně bezdůvodně).

Edited on: Úterý, 23 únor, 2010 11:48 odp.

Javascript API 1.4 ve ViMu

Posted on Čtvrtek, 03 září, 2009 at 9:35 odp. by dond

Dost často pro různé demo ukázky programuju něco malého a rychlého v Javascript API nad ArcGIS Serverem. Je to hezké, použitelné, většinou to funguje ve všech prohlížečích. ESRI se pochlapila a k celému API je dostupná poměrně podrobná dokumentace.

Abych si život co nejvíc ulehčil, vygeneroval jsem si pomocí několika udělátek seznam názvů všech metod a vlastností jednotlivých JS tříd, které jsou v Javascript API 1.4 definovány. Třeba se to může někomu hodit, užívejte dle libosti.

Použití ve ViMu je jednoduché: nejdřív se přidá seznam do proměnné dictionary výběr z položek je potom dostupný pod standardní klávesovou zkratkou CTRL-X CTRL-K (já mám výběr ve slovníku namapovaný na dvojkombinaci CTRL <SPACE>). Přidání do slovníku lze realizovat např. ve _vimrc

au FileType javascript set dict+=$HOME/vimfiles/dict/jsapi1.4.dict

nebo v in-line nastaveních pro jednotlivé soubory.

Šablona dokumentu pro ConTeXt

Posted on Pátek, 13 březen, 2009 at 2:10 odp. by dond

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

Konfigurační soubor pro ViM ve windows doméně

Posted on Úterý, 10 únor, 2009 at 2:16 odp. by dond

Dlouho jsem si lámal hlavu, jak zařídit, aby na všech počítačích v naší doméně, kde občas edituju nějaký konfigurační soubor nebo zdroják, byl dostupný centrální konfigurační soubor pro ViM, _vimrc (obdoba UNIXového .vimrc souboru).

Náš doménový server nastavuje při přihlášení automaticky domovský adresář do síťového disku \\server\home, což je na jednu stranu pohodlné, na druhou stranu to přináší některé problémy. Původní řešení problému, tj. mít centrální nastavení pro ViM právě na tomhle disku (na který je navíc automaticky přesměrovaná environmentální proměnná %HOME%), se brzy ukázalo jako nedostatečné. Ze dvou důvodů.

Tedy, popravdě hlavně proto, že se znám a potřebuji, aby editor ukládal historické verze editovaných souborů do nějakého záložního adresáře – kolikrát se mi podařilo soubor smazat nebo přepsat jeho obsah něčím nevhodným... No, a tady je kámen úrazu: na každém počítači může být (a v praxi často je) úložiště pro backup někde jinde. Na počítačích, které používám příležitostně, při předváděčkách nebo na konferenci, mě obvykle umístění souborů netrápí a všechny konfigurační a okolosouvisející soubory nechávám v Documents & Settings. Na svém počítači nebo na virtuálním stroji, kde momentálně pracuju, chci mít věci víc pod kontrolou a taky po ruce.

Druhý důvod je ten, že se velmi záhy ukázalo, že na noebooku je taky dobré mít lokální kopii konfiguračních souborů pro editor – ve chvíli, kdy počítač vezmu s sebou mimo pracovní síť, přijdu o připojení k domovskému adresáři. To s sebou sice nese nutnost mít konfiguraci na více místech, což je nepříjemné, ale těžko jinak řešitelné.

Řešení, které jsem nakonec vybral jako nejlepší, je následující. V domovském adresáři je umístěný soubor _vimrc, který obsahuje pouze:

source C:/Documents\ and\ Settings/dond/_vimrc

ViM při spuštění hledá konfigurační soubor v adresářích %HOME% a %VIM% (v tomto pořadí). V případě, že jsem přihlášený do domény, %HOME% ukazuje na síťový disk, kde se načte výše zmíněný soubor, který editor přesměruje na lokální _vimrc. V případě, že nejsem v doméně, %HOME% ukazuje rovnou do D&S, takže se lokální souboru načte rovnou. V lokálním _vimrc jsou potom pro každý počítač nastavené příslušné parametry pro backup, _viminfo ad.:

...
set backup
set backupdir=D:/backup
set runtimepath+=C:/Documents\ and\ Settings/dond/vimfiles
set viminfo='100,\"1000,h,%,nC:/Documents\ and\ Settings/dond/_viminfo
...

Řešení to není úplně ideální, protože na každém stroji musím mít svoje vimfiles, což zatím dokážu skousnout (mám je uložené v ZIPu, který jenom po instalaci ViMu rozbalím). Až začneme používat Vistu nebo další vyspělý-operační-systém, bude také asi třeba změnit umístění adresáře s lokálním _vimrc, nejspíš na něco jako C:/temp/_vimrc.

« Uggh | Top