Textový editor Vim jako IDE (5.část)

28. 7. 2011
Doba čtení: 17 minut

Sdílet

V páté části seriálu o využití textového editoru Vim (nejenom) ve funkci vývojového prostředí se zaměříme na možná poněkud okrajovou, ale přesto užitečnou vlastnost. Jedná se o možnost definice vlastních syntaktických pravidel používaných pro zvýraznění syntaxe zdrojových kódů, popř. jakéhokoli jiného strukturovaného textu.

Obsah

1. Atributy používané u příkazu :highlight

2. Změna způsobu obarvení zdrojových kódů a test možností použitého terminálu

3. Tvorba vlastních syntaktických kategorií

4. Syntaktická kategorie zadaná výčtem klíčových slov

5. Syntaktická kategorie zadaná regulárním výrazem

6. Malý trénink: regulární výrazy pro rozpoznání IP adresy

7. Použití regulárních výrazů pro zvýraznění syntaktických kategorií v praxi

8. Syntaktická kategorie zadaná ve formě oblasti (regionu)

9. Odkazy na Internetu

1. Atributy používané u příkazu :highlight

Na konci čtvrté části seriálu o textovém editoru Vim jsme si ukázali, jakým způsobem je možné nastavit barvu pozadí a popředí editovaných textů, popř. i styl písma pro jednotlivé syntaktické kategorie (komentář, konstanta, výraz, jméno funkce, …) definované v externích souborech dodávaných přímo s Vimem. Ovšem možnosti jednotlivých typů terminálů (přesněji řečeno jejich emulátorů) se od sebe v mnoha ohledech odlišují. Některé emulátory terminálů, popř. pouze nesprávně nastavené emulátory (což je častější případ) například nedokážou změnit barvu textu nebo barvu pozadí, jiné terminály jsou omezeny na 8 nebo 16 základních barev a naproti tomu Vim přeložený s podporou GUI a spuštěný příkazem gvim nebo vim -g dokáže většinou rozlišit až 16 milionů barev a současně i měnit styl písma (kurzíva, tučné písmo, podtržené písmo, podtržení vlnovkami, což je mimochodem relativní novinka atd.). Připomeňme si, že pro nastavení zvýraznění určité syntaktické kategorie se používá příkaz :highlight, nebo taktéž jeho zkrácená verze :hi:

:highlight syntaktická_kategorie atributy

popř:

:hi syntaktická_kategorie atributy

Obrázek 1: Textový editor Vim nepodporující práci s GUI, který je spuštěný v emulátoru terminálu (urxvt). Informaci, zda daná varianta Vimu práci s GUI podporuje, lze získat pomocí příkazu :ver nebo :version.

V případě syntaktické kategorie se může jednat například o obecná jména používaná u mnoha typů programovacích jazyků, například Normal, Comment, Constant, popř. o jména používaná pouze pro jeden konkrétní jazyk/typ souboru (cOctalZero, cPreCondit) atd. – viz též další kapitoly s podrobnějším popisem vytváření nových syntaktických kategorií. Atributem je v případě příkazu :highlight myšlena dvojice sestavená z názvu atributu a jeho hodnoty (mezi názvem atributu a hodnotou je znak rovnítka). Názvem atributu může být:

Název atributu Význam
term nastavení zvýraznění oblasti textu pro běžné terminály (ovšem zdaleka neplatí, že všechny možnosti musí daný terminál umět zobrazit, týká se to například tučného písma či podtržení, které je většinou nahrazeno pouze změnou intenzity textu)
cterm nastavení pro terminály podporující práci s barvou (color-xterm, rxvt/urxvt, gnome-terminal a mnoho dalších), jinak stejné parametry jako pro term
ctermbg barva pozadí textu pro terminály podporující práci s barvou
ctermfg barva popředí textu pro terminály podporující práci s barvou
gui použitelné, pokud je Vim zkompilován s podporou GUI, hodnoty stejné, jako u atributů termcterm
guibg barva pozadí textu pro Vim zkompilovaný s podporou GUI
guifg barva popředí textu pro Vim zkompilovaný s podporou GUI
guisp barva podtržení textů pro Vim zkompilovaný s podporou GUI

Obrázek 2: Textový editor Vim, který byl přeložen s podporou běhu v GUI.

2. Změna způsobu obarvení zdrojových kódů a test možností použitého terminálu

Atribut term by měl, alespoň v minimální míře, pracovat s jakýmkoli typem terminálu. Hodnota tohoto atributu může být:

term= Význam
NONE používáno pro nastavení původního významu (reset předchozího nastavení)
standout normální font i zvýraznění
bold tučné písmo (popř. změna intenzity či barvy)
italic kurzíva (popř. změna intenzity či barvy)
underline podtržené písmo
undercurl podtržení textu vlnovkami
reverse inverzní zobrazení textu
inverse inverzní zobrazení textu

Obrázek 3: Skript colortest.vim spuštěný ve Vimu, jenž byl přeložen s podporou běhu v GUI.

Shodné hodnoty je možné zadávat i u atributů cterm (terminály s podporou barev) a gui (Vim přeložený s podporou GUI). Důvod, proč existují pro nastavení té samé vlastnosti tři různé atributy je jednoduchý – v mnoha případech potřebujeme, aby se nějaká syntaktická kategorie zobrazovala na různém typu terminálu různým způsobem, například aby se slovo s překlepem v GUI zobrazilo s červeným podtržením, zatímco v terminálu odlišnou barvou písma. U atributů ctermfg (barva popředí) a ctermbg (barva pozadí) lze jako jejich hodnotu zadat buď číslo barvy v rozmezí 0 až 15, popř. jméno barvy. Ve skutečnosti se však například u mnoha emulátorů terminálů pracujících v systému X provádí ještě jedno mapování mezi číslem/názvem barvy a skutečnou barvou, ovšem tuto skutečnost již Vim nemůže nijak ovlivnit (což je ostatně správné, protože uživatelé nemusí chtít zobrazit určité nečitelné barvové kombinace).

Obrázek 4: Skript colortest.vim spuštěný ve Vimu, jenž nebyl přeložen s podporou běhu v GUI (Vim je spuštěn v emulátoru terminálu urxvt).

Toto mapování se nastavuje buď v souboru .Xdefaults (platí kromě xtermu například i pro (u)rxvt), nebo lze aktuálně používané mapování změnit v konfiguračním dialogu, což je případ gnome-terminalu a dalších těžkotonážních :-) terminálových emulátorů. Dobrou zprávou je, že možnosti terminálu lze poměrně jednoduše otestovat, a to přímo z textového editoru Vim. Součástí instalace tohoto textového editoru je totiž i soubor colortest.vim, který je možné pro tyto účely využít. Jedná se o skript napsaný v interním skriptovacím jazyce Vimu, jehož popisem se budeme zabývat v závěru tohoto článku. Vzhledem k tomu, že se jedná o skript, spouští se obsah tohoto souboru příkazem :source, popř. jeho zkrácenou verzí :so následujícím způsobem:

:source $VIMRUNTIME/syntax/colortest.vim

nebo pouze:

:so $VIMRUNTIME/syntax/colortest.vim

Poznámka: $VIMRUNTIME je proměnná prostředí, která je většinou nastavovaná přímo Vimem při svém spouštění. Pokud napíšete pouze:

:so $VIMRUNTIME/<Tab>

tak se tato proměnná nahradí svou hodnotou, tj. cestou k runtime souborům.

Obrázek 5: Skript colortest.vim spuštěný ve Vimu, jenž nebyl přeložen s podporou běhu v GUI (Vim je spuštěn ve známém emulátoru terminálu gnome-terminal).

3. Tvorba vlastních syntaktických kategorií

Společně s textovým editorem Vim je dodáváno několik stovek (více než 500) konfiguračních souborů obsahujících syntaktická pravidla pro různé programovací jazyky, značkovací jazyky (HTML, XML, TeX) i některé typy konfiguračních souborů. I přes velké úsilí, které mnoho programátorů do tvorby konfiguračních souborů se syntaktickými pravidly vkládá, se však může stát, že je nutné vytvořit nová pravidla a/nebo zcela nový konfigurační soubor. I když se zpočátku možná může zdát, že je tvorba nových pravidel složitá, je možné pro mnoho typů strukturovaných souborů ve skutečnosti vytvořit pravidla poměrně jednoduchým způsobem. Začněme od těch nejjednodušších příkladů. Veškeré vytváření, nastavení či mazání syntaktických pravidel se provádí pomocí příkazu :syntax, jenž se obvykle zkracuje na :syn nebo méně často na :sy. Pokud je tento příkaz pouze spuštěn bez dalších parametrů, vypíše právě aktivní syntaktická pravidla, která se samozřejmě liší podle toho, jaký soubor je právě editován.

Obrázek 6: Změna původně světle zelené barvy na barvu fialovou v konfiguračním dialogu emulátoru terminálu gnome-terminal.

