Hlavní navigace

vim2elvis (2)

24. 2. 2005
Doba čtení: 11 minut

Sdílet

V předchozí části tohoto miniseriálu jsme si stručně vysvětlili některé přednosti a zápory textových editorů Vim a Elvis. V závěrečné části půjdeme již více do hloubky, protože si ukážeme jak konkrétní rozdíly v chování těchto editorů, tak i nastavení, pomocí kterých lze Elvis nakonfigurovat takovým způsobem, aby se co nejvíce podobal Vimu.

Obsah

1. Shodné znaky Elvise s Vimem
    1.1 Příkazy editoru vi
    1.2 Příkazy pro práci s okny

    1.3 Vizuální bloky
    1.4 Textové objekty
2. Rozdíly mezi Elvisem a Vimem
    2.1 Odlišné zpracování chyb při překladu
    2.2 Rozdílné chování voleb textwidth a wrapmargin

    2.3 Volba inputtab
3. Na co si dát při práci s Elvisem pozor?
    3.1 Registry
    3.2 Skripty a zabudované funkce
    3.3 Příkaz map

4. Přizpůsobení Elvise
    4.1 Formátování odstavců
    4.2 Rozšířené příkazy příkazového režimu
    4.3 Chování editoru
    4.4 Barvy a zvýrazňování syntaxe

    4.5 Nastavení tiskárny
5. Závěr

1. Shodné znaky Elvise s Vimem

Vzhledem k tomu, že jak Vim, tak i Elvis ideově vychází ze stejného předchůdce – slavného vi, vykazují tyto editory shodné vlastnosti, zejména v příkazech, které jsou s vi kompatibilní. To však není zdaleka vše, protože tvůrci obou těchto editorů se vzájemně inspirují, takže se některé nové vlastnosti implementují stejným nebo alespoň velmi podobným způsobem (textové objekty, práce s okny apod.).

1.1 Příkazy editoru vi

Základní příkazy původního textového editoru vi zvládají oba popisované editory. Výjimku představují pouze některé příkazy, které byly oproti vi rozšířeny. Týká se to zejména příkazu u (undo), který má v původním vi pouze jednu úroveň, takže druhé stisknutí klávesy u ve skutečnosti znamenalo operaciredo (toto chování lze ve Vimu i Elvisovi napodobit volbou :set compatible).

Také není plně podporován takzvaný „open mode“, který se v původním vi používal na „hloupých“ řádkových terminálech nebo při přesměrování výstupu na tiskárnu. Pokud se však v Elvisu nastaví volba :set cleantext=, používá se režim podobný původnímu „open mode“.

1.2 Příkazy pro práci s okny

Původní editor vi neumožňoval v jednu chvíli zobrazit na obrazovce více bufferů, uživatelé se proto museli spokojit s příkazy jako :next, :bnext, :rewind,:brewind apod. Jak Vim, tak i Elvis však možnost zobrazení více oken obsahují a tvůrci těchto editorů dokonce zvolili podobné klávesové zkratky pro ovládání jednotlivých oken (okna představují pohled do editovaných bufferů). Všechny klávesové zkratky začínají stiskem kombinace kláves Ctrl+W, ale je samozřejmě možné provést přemapování.

V normálním režimu je u obou editorů možné použít následující základní zkratky, které práci s okny umožňují:
Ctrl+W n – vytvoření nového okna (stejné jako příkaz :new)

Ctrl+W s – rozdělení aktivního okna (stejné jako příkaz :split)
Ctrl+W q – uzavření aktivního okna (stejné jako příkaz :quit)
Ctrl+W w – přeskok na další okno v řadě
Ctrl+W = – nastavení stejné výšky všech zobrazených oken

Ctrl+W - – zmenšení výšky aktivního okna
Ctrl+W + – zvětšení výšky aktivního okna

Vim podporuje i práci s vertikálně rozdělenou obrazovkou. Základním příkazem je Ctrl+W v, který vertikálně rozdělí stávající okno. Dále je možné použít příkazy Ctrl+W < a Ctrl+W> pro změnu šířky okna a příkaz Ctrl+W | pro nastavení stejné šířky vedle sebe ležících oken.

1.3 Vizuální bloky

Prakticky všechny editovací příkazy se ve vi provádějí zadáním počtu opakování, stisknutím klávesy se zkratkou příkazu a stisknutím jedné nebo více kláves, kterými se specifikuje pohyb kurzoru. Editovací příkaz se posléze provede pouze na část textu, která je obsažena mezi starou a novou pozicí kurzoru. Tento způsob práce s textem je velmi rychlý a elegantní, ale pouze v případě, že je text vhodným způsobem strukturovaný, což je například zaručeno u zápisu programů.

Při práci s běžným (odstavcovým) textem, který nemá pevně danou strukturu, se však tento způsob stává těžkopádný, protože se pohyb kurzoru musí provádět umístěním značek (marks) na vhodné místo a posléze skokem na tyto značky (práce se značkami se dále komplikuje na české klávesnici). Z tohoto důvodu zavádí jak Vim, tak i Elvis takzvané vizuální bloky, kterými lze nejprve vyznačit část textu a posléze na tuto část aplikovat nějaký editovací příkaz.

Vizuální bloky se začínají v obou editorech vybírat po zadání jednoho z následujících příkazů (editor se musí nacházet v normálním režimu):
v – vizuální blok vybíraný po jednotlivých znacích
V – vizuální blok vybíraný po celých řádcích
Ctrl+V – sloupcový vizuální blok

Vyznačování je možné provádět pomocí všech příkazů pro posun kurzoru, například j, w, ]] apod. Posléze lze na celý blok aplikovat nějaký editační příkaz, typicky y (yank), c (change) ad (delete).

1.4 Textové objekty

Jak Vim, tak i Elvis nově zavádí pojem textových objektů. Jedná se o specifikaci části textu bez nutnosti jeho výběru. Příkladem textových objektů dostupných v obou editorech je například jedno slovo (aw), věta (as) či celý odstavec (ap).

Elvis však obsahuje některé textové objekty navíc, například možnost specifikace celé řádky (al nebo bez ukončovacího znaku il). Tyto nové textové objekty lze s výhodou využít u příkazů :set hllayers a :set hlobject.

2. Rozdíly mezi Elvisem a Vimem

V předchozí kapitole jsme si popsali vlastnosti, které jsou (až na malé odlišnosti) oběma popisovaným textovým editorům společné. Tyto editory se však od sebe odlišují v celé řadě věcí, z nichž některé budou popsány v následujících odstavcích.

2.1 Odlišné zpracování chyb při překladu

Při zavolání externího překladače či programu pro řízení překladu (typicky se jedná o známý make) mohou editory zpracovat výstup z překladače a najít v něm hlášení o chybách s označením čísla chyby a řádku, na kterém se chyba vyskytuje.

Vzhledem k tomu, že každý překladač vypisuje chyby jiným způsobem, je nutné, aby byl editor dostatečně flexibilní ve specifikaci formátů chyb pro další zpracování. Ve Vimu je možné použít příkaz :set errorformat a v něm formát hlášení chyb blíže specifikovat pomocí řetězce podobného argumentu funkce scanf(). Elvis tuto možnost neobsahuje, proto je nutné chyby zpracovat přes vhodně naprogramovaný skript.

2.2 Rozdílné chování voleb textwidth a wrapmargin

O volbách :set textwidth a :set wrapmargin jsem se zmiňoval i v předchozí části tohoto seriálu. Zde pouze připomenu, že obě volby se používají pro nastavení pravého okraje textu. Pokud by vkládaný text překročil zadanou hodnotu, je provedeno odřádkování (vložení znaku pro konec řádky) a další vkládání se již provádí na následujícím řádku v souboru.

Volba :set textwidth slouží k nastavení pravého okraje textu přímo, tj. ke specifikací sloupce, na němž dochází k zalamování. Naproti tomu volba :set wrapmargin slouží k nastavení pravého okraje relativně k pravému okraji okna. Je-li například nastaven okraj na hodnotu 10, bude se zalamování textu provádět v desátém sloupci, ale počítaném od pravého okraje. Pokud jsou současně zadány obě hodnoty, tj. jaktextwidth, tak i wrapmargin, bere se do úvahy hodnota textwidth.

Oba editory se však odlišují v tom, jak chápou zadané hodnoty při změně velikosti okna. Zatímco ve Vimu je proveden přepočet délky řádku tak, aby stále platil vztah délka_řádku+wrap­margin=columns, v Elvisu se naopak změní hodnota wrapmargin a dříve nastavená délka řádku zůstane zachována. Z toho logicky vyplývá, že se v tomto případě chová korektněji Vim.

2.3 Volba inputtab

Pomocí volby inputtab je možné zvolit, jaká akce se provede při stiskutí klávesy Tab ve vkládacím režimu. Je k dispozici více možností, buď se do textu vloží znak Tab, nebo několik mezer, nebo se provede složitější akce, například doplnění názvu souboru apod. Tato volba tedy částečně nahrazuje příkazovou zkratku Ctrl+X dostupnou zVimu.

3. Na co si dát při práci s Elvisem pozor?

Zdánlivá velká podobnost Vimu a Elvise může svádět k podcenění některých jejich rozdílů, což může zapříčinit ztrátu editovaného textu a/nebo neefektivní používání některých příkazů. Proto se pokusím upozornit na některé vlastnosti editoru Elvis, které mohou při přechodu z Vimu působit problémy.

3.1 Registry

Pro úschovu částí textů je možné v obou editorech používat pojmenované registry, některá jména registrů však mohou mít odlišný význam. Základní sadu registrů zdědily oba editory po svém předku vi, proto mají shodný význam:
1–9 – odkazy na posledních deset textů, které byly podrobeny smazání nebo změně
0 – poslední text, který byl vybrán operací yank (není v původním vi)
a-z – pojmenované registry, které mohou být vybrány a naplněny uživatelem

Některé registry se však chovají v obou editorech odlišně, zejména:
* – obsah schránky (clipboardu) ve Vimu
^ – obsah schránky (clipboardu) v Elvisu
_ – black-hole registr ve Vimu
_ – obsah právě editovaného řádku v Elvisu

Problémy s jinak pojmenovanými registry nastávají typicky při zpracování maker, zejména záměna registrů _ může způsobit ve zpracovávaném textu menší katastrofu.

3.2 Skripty a zabudované funkce

Možnosti skriptování, které je zavedeno v obou editorech, jsou značně rozdílné. Není se čemu divit, protože skriptovací jazyk v původním vi neexistoval, takže tvůrci měli při návrhu svého jazyka celkem volnou ruku. Oba editory obsahují imperativní jazyk, který je svou syntaxí podobný Basicu či JavaScriptu – obsahuje smyčky, přiřazovací příkazy, prakticky úplnou sadu matematických a řetězcových operátorů, možnost definice funkcí apod.

3.3 Příkaz map

Ve Vimu existuje několik variant příkazu :map, například :vmap (pro vizuální režim), :imap (pro režim vkládání) apod. V Elvisu je použit pouze modifikátor původního příkazu :map, například :map select, :map input atd. V Elvisu je však možné pomocí příkazu :alias nadeklarovat i rozšířené příkazy:map. To je možné provést například následujícím skriptem:

alias nmap      map command
alias nm        map command
alias vmap      map select
alias vm        map select
alias omap      map motion
alias om        map motion
alias imap      map input
alias im        map input
alias cmap      map history
alias cm        map history

Výše uvedený skript je samozřejmě možné rozšířit i pro příkaz :unmap a všechny jeho varianty.

4. Přizpůsobení Elvise

V dnešní době je více než kdy jindy módní takzvaný „tuning“. My se zde však nebudeme zabývat lepením plastikových křidélek a jiné veteše na autovraky ani přestavbou počítače na topení pro rybičky v akváriu, ale ukážeme si některé možnosti, kterými lze upravit chování textového editoru Elvis. Veškerá zde ukázaná nastavení je možné uložit do souboru elvis.rc, který může být umístěn buď v adresáři s podpůrnými soubory editoru, nebo je možné provést jeho kopii do uživatelského adresáře. Tento soubor se v mnohém podobá souboru .vimrc, který se používá pro nastavení Vimu.

4.1 Formátování odstavců

Pomocí příkazu:

:map gqap =ap

je možné v Elvisu simu­lovat příkaz pro přeformátování celého odstavce, který musí být od ostatního textu oddělen alespoň jedním prázdným řádkem. Po zadání tohoto příkazu do startovacího skriptu se budou oba editory k uživatelsky vynucenému formátování odstavců chovat prakticky stejně. Jediný rozdíl spočívá v tom, že Vim používá interní formátovací rutinu, zatímco Elvis volá externí program „fmt“.

4.2 Rozšířené příkazy příkazového režimu

Některé příkazy, které jsou dostupné z textového editoru Vim, je vhodné přidat i do Elvise. Příkladem je příkaz pro skok na první řádek v textu, který lze doplnit následujícím mapováním:

