Hlavní navigace

Kostry dokumentů ve VIM

16. 7. 2002
Doba čtení: 5 minut

Sdílet

V tomto článku si ukážeme, jak nakonfigurovat textový editor VIM, abyste při zahájení psaní nějakého souboru nemuseli pokaždé začínat "na zelené louce", ale editor vám místo čistého souboru nabídnul slušnou předpřipravenou šablonu dokumentu.

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_CRE­ATION_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_CRE­ATION_DATETIME – aktuální datum a čas ve formátu „rok/měsíc/den hodina:minuta“
  • skeletonVIM_CRE­ATION_DATE – aktuální datum ve formátu „rok/měsíc/den“
  • skeletonVIM_CRE­ATION_TIME – aktuální čas ve formátu „hodina:minuta“
  • skeletonVIM_FI­LE_BASE – základ jména vytvořeného souboru (bez cesty a přípony)
  • skeletonVIM_FI­LE_NAME – jméno souboru s příponou
  • skeletonVIM_FI­LE_EXT – pouze přípona souboru
  • skeletonVIM_FI­LE_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_U­SER_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/skeleton­s/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).

Editor VIM s vloženou kostrou dokumentu MojeTrida.java

Pro jistotu ještě jeden příklad. Předpokládejme, že máme vytvořeny dvě šablony pro soubory s příponou c: ~/.vim/skeleton­s/default.c a

~/.vim/skeleton­s/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.

root_podpora

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

Byl pro vás článek přínosný?

Autor článku

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.