Hlavní navigace

Kostry dokumentů ve VIM

Michal Burda

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.

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

Našli jste v článku chybu?

18. 7. 2002 14:19

Tomas Zellerin (neregistrovaný)

Pouzivate :r nebo :0r? (ono je to skoro jedno, v jednom pripade je prazdny radek na zacatku, v druhem na konci... i kdyz to druhe vadi mene).

(takze tady to tak neni, protoze se pouziva 0r, a navic se prazdny radek maze)

Mimochodem, dalsi mozna trivialni zjednoduseni scriptu clanku: misto exe "$d" staci $d, misto normal 1G staci 1





Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Vitalia.cz: Vychytané vály a válečky na vánoční cukroví

Vychytané vály a válečky na vánoční cukroví

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka