vim2elvis (1)

16. 2. 2005
Doba čtení: 10 minut

Sdílet

Tento článek je určen především pro uživatele textového editoru Vim, kteří jsou nebo budou, podobně jako já, různými okolnostmi donuceni používat textový editor Elvis. Popisuji zde jak společné vlastnosti obou výše zmíněných editorů, tak i některé významné rozdíly, které by mohly přechod mezi nimi zkomplikovat. Osobně sice pro svoji práci preferuji Vim, někdy se však použití Elvise nevyhnu, proto se snažím si práci s ním co nejvíce zpříjemnit.

Obsah

1. Kdy a proč použít textový editor Elvis
    1.1 Disketové distribuce Linuxu

    1.2 Bootovací CD se Slaxem nebo jinou live distribucí Linuxu
    1.3 Havárie systému
    1.4 Systémy s omezenými zdroji
2. Přednosti textového editoru Elvis oproti Vimu
    2.1 Různé režimy zobrazení textů

    2.2 Možnosti tisku
    2.3 Zvýraznění textu u kurzoru
    2.4 Rozšířené možnosti práce s tabulátory
    2.5 Další drobnosti
3. Nedostatky Elvise

    3.1 Formátování odstavcového textu
    3.2 Kompatibilita s vi
    3.3 Zvýraznění syntaxe
    3.4 Méně závažné nedostatky
4. Obsah dalšího pokračování

1. Kdy a proč použít textový editor Elvis

Čtenář tohoto článku, zejména doposud spokojený uživatel skvělého Vimu, si může položit otázku, proč by měl někdy používat textový editor Elvis. Důvodů je více, některé z nich se pokusím naznačit v následujících odstavcích.

1.1 Disketové distribuce Linuxu

Elvis je přítomen na mnoha disketových instalacích Linuxu jako základní textový editor, tj. jako náhrada původního editoru vi, který nemůže být z licenčních důvodů na instalačních sadách Linuxu použit (originální vi však najdete například na Solarisu nebo na některých počítačích od SGI). Důvody, které vedou k použití Elvise na disketových instalacích, spočívají v jeho menší velikosti (i Vim je však možné poměrně úspěšně zmenšit za cenu ztráty některých vlastností) a nezávislosti na dalších knihovnách. I staticky slinkovaná verze Elvise totiž zabere pouze cca 200 kB (alespoň na platformě i86). Menší velikost binárního souboru se projevuje i ve velikosti obrazu spuštěného editoru v operační paměti.

Někdo sice disketové miniinstalace Linuxu nepovažuje za plnohodnotné systémy, pro jednoduchý router či tiskový server se však mnohdy jedná o ideální, funkční a přitom nekomplikovanou záležitost.

1.2 Bootovací CD se Slaxem nebo jinou live distribucí Linuxu

Také různé „live distribuce“ Linuxu, například u nás poměrně rozšířený Slax, který je možné uložit na osmicentimetrové CD nebo na Flash disk, obsahují místo Vimu pouze textový editor Elvis. Jsou zde samozřejmě přítomny i další textové editory, například Joe či MCedit, ty však spadají do zcela jiné kategorie, která nesnese porovnání s opravdovými textovými editory :-). SeSlaxem přicházím v poslední době velmi často do styku (je na něm ostatně postaveno i Root CD z předchozího roku, což byl také jeden z důvodů mého prvního důkladnějšího prozkoumání Elvise.

1.3 Havárie systému

„Velké distribuce“ Linuxu samozřejmě již na instalačních médiích obsahují jak textový editor Elvis, tak i Vim, ale v adresáři/bin je většinou, opět kvůli velikosti, přítomen pouze spustitelný soubor editoru Elvis, zde pojmenovaný jako vi (někdy existuje i symbolický link s názvem view, který otevře editor v read-only režimu). V případě nějaké havárie systému, při kterém nedojde k připojení ostatních diskových svazků, jsme odkázání pouze na utility uložené právě v adresáři /bin, takže i z tohoto důvodu je vhodné se s Elvisem alespoň zevrubně seznámit (nebo si přeložit miniverzi Vimu a tou původní editor nahradit).

1.4 Systémy s omezenými zdroji

Na starších strojích se Vim chová poněkud těžkopádně, zejména při povolení zvýrazňování syntaxe a zapnutém foldingu. Například na počítačích s procesorem 486 je zvýraznění syntaxe ve Vimu kvůli celkovému zpomalení editace takřka nepoužitelné, Elvis se v tomto směru jeví rychlejší, i když možnosti zvýrazňování jsou zde omezenější.

Samozřejmě, že takto staré počítače se většinou nepoužívají jako pracovní stanice, ale v mnoha firmách je možné narazit na specializované aplikace, pro které jsou tyto počítače svým výkonem vyhovující. Do této kategorie patří například jednoduchý router, záznamová zařízení, MTA, news server, počítač pro záznam logů (přes sériovou linku, aby nešel vzdáleně napadnout) apod.

2. Přednosti textového editoru Elvis oproti Vimu

Obecně sice platí, že textový editor Vim je mnohem výkonnější a současně i flexibilnější než jeho „konkurent“ Elvis, avšak existují některé oblasti, ve kterých Elvis nabízí více možností a funkcí. Některé z těchto předností si v této kapitole popíšeme. Předností je samozřejmě mnohem více, vybíral jsem pouze ty, které jsou z mého pohledu nejpodstatnější a/nebo se jedná o dobrý nápad, jež není v současné verzi Vimu uplatněn.

2.1 Různé režimy zobrazení textů

V originálním textovém editoru vi a stejně tak i ve Vimu je možné text zobrazit pouze jako posloupnost znaků, která odpovídá posloupnosti bytů uložených v souboru na disku či jiném paměťovém zařízení. Jediné změny nastávají při zalamování řádků a při zobrazování některých řídicích znaků, typicky Tab, CR, LF apod.

Vim umožňuje při zobrazení a editaci textů načtených ze souborů do některého bufferu provádět uživatelsky nastavené překódování znaků a způsob zobrazení bílých znaků, tím však jeho možnosti končí. Naproti tomu Elvis podporuje několik režimů zobrazení textů – tyto režimy je možné měnit pomocí příkazu :display. Režimy zobrazení ve své podstatě pracují jako obousměrné filtry, které převádějí interní podobu textu na text zobrazený uživateli a naopak – editace prováděná uživatelem se aplikuje na interní podobu textu v bufferu.

Mezi podporované režimy zobrazení patří například režim HTML, při kterém je editovaný soubor interpretován jako dokument napsaný v jazyce HTML. V tomto režimu může Elvis do určité míry nahradit WWW prohlížeč, samozřejmě to platí pouze pro jednodušší stránky bez složitého formátování a stylů (celá nápověda k tomuto editoru je psána přímo v jednoduchém HTML, takže ji lze bez problému zobrazit). Režimu HTML se podobá i režim TeXu, který je však do značné míry omezen repertoárem rozpoznávaných klíčových slov.

Dalším podporovaným režimem je režim náhledu manuálových stránek, kdy se Elvis chová podobně jako příkaz man s tím rozdílem, že je možné manuálové stránky i editovat. Ne všechny příkazy značkovacího jazyka troff (ve kterém jsou stránky psány) jsou podporovány, repertoár značek je však pro běžnou práci dostačující. Zejména na systémech Microsoft Windows (kde oba editory samozřejmě pracují) je to cenná vlastnost, protože na tomto systému se žádný prohlížeč manuálových stránek nenachází.

Zvláštní postavení zaujímá režim hexadecimálního náhledu na editovaný soubor, při kterém se Elvis chová jako běžný hexadecimální editor. Tento režim mi osobně ve Vimu chybí nejvíce, protože náhražka ve formě filtru xxd je značně nedokonalá. Zatímco předchozí režimy zobrazení používám spíše pasivně pro prohlížení, režim hexadecimálního náhledu je při práci s binárními soubory velmi užitečný.

2.2 Možnosti tisku

Elvis podporuje více typů tiskáren, tisk tedy nemusí vždy probíhat přes LPR. To je výhodné zejména na systémech, kde nejsou tiskárny nebo jejich fronty korektně nainstalovány. Jedná se například o live distribuce Linuxu (Knoppix, Danix, Slax apod.). Tisk je také možné uskutečnit do souboru, tento soubor se pak může přenést na jiný systém s nainstalovanou tiskárnou a teprve na tomto systému provedete vlastní tisk.

2.3 Zvýraznění textu u kurzoru

Pomocí dvou příkazů :set hlobject a :set hllayers je možné nastavit způsob zvýraznění textu, který se nachází v okolí kurzoru. Při pohybu kurzoru se dynamicky mění i zvýrazněná oblast. S výhodou je možné použít například zvýraznění řádku s kurzorem – tento režim se často používá při práci s rozsáhlejšími tabulkami. Další možností je zvýraznění aktuálně editovaného programového bloku.

Zvýraznění textu v okolí kurzoru je specifikováno pomocí textových objektů, což je například ap-paragraph, al-line, w-word apod. Možnosti úprav jsou tedy značné.

2.4 Rozšířené možnosti práce s tabulátory

Tabulátory v textu či programovém kódu působí obecně značné těžkosti, zejména v případě, že tvůrce textu používal jinou vzdálenost tabulačních značek než uživatel, který má text editovat. Na druhou stranu tabulátory některé věci značně zjednodušují, například zápis strukturovaného programu nebo různých údajů do tabulek. Při použití tabulátorů však platí více než kde jinde důležitost dodržování „štábní kultury“, zejména není vhodné míchat odsazení pomocí mezer a tabulátorů (příkaz :retab zVimu může některé nedostatky napravit).

Ve Vimu je možné pro každý buffer nastavit pomocí příkazu :set tabstop=? vzdálenost tabulačních značek. Tato vzdálenost je však vždy stejná (například sloupec 1, 8, 15…), což je výhodné pro zápis programového kódu, ale může to přinášet obtíže při vytváření tabulek (kratší položky se například musí oddělovat dvěma značkami TAB, což znemožňuje pozdější strojové zpracování).

Z tohoto důvodu obsahuje Elvis podobnou volbu jako všechny moderní textové procesory – není zadána pouze vzdálenost tabulačních značek, ale seznam obecně libovolných vzdáleností sloupců, na kterých se tabulační zarážky nachází. V praxi to vypadá tak, že v příkazu :set tabstop je možné zadat seznam čísel oddělených čárkami. Pokud je zadáno pouze jedno číslo, předpokládá se, že tabulační zarážky jsou rozmístěny rovnoměrně. Tímto způsobem je zajištěna kompatibilita s textovými editory Vi a Vim.

Nastavení tabulačních zarážek je možné provést i pro příkazy horizontálního posunu již zapsaného textu. V tomto případě se nastavení provede příkazem :set shiftwidth, který očekává stejný formát dat jako příkaz :set tabstop.

2.5 Další drobnosti

Elvis poskytuje svým uživatelům mnoho dalších výborných funkcí, z nichž však uvedu pouze ty z mého pohledu nejzajímavější:

  1. Regulární výrazy (resp. „magické sekvence“) lze psát ve stylu podobném Perlu, což jistě mnozí ocení.
  2. Oproti Vimu má Elvis rozšířený příkaz show.
  3. Makra se nemusí psát pouze pomocí příkazu :map, lze použít mnohem flexibilnější :a­lias
  4. Pomocí operátoru = lze provést vyčíslení výrazu, avšak pouze při výběru bloku pomocí příkazu v. V opačném případě se jedná o formátovací příkaz, podobně jako ve vi či Vimu, takže kompatibilita je zachována.
  5. Přes soubor elvis.msg je možné provést překlad všech hlášení bez nutnosti zásahu do zdrojového kódu.

3. Nedostatky Elvise

Oproti Vimu vykazuje Elvis i mnoho nedostatků. Opět vypíšu pouze ty nedostatky, které považuji z hlediska mé práce za nejzávažnější.

3.1 Formátování odstavcového textu

Původní editor vi byl určen především pro psaní konfiguračních souborů a programů. Tyto typy souborů se vyznačují poměrně krátkými řádky a nutností explicitního ukončení každého řádku. Z tohoto důvodu nejsou v původním vi obsaženy příkazy pro formátování odstavcového textu, tj. textu, který se má při psaní a opravách dynamicky zalamovat do odstavců. Vi tedy není příliš použitelný pro psaní delších odstavců (HTML stránek, TeXových či LaTeXových zdrojových kódů apod.)

Textový editor Vim je však již určen i pro psaní běžného odstavcového textu, proto obsahuje několik možností, jak s tímto textem pracovat:

  1. Pomocí příkazu :set wrap je možné nastavit zalamování textu na obrazovce (nikoli v souboru). Tento režim je použitelný například pro prohlížení zdrojových souborů, kdy některý text přesahuje šířku okna editoru.
  2. Předchozí režim lze upravit tak, že se pomocí příkazu :set linebreak nastaví optické zalamování na konci slov, nikoli na posledním sloupci okna. Tuto volbu považuji pro odstavcový text za ideální, editor se pak chová prakticky stejně jako textové procesory.
  3. Pokud je nutné zalomit text i v souboru (tj. v uloženém textu), je nutné použít příkaz :set textwidth případně :set wrapmargin (podle preferencí uživatele). Toto nastavení však pracuje pouze při psaní nového textu, po složitějších úpravách se musí „ručně“ přerovnat celý odstavec, například příkazem gqap.
  4. Ve Vimu verze 6.2 (resp. i po aplikaci některých patchů do verze 6.1) je možné použít automatické formátování odstavců stejně jako v textových procesorech. Osobně tuto volbu nepoužívám, protože odstavce musí být odděleny prázdným řádkem (ostatní konce řádků se ignorují), jinak může dojít k nechtěnému přeformátování například hlaviček HTML stránek či tabulek v LaTeXu.

Formátování odstavců však v Elvisovi chybí, a musí tedy být provedeno externím programem, což není zdaleka tak flexibilní (nelze například použít makra či přesnou specifikaci textových objektů). Jediná možnost, která v Elvisovi zůstala zachována, je režim vizuálního zalamování. Ten se však chová podivně, protože při nastavení :set wrapmargin se pouze podle aktuální velikosti okna změní hodnota textwidth – při změně velikosti okna k žádné další změně nedochází.

3.2 Kompatibilita s vi

Autor Vimu se až úzkostlivě snaží dodržet zpětnou kompatibilitu s původním textovým editorem vi. Pokud se provede příkaz :set compatible, změní se provádění všech příkazů tak, aby se Vim choval stejně jako vi (s několika málo celkem bezvýznamnými odlišnostmi). V Elvisu sice také režim kompatibility existuje, není však dotažen do takových detailů jako u Vimu.

Osobně ovšem režim kompatibilní s vi příliš často nepoužívám (omezuje některé rozšiřující příkazy), zapínám ho pouze při provádění některých maker dostupných z comp.editors, které jsou pro původní vi určeny a které s Elvisem většinou nepracují korektně.

3.3 Zvýraznění syntaxe

Textový editor Vim obsahuje velmi obecné a pokročilé metody pro zvýrazňování syntaxe, které překonávají metody použité u jiných editorů (zkuste například v C-čkovém zdrojovém kódu použít #if 0 a #endif). Elvis sice také podporuje zvýrazňování syntaxe, avšak na nižší úrovni. Týká se to jak vlastních definičních souborů, tak i možností nastavení barev (či jiného zvýraznění) jednotlivých syntaktických kategorií.

Také množství již hotových definic syntaxe pro různé typy souborů je ve Vimu mnohem větší nežli v Elvisovi, což je IMHO dáno různou rozšířeností a oblíbeností obou editorů.

3.4 Méně závažné nedostatky

V tomto odstavci stručně popíšu některé méně závažné nedostatky Elvise oproti Vimu:

ict ve školství 24

  1. Není možné nastavit vlastnosti myši, zejména funkce jednotlivých tlačítek ovlivněných modifikátory
  2. Nefunguje režim LISPu (používám pro Scheme a Guile)
  3. Nelze dostatečně nastavovat vlastnosti kurzoru – ve Vimu si jednotlivé módy činnosti odlišuji barvou a tvarem kurzoru, je to výhodnější než zobrazení režimu na pravítku
  4. Neexistuje verze editoru pro takové množství systémů, jako je tomu u Vimu

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

V dalším pokračování tohoto miniseriálu popíšu některé postupy, kterými lze chování Elvise a Vimu přiblížit. Ideální (a nedosažitelný) je samozřejmě případ, kdy se oba editory chovají z uživatelského hlediska stejně.

Jaký je váš oblíbený editor?

Autor článku

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