Hlavní navigace

Outline editory: The Vim Outliner (3)

21. 10. 2004
Doba čtení: 10 minut

Sdílet

V dnešním pokračování seriálu o outline editorech nejprve dokončíme část věnovanou popisu maker TVO. Konkrétně se budeme zabývat způsobem barevného zvýraznění uživatelsky definovaných řetězců. Posléze si popíšeme dostupné možnosti uložení osnovy do vhodného externího souborového formátu.

Obsah

1. Zvýraznění vybraných řetězců v TVO
2. Zavedení nové skupiny se specifikací zobrazení textu
3. Zadání rozsahu textu pro vytvořenou skupinu či skupiny
4. Ukázka využití regulárních výrazů při specifikaci částí textů

    4.1 E-mailové adresy
    4.2 URL adresy
    4.3 Názvy počítačů v síti
    4.4 Telefonní čísla
    4.5 IP adresy
    4.6 Datum v českém formátu
    4.7 Syntaktické kategorie TVO
5. Uložení osnovy do externího souborového formátu
6. Obsah dalšího pokračování

1. Zvýraznění vybraných řetězců v TVO

Posledním vážnějším problémem, který je vhodné při práci s makry TVO vyřešit, je zvýraznění vlastních vybraných řetězců v odstavcovém textu. Tato vymoženost se může hodit například při zápisu e-mailových adres, telefonních čísel a při podobných příležitostech. Prostě pro jakýkoliv text, který lze zařadit do jednoduše popsatelných syntaktických kategorií, které je nutné oproti okolnímu textu zvýraznit.

Pokud jste až do dnešní doby používali pro zápis svých poznámek, seznamů či tabulek jednodušší textové editory, uvidíte, že se i na první pohled „normální“ text dá vhodným způsobem oživit a zpřehlednit; možnosti zvýraznění se tedy v žádném případě netýkají pouze umělých programovacích jazyků. Pro barevné rozlišení různých částí textů (samozřejmě kromě již zvýrazněných nadpisů a odstavcového textu – to za nás automaticky zařídí TVO) je nutné provést dva kroky:

  1. Prvním krokem je zavedení nové skupiny (group) reprezentující zvýrazněný text s uvedením jeho barvy, typu písma a případně i barvy pozadí. Způsob zvýraznění je do značné míry omezen možnostmi použitého terminálu, v GUI verzi je však možné provádět prakticky jakékoli změny.
  2. Druhým krokem je specifikace klíčových slov nebo rozsahu textu, tj. způsobu, jakým je rozeznán začátek a konec textu. Případně může být také uvedena šablona zadaná regulárním výrazem, díky čemuž máme při specifikaci textu pro zvýraznění k dispozici značně silný vyjadřovací prostředek.

2. Zavedení nové skupiny se specifikací zobrazení textu

První krok, tj. zavedení nové skupiny spolu se specifikací zobrazení textu, je poměrně jednoduchý. Stačí si zvolit vhodné jméno pro novou skupinu (mělo by odpovídat běžným konvencím pro názvy proměnných) a přiřadit této skupině vybranou barvu textu, barvu pozadí a případně i další atributy, například podtržení znaků apod.

Pro tuto činnost se ve vimu používá příkaz :hi resp. celým slovem :highlight v následujícím formátu:

:hi název_skupiny atribut1=hodnota1 atribut2=hodnota2...

Zbývá zjistit, jaké atributy a jim příslušné hodnoty je možné použít. Atributy se liší podle typu prostředí, ve kterém je textový editor vim spuštěn. Prostředí je z velké části určeno použitým terminálem či jeho emulátorem. Rozlišují se celkem tři typy terminálů: běžný terminál či jeho emulace (například xterm), barevný terminál (včetně linuxové, MS-DOSové a windowsové konzoly) a konečně plná GUI verze textového editoru vim.

Normální terminál umožňuje pozměnit pouze základní atribut, kterým je typ fontu. Příslušný atribut se jmenuje term a jeho možné hodnoty jsou:bold, underline, reverse, italic a standout. Z názvů hodnot by mělo být patrné, jak se zvýrazněné skupiny znaků na terminálu zobrazí. Pokud daný terminál některý typ přímo nepodporuje, může například místo kurzívy zobrazit blikající text apod., toto chování je však přímo z vimu neovliv­nitelné.

Pokud kupříkladu potřebujeme vytvořit zvýrazněnou skupinu řetězců nazvanou Datum a zobrazit ji kurzívou, je možné použít příkaz:

:hi Datum term=italic

Barevný terminál (typicky linuxová konzole) již poskytuje při nastavování zobrazení textů více možností, protože je většinou možné specifikovat jak barvu písma, tak i barvu pozadí. Pro tento účel se používají dva atributy nazvané ctermfg (barva popředí – foreground) a ctermbg (barva pozadí – background). Hodnotami těchto atributů mohou být buď indexy barev, nebo přímo jejich názvy. Bližší informace se dozvíte přímo ve vimu zadáním kouzelné formulky :he hi. Příklad vytvoření skupiny pojmenované Cas pro barevný terminál:

:hi Cas ctermfg=Yellow ctermbg=8

Největší možnosti pro obarvení textu existují samozřejmě v GUI verzi vimu, protože v této konfiguraci jsou k dispozici všechny systémové barvy i fonty. Mezi základní atributy patří styl fontu (atribut nazvaný gui), vlastní font (atribut font), barva písma (atribut guifg) a barva pozadí (atribut guibg).

Barvy lze zadat buď jejich jménem (k dispozici je cca třicet názvů základních barev odvozených od pojmenovaných barev X-Window systému), nebo číselným kódem ve stejném formátu, jaký se používá v HTML, tedy #rrggbb, kde se za dvojice znaků doplní hexadecimální hodnota barvové složky z rozsahu 00-ff. Příklad použití:

:hi Special guifg=yellow guibg=#0000aa

Ve výše uvedeném příkladu se pro barvu znaků použije žlutá a pro pozadí textu světle modrá barva (červená a zelená barvová složka jsou nastaveny na nulu, modrá složka je vysvícena přibližně na tři čtvrtiny svého maxima).

Je samozřejmě možné zadat skupinu a specifikovat její způsob zobrazení pro všechny tři typy terminálů současně, například:

:hi Pokus term=underline ctermfg=blue ctermbg=gray guifg=red guibg=blue 

Jak je z předchozího příkladu patrné, nemusí se barvy určené pro vykreslení znaků na barevném terminálu a v GUI verzi editoru shodovat, nastavení je tedy zcela libovolné.

Při editaci některého souboru známého typu je načtena šablona, která mnohdy obsahuje až stovky barevně odlišených skupin. Tyto skupiny lze jednoduše vypsat zadáním příkazu :hi bez dalších parametrů.

Pro podrobnější informace si můžete opět přímo ve vimu zakouzlit::he hi.

3. Zadání rozsahu textu pro vytvořenou skupinu či skupiny

Druhým krokem při zvýrazňování syntaxe je specifikace rozsahu textu, který do vytvořené skupiny určitým způsobem padne. Před dalšími experimenty je však zapotřebí udělat jednu změnu v souboru otl.vim, který se nachází v podadresáři syntax adresáře vimu. Na řádku, který začíná:

syn match otlText ...

je nutné změnit hodnotu parametru contains na ALL, tj. řádek může vypadat následovně:

syn match otlText /^\t*|.*/ contains=ALL display nextgroup=otlText 

Tímto způsobem si zpřístupníme možnost zvýraznění částí textů uvnitř odstavců. Pokud by se výše uvedený řádek nezměnil, nastavená pravidla pro zvýraznění syntaxe by se navzájem „přebíjela“ a naše nová syntaktická pravidla by se neuplatnila. Podobnou úpravu lze udělat i u dalších syntaktických kategorií, například u nadpisů, tam to ale podle mě poněkud postrádá smysl, protože nadpisy jsou samy o sobě již dostatečně zvýrazněny.

Následně je možné pro každou předem vytvořenou skupinu specifikovat pomocí regulárního výrazu pravidlo, pomocí kterého má být řetězec zvýrazněn podle parametrů vybrané skupiny. Pro tento účel je ve vimu zabudován příkaz :syntax, jehož bližší popis je opět možné získat přímo z vimu zadáním příkazu :help syntax.

Nejjednodušší je zvýraznění předem zadaných klíčových slov, které se dále nemění (například se neskloňují). Příklad je velmi jednoduchý: zvýraznění slov T-mobile, Eurotel a Oskar podle vlastností skupiny Mobily:

:syntax keyword Mobily T-mobile Eurotel Oskar

tj. nejdříve je uveden příkaz syntax, po něm specifikace keyword, následně název skupiny Mobily a po něm jednotlivá klíčová slova. Za zmínku také stojí fakt, že klíčové slovo T-mobile bude zvýrazněno pouze v případě, že je ve volbě iskeyword zahrnut znak – (minus). Případnou nepovinnou koncovku slov lze uzavřít do hranatých závorek [], v tomto případě je však již výhodnější použití regulárních výrazů.

Pro volnější specifikaci textu, jež se má od okolního textu barevně či jinak odlišit, je mnohem zajímavější použití regulárních výrazů, ty totiž umožňují specifikovat řetězce v textu mnohem pružněji než pouhým výčtem klíčových slov. Pro získání dokumentace s úplným popisem regulárních výrazů ve vimu je možné zadat příkaz :help regexp, takto získané informace můžete použít i v mnoha dalších aplikacích. My si zde ukážeme některé výrazy, které osobně používám při psaní poznámek i delších textů. Dále ukážu, jak se ke zvýraznění textu staví samotné TVO.

4. Ukázka využití regulárních výrazů při specifikaci částí textů

4.1 E-mailové adresy

Zvýraznění e-mailových adres, přičemž za zavináčem musí být po znacích anglické abecedy uvedena alespoň jedna tečka, za níž následují další znaky anglické abecedy. Začátek a konec regulárního výrazu je v tomto případě omezen znakem uvozovky, což je výhodné, protože se tento znak uvnitř výrazu nenachází:

:syntax match Email "[a-zA-Z0-9]\+@[a-zA-Z0-9]\+\.[a-zA-Z0-9]\+" 

Výše uvedený výraz odpovídá jednoduchým e-mailům, na jejichž pravé straně (tj. za zavináčem) se nachází pouze název serveru a země. Pro složitější e-maily s povolením tečky i před zavináčem je možné použít výraz:

:syntax match Email "[_=a-z\./+A-Z0-9-]\+@[a-zA-Z0-9\./\-]\+" 

4.2 URL adresy

Zvýraznění první části URL s protokolem HTTP a názvem serveru (je možné i zadání IP adresy), ale bez další cesty. Výraz je omezen znakem plus, ve vimu totiž může být hraniční znak jednoduše zvolen – jedná se o první nebílý znak uvedený za názvem skupiny:

:syntax match URL +http://[a-zA-Z0-9\.]*/+

Skupinu URL je kvůli konzistenci s WWW prohlížeči možné zvýraznit modrým písmem s podtržením.

4.3 Názvy počítačů v síti

Zvýraznění názvů počítačů v naší počítačové síti, jejichž jméno začíná na firma00bno a následuje pětice dalších libovolných znaků (opět je použit jiný hraniční znak):

:syntax match Computer /firma00bno...../

4.4 Telefonní čísla

Zvýraznění telefonních čísel začínajících na 0605. Takto lze barevně rozlišit mobilní operátory podle předvolby telefonního čísla, například vytvořením dalších skupin Tel2-TelN:

:syntax match Tel1 /0605-[0-9]*/

4.5 IP adresy

Zvýraznění IP adres počítačů a dalších síťových prvků:

:syntax match IP /[0-9][0-9]\?[0-9]\?\. [0-9][0-9]\?[0-9]\?\. [0-9][0-9]\?[0-9]\?\. [0-9][0-9]\?[0-9]\?/ 

(Pozn. red.: mezery za tečky byly přidány kvůli sazbě –Johanka)

4.6 Datum v českém formátu

Zvýraznění letošního data zapsaného v českém formátu, tj. den.měsíc.rok:

:syntax match Datum /[0-9][0-9]\?\.[0-9][0-9]\?\.2004/

4.7 Syntaktické kategorie TVO

Pro zajímavost si uveďme, jaké regulární výrazy používá TVO. Veškerá dále uvedená syntaktická pravidla jsou uložena v souboru otl.vim v podadresáři syntax. Nejprve uvedu pravidlo, kterým se odlišuje odstavcový text:

:syntax match otlText /^\t*|.*/

Toto pravidlo říká, že na začátku řádku se může vyskytovat libovolný počet znaků TAB, po nichž následuje povinný znak roura (pipe) – |. Po tomto znaku může následovat zbytek řádku s libovolnou strukturou.