:map gg 1G

Ostatní příkazy, které nejsou v Elvisu dostup­né, lze vytvořit podobným způsobem. Jedná se například o inkrementaci a dekrementaci hodnot pomocí klávesových zkratek Ctrl+A a Ctrl+X a podobné rozšířené příkazy.

4.3 Chování editoru

Chování obou editorů lze nastavit pomocí příkazu :set, za který se uvede nějaký parametr a popř. i jeho hodnota. Při nastavování se nejprve zbavíme otravného a rušivého pípání, které editor vydává při každé (i sebemenší) chy­bě:

:set noerrorbells
:set nowarningbells

Dále je vhodné nastavit dvojice znaků, které jsou považovány za párové závorky, mezi nimiž je možné přeskakovat pomocí příkazu %. To se v Elvisu provede následujícím příkazem:

:set matchchar="{}()[]<>"

Ve Vimu se podobné chování nastaví volbou :set matchpairs. Pro různé formy textu je samozřejmě možné nastavit různé párové závorky.

Dále je v Elvisu vhodné nastavit, kdy a jak se má mazat text. Pokud je mazání textu zakázáno (například při úpravách uvnitř jedné řádky), provede se místo smazání pouze přepis, celý text se korektně zobrazí až při ukončení příkazu či po opuštění vkládacího režimu. Osobně dávám přednost režimu, kdy se text na obrazovce maže ihned po stisku klávesy BackSpace nebo při provedení nějakého „mazacího“ příkazu – delete, changeapod.

Volba způsobu mazání se provádí příkazem :set cleantext=, za kterým může následovat jedna či hned několik hodnot:

  • ex – mazání se provádí i při zápisu příkazů na příkazové řádce
  • short – mazání se provádí u příkazů, které provádějí změnu na jednom řádku textu
  • long – mazání se provádí u příkazů, které provádějí změnu více textových řádků
  • bs – ve vkládacím režimu se text maže ihned po stisknutí klávesy BackSpace

Dále je možné pomocí voleb :set hllayers a :set hlobject nastavit obarvení textu, který se nachází v blízkosti kurzoru. Jedná se o velmi příjemnou věc, která mi ve Vimu prozatím chybí. Vzhledem k tomu, že Elvis jako jeden textový objekt rozlišuje i aktuální editovanou řádku, je možné provést zvýraznění celé řádky tak, jak to známe z jiných programátorských editorů (například Dos Navigator Editoru, Ultra Editu, jEditu a dalších). Nic nám však nebrání zvýrazňovat například tři slova v okolí kurzoru apod. Vtipné je také zvýraznění aktuálně editovaného bloku (například programový blok mezi znaky { a } v Céčku).

4.4 Barvy a zvýrazňování syntaxe

Kódy barev pro jednotlivé textové kategorie, které Elvis používá, jsou uloženy v souboru elvis.clr. Tam se nacházejí příkazy jako:

:color normal white

Formát tohoto souboru je velmi jednoduchý, případné změny lze provádět buď globálně pro všechny uživatele, nebo individuálně pro každého uživatele zvlášť. Definice syntaxe (či spíše pouze lexikálních kategorií) pro jednotlivé programovací a značkovací jazyky je uložena v souboru elvis.syn. Formát tohoto souboru je samozřejmě poněkud složitější než při pouhé specifikaci barev, ale k dispozici je poměrně velké množství již hotových definicí pro různé jazyky, z nichž je možné při zadávání dalšího jazyka vycházet.

4.5 Nastavení tiskárny

Elvisu je možné poměrně precizně nastavovat i způsob tisku na tiskárnu. Jedná se o velmi rozsáhlou problematiku, která by vystačila na samostatný článek, proto zde pouze uvedu příklad pro nastavení tisku v rastru osmdesáti sloupců po šedesáti řádcích:

root_podpora

:set! lptype=ps2 lplines=60 lpcolumns=80 lpwrap

5. Závěr

V tomto článku jsem se snažil ukázat, jakým způsobem je možné, alespoň v nutných případech, přejít ze skvělého editoru Vim na podobně koncipovaný, i když poněkud méně flexibilní editor Elvis. Oba editory samozřejmě mají své klady a zápory, v mnohém se také odlišují, ale jako základ je u nich použito prastaré vi, což je jistě značka kvality :-)

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.