Za příkazem :syntax lze uvést poměrně velké množství dalších modifikátorů a atributů, nás však budou v tomto článku zajímat pouze čtyři modifikátory, které jsou vypsány v následující tabulce:

Příkaz Význam
:syntax clear vymazání všech syntaktických kategorií
:syntax clear kategorie vymazání jedné syntaktické kategorie (užitečné především při postupném ladění různých možností)
:syntax keyword kategorie … vytvoření nové syntaktické kategorie obsahující klíčová slova
:syntax match kategorie … vytvoření nové syntaktické kategorie zadané regulárním výrazem
:syntax region kategorie … vytvoření nové syntaktické kategorie zadané regulárním výrazem označujícím začátek kategorie a druhým výrazem označujícím její konec

V následujících kapitolách si podrobněji popíšeme možnosti definice nových klíčových slov, specifikace syntaktické kategorie pomocí regulárního výrazu i specifikace oblasti (regionu) pomocí dvojice regulárních výrazů.

Obrázek 7: Po změně konfigurace gnome-terminalu (viz předchozí snímek) se barva ve Vimu skutečně změní, i když si Vim (či libovolný jiný terminálový program) stále myslí, že zobrazuje zelenou barvu.

4. Syntaktická kategorie zadaná výčtem klíčových slov

Nejsnazší je vytvoření nové syntaktické kategorie definované výčtem klíčových slov. Pro vytvoření této kategorie se používá následující formát příkazu :syntax:

:syntax keyword kategorie slovo slovo slovo...

Podívejme se na příklad z praxe. Jedná se o část obsahu konfiguračního souboru určeného pro „obarvení“ zdrojových kódů napsaných v Javě (aby k obarvení skutečně došlo, je samozřejmě nutné k dané syntaktické kategorii, například ke kategorii nazvané javaConditional, nadefinovat pomocí příkazu :highlight barvu textu či barvu pozadí):

:syntax keyword javaConditional  if else switch
:syntax keyword javaRepeat       while for do
:syntax keyword javaBoolean      true false
:syntax keyword javaConstant     null
:syntax keyword javaTypedef      this super
:syntax keyword javaOperator     new instanceof
:syntax keyword javaType         boolean char byte short int long float double
:syntax keyword javaType         void
:syntax keyword javaStatement    return
:syntax keyword javaStorageClass static synchronized transient volatile final strictfp serializable
:syntax keyword javaExceptions   throw try catch finally
:syntax keyword javaAssert       assert
:syntax keyword javaMethodDecl   synchronized throws
:syntax keyword javaClassDecl    extends implements interface
:syntax keyword javaClassDecl    enum
:syntax keyword javaBranch       break continue nextgroup=javaUserLabelRef skipwhite
:syntax keyword javaScopeDecl    public protected private abstract

Obrázek 8: Ukázka konfiguračního souboru obsahujícího některá klíčová slova používaná v programovacím jazyku Java.

Naproti tomu, že pro prakticky jakýkoli v současnosti používaný programovací jazyk je již k němu příslušný soubor s definicí syntaxe vytvořen a odladěn, mohou se jednoduché definice syntaktických kategorií založené pouze na klíčových slovech uplatnit i u zdánlivě nestrukturovaných typů souborů. Osobně si například zapisuji různé poznámky do souboru s koncovkou .cal. Jedná se o běžný textový soubor, v němž se však po čase začala ukazovat jistá struktura se slovy, která by se vyplatilo mít zvýrazněná. Řešením byly následující řádky zapsané do konfiguračního souboru .vimrc, který se načítá při každém spuštění Vimu. Tyto řádky zajistí, že se příkazy syntax spustí vždy, když se začne editovat soubor s koncovkou .cal (ve skutečnosti by bylo možné tyto definice uložit do samostatných souborů, ovšem mít veškerou osobní konfiguraci v jediném souboru .vimrc se ukázalo být při přechodech mezi různými počítači jako nejvíce vyhovující řešení):

highlight Days ctermfg=cyan  guifg=#aaffff
highlight Todo ctermfg=red   guifg=#ffaaaa
highlight Ok   ctermfg=green guifg=#aaffaa

augroup __calendar__
au!
au BufRead,BufNewFile *.cal syntax keyword Days Mon Tue Wed Thu Fri Sat Sun
au BufRead,BufNewFile *.cal syntax keyword Todo TODO
au BufRead,BufNewFile *.cal syntax keyword OK OK
augroup END

Příkazy augroup __calendar__augroup END tvoří blok obsahující další automatické příkazy. Pomocí au! jsou staré automatické příkazy smazány. Díky této struktuře je zaručeno korektní chování i v případě, že je soubor .vimrc spuštěn vícekrát (protože tento soubor není ve skutečnosti nic jiného, než skript vytvořený v interním skriptovacím jazyce Vimu).

Obrázek 9: Ukázka konfiguračního souboru obsahujícího některá klíčová slova používaná v PL/SQL.

5. Syntaktická kategorie zadaná regulárním výrazem

U velkého množství strukturovaných souborů si s pouhým přiřazením barev jednotlivým klíčovým slovům nevystačíme. V tomto případě přichází na řadu další možnost definice syntaktických kategorií – použití regulárních výrazů s využitím příkazu :syntax match. Již v úvodních částech tohoto seriálu jsme si bez dalšího podrobnějšího vysvětlení ukázali, jakým způsobem je možné ve zdrojových textech zvýraznit znaky tabulátoru, popř. barevně odlišit větší množství znaků tabulátoru napsaných ihned za sebou (v případech, kdy použití příkazu :set list pro zvýraznění řídicích znaků není vhodné či čitelné). Jedno z možných řešení tohoto problému vypadalo následovně:

:highlight Tab1 ctermbg=lightgreen guibg=#e0ffe0
:highlight Tab2 ctermbg=lightred   guibg=#ffe0e0
:highlight Tab3 ctermbg=lightblue  guibg=#e0e0ff
:highlight Tab4 ctermbg=lightcyan  guibg=#ffffe0
:syntax match Tab1 "\t"
:syntax match Tab2 "\t\t"
:syntax match Tab3 "\t\t\t"
:syntax match Tab4 "\t\t\t\t"

Obrázek 10: Zvýraznění tabulátorů pomocí změny barvy pozadí.

Význam prvních čtyř příkazů je zřejmý – nastavuje se barva pozadí textu pro čtyři nové syntaktické kategorie nazvané Tab1, Tab2, Tab3Tab4. Následuje čtveřice příkazů začínajících na :syntax match, kde jsou jednotlivé syntaktické kategorie definovány pomocí jednoduchých regulárních výrazů. Povšimněte si, že celý regulární výraz je umístěn mezi dvojici stejných znaků. Většinou se používají lomítka, ale lze použít i jiné znaky, například uvozovky apod. Vim se následně snaží v textu jednotlivé výrazy rozpoznat a následně přiřadit textům, které výrazu odpovídají, příslušné barevné zvýraznění. Jak je u regulárních výrazů zvykem, hledá se vždy nejdelší možný výskyt (regulární výraz je „žravý“).

6. Malý trénink: regulární výrazy pro rozpoznání IP adresy

Následuje ukázka poněkud složitějšího regulárního výrazu sloužícího pro barevné odlišení IPv4 adres. Přesněji řečeno se jedná o značně zjednodušenou verzi regulárního výrazu, který rozpoznává a následně obarví jakoukoli čtveřici čísel oddělených tečkou, tedy například i řetězec "0.9999999.256.256:

:highlight def IP_Address ctermfg=darkred
:syntax clear IP_Address
:syntax match IP_Address /[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/

Příkazem :syntax clear se pro jistotu vymaže předchozí definice syntaktické kategorie, protože v opačném případě by se nová definice pouze přidala k definici starší (to nemusí být vždy na škodu, ovšem v našem případě se tohoto chování Vimu raději zbavíme). Vzhledem k tomu, že předchozí regulární výraz rozpoznal jakoukoli čtveřici kladných čísel, můžeme se pokusit o jeho vylepšení a zpřesnění. Následující verze obsahuje test pouze na čísla mající trojici číslic. Pro tento účel lze využít omezení na minimální a maximální počet znaků. Tato omezení se zapisují ve složených závorkách, které je nutné uvodit zpětným lomítkem, podobně jako tečku:

:highlight def IP_Address ctermfg=darkred
:syntax clear IP_Address
:syntax match IP_Address /[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}\.[0-9]\{1,3}/

Regulární výraz rozpoznávající skutečně jen čtveřice čísel v rozsahu 0..255 (a nikoli v rozsahu 0..999) je ještě poněkud delší a – jak bývá zvykem – i méně čitelný:

:highlight def IP_Address ctermbg=yellow ctermfg=black guibg=yellow guifg=black
:syn clear IP_Address
:syn match IP_Address /\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)/