Samotný znak uvozující každý řádek odstavcového textu je však vybarven odlišně, protože je pro něj použito následující pravidlo, které přebije pravidlo předchozí, protože je uvedeno později:

:syntax match otlTextLeader /^\t*|/

Pomocí dalšího pravidla jsou barevně odlišena klíčová slova TODO, XXX a NOTE. Nic nám samozřejmě nebrání rozšířit repertoár těchto slov, například si k nim přidat i české ekvivalenty:

:syntax match otlTodo /\<\(TODO\|XXX\|NOTE\)\>/

Složitěji jsou vytvořena pravidla pro jednotlivé úrovně osnovy, která vypadají následovně:

:syntax match otlTab9 /^\t\{9}[^\t|].*/
:syntax match otlTab8 /^\t\{8}[^\t|].*/
:syntax match otlTab7 /^\t\{7}[^\t|].*/
:syntax match otlTab6 /^\t\{6}[^\t|].*/
:syntax match otlTab5 /^\t\{5}[^\t|].*/
:syntax match otlTab4 /^\t\{4}[^\t|].*/
:syntax match otlTab3 /^\t\{3}[^\t|].*/
:syntax match otlTab2 /^\t\{2}[^\t|].*/
:syntax match otlTab1 /^\t\{1}[^\t|].*/
:syntax match otlTab0 /^[^\t|].*/ 

Jak je z výše uvedených pravidel patrné, musí platit, že se na začátku řádku po bílých znacích nesmí vyskytovat znak roury, protože by se v tomto případě jednalo o odstavcový text. Jednotlivé úrovně nadpisů se odlišují počtem znaků TAB, jejichž počet je uveden ve složených závorkách (v tomto případě se jedná o vimovské rozšíření regulárních výrazů, které je však možné nahradit i explicitním výpisem jednotlivých znakůTAB).

5. Uložení osnovy do externího souborového formátu

Po vytvoření osnovy mnohdy stojíme před dosti závažným úkolem – vytvořit podle pracně vytvořené osnovy vhodný text a následně tento text distribuovat buď v tištěné, nebo v elektronické podobě. V tomto směru nám však TVO neposkytuje moc velké možnosti. Autor sice k TVO přiložil sadu filtrů naprogramovaných v jazycích Perl a Ruby, pomocí nichž lze provést převod původní osnovy do dalších formátů, zejména HTML a RTF, ale další filtry nejsou podporovány.

Osobně nejvíce postrádám export do LaTeXu, kdy by se jednotlivé úrovně osnovy mohly převést například na příkazy \chapter{}, \section{}, \subsection{} atd. Export do HTML zase postrádá volby pro vytvoření takové stránky, na níž by bylo možné kliknutím myši jednoduše skrývat nebo naopak zobrazovat různé úrovně v hierarchii – jedná se o poměrně jednoduchou věc realizovanou pomocí JavaScriptu a CSS. Podobné možnosti například nabízí (v dalším článku popisovaná) aplikace FreeMind a stejnou technologii můžeme také vidět na mnoha (zejména intranetových) stránkách se složitou strukturou, kterou je zapotřebí uživateli co nejjednodušší formou prezentovat.

Převod do LaTeXu by neměl být příliš složitý, stačí se pouze inspirovat již hotovými filtry do HTML. Nevýhodou však v obou případech konverze je, že se nezachovají (resp. vůbec neberou v úvahu) uživatelsky specifikovaná syntaktická pravidla, protože filtry pracují pouze nad textem uloženým v externím souboru a nemají žádné návazné informace například na soubor otl.vim či na uživatelské nastavení v souboru.vimrc. Pro tento účel by bylo ideální vytvořit konverzní filtr přímo ve vimu, který by pracoval podobně jako známý a mnou často používaný 2html.vim.

root_podpora

Doufám, že by výše uvedený odstavec mohl inspirovat nějakého vimovského šamana k sepsání potřebných konverzních maker. Komunitě, která vim a TVO dennodenně používá, by to jistě pomohlo ke snazší prezentaci svých textů.

6. Obsah dalšího pokračování

Touto částí jsme ukončili povídání o vimu a makrech TVO, případné dotazy se samozřejmě pokusím zodpovědět v diskusi pod článkem. V dalším pokračování bych se rád věnoval popisu možností textových editorů jEdit a Emacs při práci s osnovou.

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

Autor článku

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