Outline editory: The Vim Outliner (2)

14. 10. 2004
Doba čtení: 12 minut

Sdílet

Dnešní díl seriálu o outline editorech je věnován bližšímu popisu maker TVO pro textový editor vim. Zmíním se o základních i pokročilejších příkazech, které je možné při editaci osnovy použít, tvorbě hypertextových odkazů a o nastavení vlastních barev pro zvýraznění nadpisů.

Obsah

1. Bližší pohled na formát souborů .otl
2. Základní příkazy pro práci s osnovou
3. Výběr zobrazovaných úrovní nadpisů v osnově
4. Pokročilejší práce s osnovou
5. Odskoky, kotvy a hypertextové odkazy
6. Nastavení vlastních barev
7. Obsah dalšího pokračování
 

1. Bližší pohled na formát souborů .otl

Již v předchozí části tohoto seriálu jsme si řekli, že při práci s makry TVO (TheVim Outliner) se zapsaná osnova ukládá do běžného textového souboru, který je možné otevřít a editovat v prakticky jakémkoliv textovém editoru, jenž ovšem zachovává znaky TAB. Aby však bylo možné specifikovat v zapisovaném textu hierarchii, je nutné do relativně volně psaného textu vložit vhodné značky, pomocí kterých budou makra TVO text zpracovávat.

Samotná hierarchie (osnova) je v textu vyznačena velmi jednoduše – počet tabelačních značek na začátku řádku specifikuje úroveň textu v hierarchii na tomto řádku. Pokud řádek přímo začíná textem, tj. neobsahuje na svém začátku žádné znaky TAB, jedná se o nadpis na nejvyšším stupni hierarchie, pokud je na začátku řádku jeden znak TAB, jedná se o nadpis poznámky na druhé úrovni atd. V TVO lze zpracovávat text až do desáté úrovně hierarchie, což by mělo postačovat pro prakticky všechna myslitelná použití.

Značky TAB se však mohou na řádku vyskytovat kdekoliv, tj. nejenom na jeho samotném začátku. Tyto další znaky nemají pro TVO žádný speciální význam, proto je například možné bez obav a jednoduše vytvářet tabulky či seznamy právě s použitím znaků TAB pro zarovnání částí textů do sloupců. Pro TVO je určující pouze samotná přítomnost znaků TAB, nikoli jejich šířka při zobrazení textu v editoru. Je tedy možné bez obav měnit „šířku TABů“ pomocí příkazů:

:set tabstop=???

(samozřejmě to platí pouze za předpokladu, že je vypnuta expanze tabelačních značek pomocí příkazu :set noexpandtab).

Na prvním obrázku vidíte spuštěný editor vim se zobrazenou osnovou, kde jsou jednotlivé úrovně hierarchie určeny znaky TAB a k tomu ještě barevně odlišeny (ke zvýraznění syntaxe jednotlivých nadpisů se dostanu dále v tomto dílu). Aby bylo použití znaků TAB patrné, je na druhém obrázku zobrazena ta samá osnova, avšak se zobrazením řídících znaků TAB (symbolicky naznačeno jako dvojice znaků ^I) aCR (naznačeno dolarem – $). řídící znaky jsou zobrazeny červeným písmem na šedém pozadí, aby se od dalšího textu odlišily. Zobrazení těchto znaků lze zapnout příkazem:

:set list

a opětovně vypnout příkazem:

:set nolist

A o zvýraznění samotných řídících znaků se postaraly příkazy:

:highlight Nontext guifg=red guibg=lightgray
:highlight SpecialKey guifg=red guibg=lightgray

Osnova textu zobrazená v editoru vim se zapnutými makry TVO
Obrázek 1: Osnova textu zobrazená v editoru vim se zapnutými makry TVO

Zobrazení řídících znaků v osnově
Obrázek 2: Zobrazení řídících znaků v osnově

Dalším znakem, který má pro zpracování textu zvláštní význam, je znak roury (pipe), tj. |. Pokud je tento znak použit na řádku jako první „nebílý“ znak, značí to, že se jedná o řádek běžného odstavcového textu, který je možné formátovat. Pokud se formátuje celý odstavec, kde je každý řádek uvozen znakem roury, jsou tyto znaky automaticky přeskládány, tudíž nedojde k rozpadu odstavce. Na třetím obrázku je ukázáno, jakým způsobem je možné vytvářet odstavcový text. Všimněte si, že znak roura nemusí být na začátku řádku první, může mu předcházet libovolný počet „bílých znaků“, tj. mezer a tabulátorů.

Kombinace osnovy a odstavcového textu
Obrázek 3: Kombinace osnovy a odstavcového textu

Kromě znaku roury lze použít ještě další dva znaky s podobným významem. Jedná se o znak mínusu, tj. -, a hvězdičky, tj. *. Tyto znaky také vyznačují běžný text, který lze formátovat, rozdíl ale nastává při stisku klávesy Enter. Pokud začíná aktivní řádek mínusem nebo hvězdičkou, je začátek dalšího řádku posunut tak, aby tyto znaky vypadaly jako odrážky. Tímto způsobem je možné vytvářet jednoduché víceřádkové seznamy s odrážkami. Ukázka vytvořených seznamů je na čtvrtém obrázku.

Vytváření jednoduchých víceřádkových seznamů s odrážkami
Obrázek 4: Vytváření jednoduchých víceřádkových seznamů s odrážkami

Při vytváření nadpisu, tj. řádku, který nezačíná rourou, mínusem či hvězdičkou, je možné použít znak plus, tj. +. Tento znak je využit při extrakci textu nebo osnovy do dalšího souboru. Touto problematikou se budu podrobněji zabývat v dalším textu.

Posledními znaky, které mají pro makra TVO význam, jsou znaky pro závorky, tj. [ a ]. Pomocí těchto znaků je možné vytvářet hypertextové odkazy a kotvy, tj. místa, na něž hypertextové odkazy směřují. Více informací o hypertextových odkazech se rovněž dozvíte v dalším textu. Ukázka textu s hypertextovými odkazy a kotvami je na pátém obrázku.

Hypertextové odkazy a kotvy
Obrázek 5: Hypertextové odkazy a kotvy

2. Základní příkazy pro práci s osnovou

Pokud se v textovém editoru vim s korektně nainstalovanými makryTVO otevře soubor s příponou .otl, je k dispozici cca třicet příkazů, pomocí kterých je možné zpracovávat hierarchicky strukturovaný text. Některé příkazy jsou zcela nové, tj. v původním vimu neexistují, další příkazy jsou upravené, tj. ve vimu existovaly a v TVO mají sice podobný význam, ale text se zpracovává poněkud odlišně než při použití nemodifikovaných příkazů.

Nejprve si řekněme, jakým způsobem se text zapisuje. Zde nedochází k žádným výrazným změnám, hierarchicky strukturovaný text se zapisuje stejně jako text nestrukturovaný. Pouze se pomocí znaků TAB, hvězdičky, roury apod. vyznačují jednotlivé úrovně textu, seznamy, odkazy atd.

Důležitější změny nastávají v normálním režimu, tj. v režimu, ve kterém se zadávají příkazy pro práci s textem. Vzhledem k tomu, že je TVO založeno na optickém skládání částí textů do jednoho řádku (foldingu), jsou některé příkazy pro práci s osnovou založeny na původních příkazech vimu, které s foldy pracovaly.

Pravděpodobně nejpoužívanějšími příkazy jsou = (rovnítko) a – (mínus). Pomocí rovnítka se provede rozbalení stromu osnovy v místě, kde se nachází textový kurzor. Naproti tomu pomocí mínusu se provede zabalení té části textu, ve které se kurzor nachází, a to včetně všech textů na nižší hierarchii. Místo rovnítka je možné použít i původní příkaz vimu, který zněl zo (open fold). Mínus lze nahradit původním příkazemzc (close fold). Kromě toho je možné použít i myš, kde dvojí poklepání střídavě zavírá a otevírá část textu, na kterém se nachází kurzor.

Před popisem dalších příkazů TVO se musím zmínit o proměnné maplocalleader. Jedná se o interní proměnnou samotného vimu, pomocí níž se nastavuje klávesa, kterou začínají rozšiřující příkazy. Při instalaci TVO je tato klávesa nastavena na \, tj. zpětné lomítko (backslash). Na jednu stranu se jedná o vhodnou volbu, protože tato klávesa nemá přiřazen žádný původní význam – viz :help \. Ovšem zpětné lomítko se na české klávesnici píše poměrně složitě (a také se jeho umístění na různých klávesnicích skandálně liší), proto si tuto klávesu překonfigurujeme na komfortněji zapisovatelný znak , (čárka). To se provede jednoduše pomocí příkazu:

let maplocalleader = ","

který se umístí do souboru .vimrc v domácím adresáři uživatele.

Po této malé úpravě je možné i na české klávesnici používat následující sadu příkazů:

,j – přeskok kurzoru na nejbližší nadpis směrem dolů. Pomůcka: podobá se příkazu j pro posun kurzoru směrem dolů (ke konci textu).

,k – přeskok kurzoru na nejbližší nadpis směrem nahoru. Pomůcka: podobá se příkazu k pro posun kurzoru směrem nahoru.

,u – posun nadpisu i celé hierarchie pod nadpisem směrem nahoru přes další texty. Pomůcka: up.

,d – posun nadpisu i celé hierarchie pod nadpisem směrem dolů. Pomůcka: down.

,> – snížení úrovně řádku s kurzorem i celého textu v daném místě hierarchie. Pomůcka: podobá se příkazu >, který je použit k horizontálním posunům textu při zápisu programů.

,< – zvýšení úrovně řádku s kurzorem i textu v dané hierarchii. Pomůcka: podobá se příkazu <.

,C – změna nadpisu, na kterém je kurzor i celé podřízené hierarchie textu. Pomůcka: podobá se příkazu c (change). Vzhledem k tomu, že se jedná o poměrně „nebezpečný“ příkaz, který mění potenciálně velkou část textů, je pro něj zvoleno velké písmeno, které se hůře zmáčkne omylem.

,D – smazání nadpisu, na kterém je kurzor i celé podřízené hierarchie textů. Podobá se příkazu D (delete) a také zde je pro omezení chyby použito velké písmeno.

,y – vložení nadpisu, na kterém je kurzor, a současně i přináležejícího textu do schránky nebo vybraného registru editoru vim. Podobá se příkazu y (yank).

,p – vložení textu (a obecně celé hierarchie), který je uložen ve schránce nebo v registru editoru vim, pod aktuální řádek. Tento příkaz se podobá příkazu p (put).

,P – tento příkaz je podobný příkazu ,p s tím rozdílem, že je text vložen před aktuální řádek. Jedná se tedy o analogii původního příkazuP.

3. Výběr zobrazovaných úrovní nadpisů v osnově

Velkou výhodou outline editorů je možnost zobrazit pouze tu část textu, která je pro práci uživatele v dané chvíli relevantní. Proto jsou, zejména při práci s delšími dokumenty, důležité příkazy pro skrytí a následné zobrazení různých úrovní nadpisů. Tuto činnost je možné v TVO provést velmi jednoduše pomocí několika příkazů, které jsou zcela nové, tj. v původním vimu pro ně neexistuje ekvivalent:

,1 – zobrazení pouze nadpisů na první (nejvyšší) úrovni.

,2 – zobrazení nadpisů na první a druhé úrovni.

,3 – zobrazení nadpisů na úrovni 1–3.

,4 – zobrazení nadpisů na úrovni 1–4.

,5 – zobrazení nadpisů na úrovni 1–5.

,6 – zobrazení nadpisů na úrovni 1–6.

,7 – zobrazení nadpisů na úrovni 1–7.

,8 – zobrazení nadpisů na úrovni 1–8.

,9 – zobrazení nadpisů na úrovni 1–9.

,a – zobrazení veškerých nadpisů i s běžným textem.

,t – zapnutí či vypnutí zobrazení textů. Při vypnutém zobrazení textů se budou zobrazovat pouze nadpisy do zadané úrovně.

Všechny výše uvedené příkazy lze vyvolat i z menu, které je v případě editace souborů s koncovkou .otl automaticky načteno. Menu lze použít jak v GUI verzi vimu, tak i v textové verzi přes příkaz:

:emenu .

4. Pokročilejší práce s osnovou

Při práci s TVO je možné využít i následující tři příkazy, které umožňují pokročilejší operace s vytvářenou osnovou:

,T – extrakce textu do nového okna (které je editorem vimvytvořeno). Pozor: nevytvoří se soubor s textem, nejdříve je zapotřebí použít příkaz :w jméno.

,H – extrakce nadpisů do nového okna (které je taktéž editorem vytvořeno). Pro uložení obsahu okna do souboru opět použijte příkaz :w jméno.

,b – záměna nadpisů a textu (i obráceně). V podstatě se před text vloží znak |. Jedná se o velmi často používaný příkaz, protože je to rychlejší než na české klávesnici namačkat znak „|“.

5. Odskoky, kotvy a hypertextové odkazy

Textový editor vim má zabudovanou podporu pro práci s hypertextovými odkazy. Tato technika ve vimu pracuje tak, že po najetí textovým kurzorem na určité slovo a stlačení klávesové kombinace CTRL+] nebo dvojklikem levým tlačítkem myši je získáno celé slovo, na kterém se kurzor právě nachází, a posléze je v tzv. tag souboru získán příkaz, pomocí kterého se provede odskok. V tag souboru se ve většině případů používají příkazy pro prohledání textu, například /‚tag‘.

Kromě toho si vim pamatuje soubory a místa v těchto souborech, kde se kurzor nacházel před provedením skoku. Tato umístění jsou ukládána do zásobníku nazvaného tag stack. Z tohoto zásobníku je možné získat poslední pozici kurzoru a provést odskok na tuto pozici, která se může nacházet i v jiném souboru. Provedení této operace, která zhruba odpovídá operaci back ve WWW prohlížečích, je možné spustit pomocí klávesové zkratky CTRL+T.

Po spuštění maker TVO je podpora pro odkazy poněkud modifikována tak, aby nemusel být používán tag soubor. Prvním typem hypertextových odkazů jsou odkazy reprezentující příkazy samotného vimu, které se do textu zapisují ve tvaru [:příkaz]. Takové odkazy je možné použít například pro provedení nějakých předem naplánovaných akcí. Příklady:

[:help]
[:echo 10+10]

Druhým typem odkazů jsou odkazy na externí soubory. Ty se do textu zapisují ve formátu: [jméno souboru]. Pokud se textový kurzor myši nachází mezi rovnými závorkami se jménem souboru a je stlačena klávesová kombinace CTRL+] nebo je proveden dvojklik levým tlačítkem myši, otevře se soubor s daným jménem v aktivním okně, ovšem pouze za předpokladu, že právě editovaný soubor byl po modifikacích uložen. Tímto způsobem se tedy dají jednoduše tvořit osnovy, které obsahují pouze krátké texty s odkazy na plné znění textů či dalších údajů v jiných (ale pouze textových) souborech.

Třetím typem odkazů jsou odkazy na kotvy v textu, tj. místa v souboru, na které lze provádět odskoky. Kotva se vytvoří zápisem nějakého slova uzavřeného do dvou rovných závorek, například [[kotva]]. Hypertextový odkaz na kotvu je uzavřen do závorek jednoduchých, tj. [kotva]. Tento typ odkazů by byl pravděpodobně nejpoužívanějším, protože se pomocí něho dají vytvářet v dokumentu různé vazby, jeho podpora je však v současné verziTVO nedokončená. Snad se v příští verzi dočkáme lepší podpory této vlastnosti.

6. Nastavení vlastních barev

Nejprve se podívejme, jak jsou po instalaci TVO nastaveny barvy jednotlivých nadpisů v osnově, odkazů, odstavcového textu apod. Definice barev je umístěna v souboru otl.vim v podadresáři syntax, ve kterém kromě jiného najdeme i následující řád­ky:

ict ve školství 24

if g:otl_bold_headers
  hi def otlTab0 ctermfg=1 cterm=bold gui=bold guifg=red term=reverse
  hi def otlTab1 ctermfg=4 cterm=bold gui=bold guifg=blue term=reverse
  hi def otlTab2 ctermfg=2 cterm=bold gui=bold guifg=darkgreen term=reverse
  hi def otlTab3 ctermfg=3 cterm=bold gui=bold guifg=brown term=reverse
  hi def otlTab4 ctermfg=5 cterm=bold gui=bold guifg=darkmagenta term=reverse
  hi def otlTab5 ctermfg=6 cterm=bold gui=bold guifg=darkcyan term=reverse
  hi def otlTab6 ctermfg=1 cterm=bold gui=bold guifg=red term=reverse
  hi def otlTab7 ctermfg=4 cterm=bold gui=bold guifg=blue term=reverse
  hi def otlTab8 ctermfg=2 cterm=bold gui=bold guifg=darkgreen term=reverse
  hi def otlTab9 ctermfg=3 cterm=bold gui=bold guifg=brown term=reverse
else
  hi def otlTab0 ctermfg=1 cterm=NONE guifg=red
  hi def otlTab1 ctermfg=4 cterm=NONE guifg=blue
  hi def otlTab2 ctermfg=2 cterm=NONE guifg=darkgreen
  hi def otlTab3 ctermfg=3 cterm=NONE guifg=brown
  hi def otlTab4 ctermfg=5 cterm=NONE guifg=darkmagenta
  hi def otlTab5 ctermfg=6 cterm=NONE guifg=darkcyan
  hi def otlTab6 ctermfg=1 cterm=NONE guifg=red
  hi def otlTab7 ctermfg=4 cterm=NONE guifg=blue
  hi def otlTab8 ctermfg=2 cterm=NONE guifg=darkgreen
  hi def otlTab9 ctermfg=3 cterm=NONE guifg=brown
  hi def otlTodo ctermbg=3 cterm=NONE guibg=lightyellow
endif 

Jak je z předchozího kódu patrné, závisí výběr barev na nastavení globální proměnné otl_bold_headers, kterou je možné nastavit v souboru .vimrc. Pokud vám nevyhovuje tisk nadpisů tučným písmem, neměla by být tato proměnná nastavena. Změna barev je jednoduchá (stačí nahradit příslušné hodnoty barev nebo indexů barvy), jednotlivé řádky odpovídají úrovním nadpisů, poslední řádek specifikuje barvu slov „TODO“, „XXX“ a „NOTE“, která jsou zvýrazněna odlišně od ostatního textu, což je patrné i z dokumentace uložené v souboru readme.otl.

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

V dalším, už předposledním pokračování tohoto seriálu budeme finišovat – dokončíme povídání o TVO a ukážeme si, jakým způsobem je možné zpracovávat strukturovaný text s osnovou v dalších dvou často používaných textových editorech: Emacsu a jEditu.

Autor článku

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