Obrázek 11: Soubor obsahující syntaktické pravidlo pro IP adresu a testovací soubor obarvený pomocí tohoto pravidla.

Jako už nikoli triviální úkol si můžete sami vyzkoušet, jak by vypadal regulární výraz rozpoznávající korektně všechny možné formy IPv6 adres (přiznám se, že jsem neměl trpělivost vytvořit skutečně funkční řešení se všemi možnými zápisy).

7. Použití regulárních výrazů pro zvýraznění syntaktických kategorií v praxi

V regulárních výrazech je možné pomocí znaků ^ a $ označit i začátek a konec textu na jednom textovém řádku, takže například zvýraznění správného odsazení o 4 znaky v souborech XML či XSL lze docílit pomocí následujících příkazů vložených do konfiguračního souboru .vimrc (pod pojmem „správné odsazení“ je zde myšleno odsazení definované nějakou štábní kulturou, protože jinak je odsazení v XML soubor spíše záležitostí čitelnosti pro lidské čtenáře):

    au BufRead,BufNewFile *.xml,*.xsl set expandtab tabstop=4 encoding=utf-8
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent1 "^    "
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent2 "^        "
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent3 "^            "
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent4 "^                "
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent5 "^                    "
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent6 "^                        "
    au BufRead,BufNewFile *.xml,*.xsl syntax match Indent7 "^                            "
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent1 ctermbg=lightgreen  guibg=#f0fff0
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent2 ctermbg=lightred    guibg=#fff0f0
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent3 ctermbg=lightblue   guibg=#f4f4ff
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent4 ctermbg=lightcyan   guibg=#ffffe8
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent5 ctermbg=lightyellow guibg=#f0ffff
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent6 ctermbg=lightcyan   guibg=#ffe8ff
    au BufRead,BufNewFile *.xml,*.xsl highlight Indent7 ctermbg=lightred    guibg=#f0fff0

Obrázek 12: Zvýraznění odsazení v souborech typu XML.

Jako další příklad si uveďme způsob zvýraznění číselných hodnot o různých základech na základě podobných pravidel, která platí pro většinu programovacích jazyků založených na céčku (C, C++, Java, JavaScript):

:highlight NumericConstantOctal   ctermfg=red    guifg=red
:highlight NumericConstantBinary  ctermfg=green  guifg=green
:highlight NumericConstantHex     ctermfg=blue   guifg=blue
:highlight NumericConstantDecimal ctermfg=cyan   guifg=cyan
:highlight NumericConstantFloat   ctermfg=yellow guifg=yellow

:syntax match NumericConstantOctal   "0[0-7_]*\>"
:syntax match NumericConstantBinary  "0[bB][01_]*\>"
:syntax match NumericConstantHex     "0[xX][0-9a-fA-F_]*\>"
:syntax match NumericConstantDecimal "[1-9_][0-9_]*\>"
:syntax match NumericConstantFloat   "[0-9_]*\.[0-9_]*\([eE][+-]\=[0-9_]*\)\=\>"

Znak > na konci regulárních výrazů znamená ukončení slova. Jedná se vlastně o atom, podobně jako je tomu u dalších znaků se speciálním významem, například již zmíněných ^ nebo $. Otestování těchto příkladů je jednoduché. Postačuje zkopírovat výše uvedenou sekvenci příkazů a uložit ji do nového souboru, například po názvem numeric_test.vim (přípona zaručí, že Vim správně zvýrazní příkazy i jejich parametry). Posléze je možné otevřít soubor obsahující čísla o různém základu a zadat příkaz:

:source numeric_test.vim

nebo pouze:

:so numeric_test.vim

Obrázek 13: Soubor obsahující syntaktická pravidla pro různé typy čísel a testovací soubor obarvený pomocí těchto pravidel.

8. Syntaktická kategorie zadaná ve formě oblasti (regionu)

Ovšem ani definice syntaktické kategorie s využitím regulárního výrazu nemusí ve všech případech dostačovat. Jedná se například o případy, kdy se ve zdrojovém kódu vyskytují nějaké vnořené bloky. Nemusí se přitom jednat jen o příkazové bloky, ale o jakékoli bloky s jasně určeným začátkem a koncem, v nichž se vyskytuje další text, který je vhodné mnohdy taktéž zvýraznit. Začněme opět jednoduchým příkladem – zvýrazněním komentářů, které mohou být zapisovány ve stylu C99, tj. může se jednat jak o jednořádkové komentáře začínající dvojicí lomítek, tak i o víceřádkové komentáře začínající znaky /* a končící znaky */. Jednodušší je definice syntaktické kategorie pro jednořádkové komentáře, protože zde si vystačíme s regulárním výrazem, který zachytí jakýkoli text od dvojitého lomítka až do konce řádku:

:syntax match oneLineComment "//.*"

Obrázek 14: Definice třech syntaktických kategorií – čísel, komentářů a příkazového bloku, ovšem uvnitř bloku se nerozpoznávají ani čísla ani komentáře (horní buffer).

U víceřádkového komentáře je situace složitější, ovšem v tomto případě je možné použít třetí typ definice syntaktické kategorie – určení takzvaného regionu. Pomocí dvou regulárních výrazů se určí začátek regionu i jeho konec, přičemž Vim dokáže správně začátky a konce regionů „spárovat“ (pokud toto chování z nějakého důvodu nevyhovuje, lze použít modifikátor keepend):

:syntax region multiLineComment start="/\*" end="\*/"

Zpětná lomítka jsou u obou regulárních výrazů atributů startend použita z toho důvodu, aby se zrušil speciální význam hvězdičky.

Obrázek 15: Modifikace syntaktické kategorie bloku tak, aby se uvnitř jeho těla rozpoznávaly komentáře.

Podobně by bylo možné definovat i příkazový blok, který taktéž vychází ze syntaxe programovacího jazyka C:

:syntax region commandBlock start="{" end="}"

Ve skutečnosti však je však situace s bloky trošku složitější, protože většinou potřebujeme uvnitř bloků zvýraznit i další syntaktické kategorie. Podívejme se na následující příklad:

bitcoin_skoleni

:hi CodeBlock guifg=cyan
:hi Numbers   guifg=yellow
:hi Comment   guifg=gray

:syn clear  CodeBlock
:syn clear  Numbers
:syn clear  Comment

:syn region CodeBlock start="{" end="}"
:syn match  Numbers /[0-9]\+/
:syn match  Comment "//.*"

Při spuštění tohoto skriptu sice dojde ke zvýraznění čísel i komentářů, ovšem pouze mimo blok umístěný mezi složenými závorkami. Aby došlo k rozeznávání čísel a komentářů i uvnitř bloků, je nutné použít modifikátor contained obsahující buď hodnotu ALL (blok může obsahovat všechny další syntaktické kategorie), nebo pouze seznam kategorií, které se uvnitř bloku mohou vyskytovat:

:hi CodeBlock guifg=cyan
:hi Numbers   guifg=yellow
:hi Comment   guifg=gray

:syn clear  CodeBlock
:syn clear  Numbers
:syn clear  Comment

:syn region CodeBlock start="{" end="}" contains=Numbers,Comment
:syn match  Numbers /[0-9]\+/
:syn match  Comment "//.*"

Obrázek 16: Blok může obsahovat jak komentáře, tak i čísla.

9. Odkazy na Internetu

  1. Clewn home page
    http://clewn.sourceforge.net/
  2. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  3. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  4. Vim home page
    http://www.vim.org/
  5. Exuberant ctags
    http://ctags.sourceforge.net/
  6. xxd (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=xxd
  7. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  8. ctags (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=ctags
  9. cscope (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=csco­pe
  10. Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
    http://www.thegeekstuff.com/2009/01/tu­torial-make-vim-as-your-cc-ide-using-cvim-plugin/
  11. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  12. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  13. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  14. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  15. Novinky ve VIM 7: Úvodní část – speller
    http://www.root.cz/vim-sedm-prvni-cast/
  16. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  17. vim2elvis: Přednosti a nedostaky Elvise v porovnání s Vimem
    http://www.root.cz/clanky/vim2elvis-1/
  18. vim2elvis: Shodné znaky mezi Elvisem a Vimem, nastaveníeditoru
    http://www.root.cz/clanky/vim2elvis-2/
  19. Nej… VIM pluginy (1)
    http://www.root.cz/clanky/nej-vim-pluginy/
  20. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  21. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  22. JavaBrowser : Shows java file class, package in a tree as in IDEs. Java source browser.
    http://www.vim.org/scripts/scrip­t.php?script_id=588
  23. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  24. Scroll Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Scroll_lock
  25. Caps Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Caps_Lock
  26. Avoid the escape key
    http://vim.wikia.com/wiki/A­void_the_escape_key
  27. Map caps lock to escape in XWindows
    http://vim.wikia.com/wiki/VimTip166

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.