Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Kostry dokumentů ve VIM

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.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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

Michal Burda

Michal Burda

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.

Školení: IP v 6 na Linuxu

Tento krátký kurz je určený speciálně pro zkušené správce sítí IPv4, kteří se chtějí seznámit s nastupujícím internetovým protokolem IPv6.

Platforma: Linux

  • Adresace
  • Link-local adresy
  • Dynamické přidělování adres
  • a další

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 3,19

Přehled názorů

bez titulku
RedDragon 16. 7. 2002 02:50
Nový
bez titulku
Tomas Zellerin 16. 7. 2002 08:45
Nový
└ 
Re:
Michal Burda 16. 7. 2002 19:40
Nový
bez titulku
Karel Zak 16. 7. 2002 10:54
Nový
~/.vim/skeletons
jam 16. 7. 2002 11:01
Nový
Velmi dobre
george 16. 7. 2002 12:44
Nový
└ 
Re: Velmi dobre
martin hassman 16. 7. 2002 14:14
Nový
username
Víťa B 16. 7. 2002 15:12
Nový
└ 
Re: username
nn at rtfm dot cz 16. 7. 2002 19:14
Nový
 
└ 
Re: username
Nipo 23. 7. 2002 10:52
Nový
Sice jsem se na to zde jiz kdysi ptal, ale ...
David Kříž 16. 7. 2002 18:03
Nový
├ 
Re: Sice jsem se na to zde jiz kdysi ptal, ale ...
Michal Burda 16. 7. 2002 19:33
Nový
├ 
Re: Sice jsem se na to zde jiz kdysi ptal, ale ...
martin kavalec 16. 7. 2002 19:38
Nový
│
└ 
Re: Sice jsem se na to zde jiz kdysi ptal, ale ...
Michal Burda 16. 7. 2002 19:48
Nový
│
 
└ 
Re: Sice jsem se na to zde jiz kdysi ptal, ale ...
martin kavalec 17. 7. 2002 11:54
Nový
└ 
Re: Sice jsem se na to zde jiz kdysi ptal, ale ...
Tomas Zellerin 17. 7. 2002 08:51
Nový
 
└ 
Re: Sice ... (oprava)
Tomas Zellerin 17. 7. 2002 09:27
Nový
zjednoduššení
Tomas Zellerin 17. 7. 2002 11:04
Nový
Prázdný první řádek v novém doumentu
Jindřich 18. 7. 2002 12:08
Nový
└ 
Re: Prázdný první řádek v novém doumentu
Tomas Zellerin 18. 7. 2002 14:19
Nový
velmi pekny clanok
Rado Bonk 18. 7. 2002 13:25
Nový
Chybycka vo funkcii SKEL_on_new_file
Lubo Zavacky 3. 3. 2006 12:42
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem