Date: 2022-12-10 20:00:00
From: rpt@desudoli.cz
Subject: Viklouni a vikloně
To: dalnopis@desudoli.cz
Tags: software
Desc: Cesta kolem světa modálních editorů.

Viklouni a vikloně

Již jsem se zmiňoval, že preferuju editor vi(1) a jeho klony. Podíváme se a porovnáme několik bližších a vzdálených příbuzných tohoto tzv. modálního editoru. Pokusím se pojmenovat, v čem se liší, co jsou jejich typické znaky.

Pradědeček Vi

Původní vi(1), které napsal Bill Joy, vlastně moc neznám. Jako uživatel BSD používám jeden z jeho prvních klonů zvaný nvi(1), který napsal Keith Bostic a který BSD používají namísto standardního vi(1) od verze 4.4BSD. Nvi(1) přidává celou řadu vylepšení, ale protože také jde o velmi vousatý program, poslouží nám jako pradědeček. Komu se to nezdá spravedlivé, může původní vi(1) považovat za prapředka nebo prapradědečka.

Součástí vi(1) je editor ex(1), což je upgrade původního editoru ed(1), o kterém jsem psal. Vi(1) je stránkový editor, ex(1) je řádkový editor. Zdánlivě jde o výsledek evolučního vývoje, postupný upgrade ex(1) ve vi(1), kde se ex(1) stal „nadbytečnou“ DNA, legacy částí, bez které se lze obejít. Do jisté míry to tak je, ale při hlubším pohledu zjistíme, že oba jsou vlastně různá rozhraní téhož programu. Pracují stejnými principy jako původní editor ed(1): jsou modální a pracovní jednotkou editace je řádek. Vzhled tak trochu klame, ale nvi(1) je stále řádkový editor.

Leckdo by to nazval omezení, ale jde o filozofii nebo základní myšlenku editoru. Řádka je množina znaků ukončená znakem nového řádku. Na to je třeba myslet, když člověk volí, kde bude dělat konce řádku. Pokud hodlá číst textový soubor přímo, délka řádku do 80 znaků je z hlediska čitelnosti nejlepší. Editor umožňuje automatický wrapping nebo je možné vytvářet úhledné odstavce pomocí externích programů jako fmt(1) nebo par(1). Má-li textový soubor fungovat jako zdrojový kód a ke čtení slouží zkompilovaný výsledek, osvědčilo se mi psát systémem

1 věta = 1 řádka.

Takto po interpunkci následuje znak nové řádky a nedochází k žádným zmatkům při kompilaci nebo interpretaci textového souboru.

Nvi(1) je velmi rychlý a protože je součástí základního systému, někdo by ho mohl považovat za primitivní editor. Není tomu tak. Ve skutečnosti je velmi sofistikovaný a umí spoustu věcí. Jen je poměrně těžké vyjmenovat jeho přednosti při porovnávání s jeho potomky, editory, které se vyprofilovaly právě tím, že přidávají další vlastnosti k tomu, co nvi(1) umí, nebo ignorují, co jejich autoři považují za legacy. Neomezeně dlouhé řádky, text přes celou obrazovku, Extended Regular Expressions nebo filename completion patří k přidaným fičurám nvi(1) proti prapradědečkovi, tedy původnímu vi(1). Umí rozdělit obrazovku na okna, má nekonečné undo, umí přičítat/odečítat čísla, vyhledávat slovo pod kurzorem či autoindent. Konfigurační soubor ~/.nexrc umožňuje šikovná makra, např. mapování kláves na vkládání textu nebo abreviace. Za zmínku stojí, že příkazová řádka je vlastně buffer a okno zároveň s tím rozdílem, že každá řádka v normálním módu slouží jako příkaz, který se spouští klávesou Enter. Takto lze snadno a přehledně procházet historii příkazů, editovat je jako normální text a vytvářet tak jednořádkové programy.

Skutečné kouzlo totiž představují adresy, vylepšené dědictví po ed(1) a editovací příkazy, které vlastně tvoří editovací jazyk. S jejich pomocí a s pomocí příkazu global a substitute lze provádět pokročilou magii. Adresa může být jednoduchá či dvojitá, dvojitá definuje rozsah určený k editaci. To vše znamená, že je možné psát editovacím jazykem poměrně složité skripty, které „zmáknou“ i sofistikovanou editaci textu. I dnes se dá nvi(1) používat k práci programátora, byť pro spartánské povahy, jako je tento chlapík.

Používat nvi(1) znamená maximálně se spolehnout na svůj intelekt a minimálně na vizuální zpětnou vazbu. Jinými slovy chce to programátorský přístup, neboť pokročilá editace je psaní zvláštního programu na řešení konkrétního editovacího požadavku. Na zasvěcení do tajů nvi(1) doporučuju tohoto průvodce. Mnoha moderním programátorům také budou patrně chybět dvě věci: visual mode a syntax highlighting. Je tedy pouze pro elitu, která nepotřebuje okamžitou vizuální konfirmaci svých záměrů s textem. Jak za chvíli uvidíme, vývoj se totiž ubírá právě tímto směrem.

Dědeček Vim a tatínek Neovim

Toto je klasika a klasa a vrchol a zřídlo. Michael W. Lucas v žertu(?) označil Vim za megalomanský kus softwaru. Luke Smith říká, že je to spíš životní styl než editor. Je to prostě pan editor!

První verzi Vim napsal Bram Moolenaar už pro počítač Amiga v roce 1991. Neovim čili nvim(1) je vim(1), ale napsaný na zelené louce (údajně) lepším a přehlednějším zdrojovým kódem. To nedovedu tak docela posoudit, ale dlouhodobě jsem používal vim(1) i nvim(1) a nezaznamenal jsem rozdíl. Snad je to tím, že moje editovací potřeby jsou relativně skromné. Nadále budu mluvit o vim(1), ale mám tím na mysli i nvim(1), neboť mu z oka vypadl.

Vim(1) umí všechno kromě mytí nádobí a vaření snídaně. Umí rozdělit okno a používat záložky čili taby. Samozřejmě umí nepřebernými způsoby editovat text. Mimo normální a insert mód zná ještě několik dalších módů, včetně módů vizuálních. To je dle mého soudu první revoluční změna. Posun od programovacího či skriptovacího způsobu práce s editorem k interaktivnímu a vizuálnímu. Je možné označit určitou část textu, slova, celou řádku nebo blok a provést s ním nějaké úpravy, přičemž člověk má okamžitou vizuální zpětnou vazbu svého počínání. Uživatelé různých Notepadů, Leafpadů, Geditů a dalších editorů insertového typu prakticky ani jiný způsob neznají.

Jeden by řekl, že je toho trochu moc a to jsem se zatím nezmínil o možnosti psát pluginy ve vimscriptu nebo ve skriptovacím jazyce lua. To je druhá revoluční změna. Možnost programovat pluginy umožnila vzniku celého ekosystému rozšíření editoru pro různorodé účely a funkce. Programátor má najednou k dispozici nejen obecný editor, ale vlastní IDE přizpůsobené jazyku, ve kterém píše. I neprogramátoři si přijdou na své, např. Vimwiki je systém poznámek nebo wiki textů konvertibilních do HTML. Předloni jsem psal o hierarchických záznamnících Vimoutliner a Vim-outlaw. Jsou to právě pluginy, které staví Vim na úroveň Emacsu a jemu podobných.

Ještě bych rád zmínil digraph, šikovnou vimovskou utilitku, která umožňuje vkládat znaky Unicode.

Vim není žádný střízlík, ale startuje stejně svižně jako jeho menší příbuzní, alespoň na přiměřeně moderních strojích. Prý není tak rychlý při práci s opravdu dlouhými texty, jako jsou databáze apod, ale s tím nemám zkušenosti. Je velmi těžké učinit za dost všem možnostem, které tento editor má, v několika odstavcích. Vim(1) je editor, který znám nejlépe a po němž sáhnu, když si nevím rady v jiných klonech vi(1).

Synátor Vis

Unix má svého nástupce, Plan9, který také sídlil na jednom z mých počítačů a doufám, že se někdy dostanu k tomu ho lépe prozkoumat. Jsou tací, kdo tvrdí, že svět by byl lepším místem pro výpočetní techniku a naší interakci s ní, kdyby Plan9 nahradil aktuálně používané operační systémy. Nicméně to odbočuju.

Defaultním editorem Plan9 je [Acme], editor podporující extenzivní práci s myší. Jeho předchůdcem je sam(1), který kombinuje práci s myší a příkazový jazyk velmi podobný editoru ed(1), ale v určitém směru jednodušší či logičtější. Vis(1) se snaží zkombinovat modální filozofii a možnosti editace vi(1) s příkazovým jazykem a strukturálními regulérními výrazy převzatými z editoru sam(1).

Právě tady dochází ke třetí revoluční změně. Editory sam(1), acme(1) a vis(1) používají tento strukturální regex, jehož hlavním znakem je opuštění konceptu řádky. Takže když např. vyhledáváme nějaký výraz, editor nevrátí řádku, kde se výraz nachází jako ve vi(1), nýbrž přímo další výskyt tohoto výrazu. Tato zdánlivě malá změna výrazně mění logiku práce příkazového jazyka a řeší potíže, se kterými se potýkají další programy unixovského ekosystému, pracující s řádkou jako základní pracovní jednotkou, např. grep(1), sed(1) a další. Příkaz x/regex/ d najde všechny výskyty slova „regex“ a smaže je. Příkaz x/regex/ c/mazec najde všechny výskyty slova „regex“ a nahradí je za „mazec“. To jsou pouze dva jednoduché příklady syntaxe v příkazovém jazyce vis(1). Více o strukturálním regexu se lze dočíst v odkazech níže, taktéž manuálová stránka editoru vis(1).

A pak je tu Čtvrtá revoluční změna, která spočívá v používání více kurzorů najednou. Tento koncept v jistém smyslu zná i vim(1) a jiné editory, jako např. Sublime. Ve vis(1) a hlavně v Kakoune (viz dále) je tato funkce plně rozvinutá a umožňuje skutečně téměř libovolně editovat text na několika místech. Skvěle se hodí, když člověk ručně přepisuje takovou věc jako gophermap. Multikurzor je další funkce ve směru interaktivity a vizuálního feedbacku.

Jinak vis(1) víceméně věrně kopíruje funkcionalitu vim(1) pouze s drobnými změnami. Usiluje o jednoduchost a minimalismus, takže nepodporuje taby pokročilý management oken ani jiné libůstky vim(1). To všechno jsou podle autora věci, o které se má starat window manager, terminálový multiplexer a jiné programy. Možnost napojení na unixovské „rourové“ workflow je samozřejmost. Je modulární i ve smyslu celkového designu: digraph nebo management souborů provádějí samostatné programy, které nicméně jsou součástí instalace. Abych nezapomněl, také obsahuje API pro Lua, takže je možné psát pluginy v Lua a konfigurační soubor je také v Lua. Podporuje syntax highlighting.

Mám radost, že se jeho tvůrce, Marc André Tanner ke svému projektu zase vrátil a po dlouhé době vyšla nová verze. Byl dlouho mým oblíbeným editorem a skoro všechny mé texty jsou psané v něm. Je trochu ostuda, že není v repozitářích FreeBSD. Port pro OpenBSD existuje, pouze se spouští pod názvem vise(1), aby nekolidoval s jiným programem, který také nese jméno vis.

Název „Vis“, a to je jedna z mých několika málo výhrad vůči tomuto editoru, je nešťastně zvolený a dokonce probíhala diskuze, zda by se neměl změnit. Jak bylo řečeno výše, koliduje s názvem jednoho ze standardních unixovských programů na zobrazení neviditelných znaků. Tady autor hodně pochybil a tohle se vůbec nemělo stát. Zadruhé, název částečně koliduje s Visual Studio, takže při hledání na internetu vyběhne spousta odkazů právě na VS nebo nějaký editor videa, což není úplně šťastné. Už nějakou dobu si po instalaci vytvářím symlink „svi“, který kopíruje logiku nvi(1), s ničím nekoliduje a je kratší.

Bratranec Kakoune

Tento text píšu v Kakoune čili kak(1). Jde o editor s retardovaným názvem, ale vyjímečnými schopnostmi, který rozšiřuje funkce vim(1) vis(1) v načrtnutém (r)evolučním směru.

Kak(1) volí opět poněkud jednodušší model než rozbujelý a všehoschopný vim(1). Nejsou zde záložky, ani dělení oken ze stejných důvodů jako výše u vis(1). Má také jen dva módy: normální a vkládání. Není zde žádný separátní vizuální mód pro označování textu.

Pátá revoluční novinka, kterou kak(1) přináší, je vylepšená verze editačního jazyka. Původní model vi(1) funguje tak, že říká nejprve příkaz „smaž“, tedy činnost, a pak „co“, tedy předmět. Kak(1) jednoduše toto pořadí příkazů obrací . Nejdřív „vyber předmět“ a teprve potom „činnost“. Příkaz xd smaže řádek, „x“ označí řádek, „d“ ho smaže.

Zjevná výhoda spočívá v tom, že uživatel má větší kontrolu nad tím, co předurčuje k mazání či jiné změně. Ale jedině díky tomu, že předmět (požadovaná část textu) je označen vizuálně, podobně jako u editorů, jež fungují čistě v insert módu. Uživatel si tedy může ověřit, jaké části textu změna ovlivní předtím, než změnu skutečně provede. Vyhne se chybám, kdy příkaz provede víc nebo méně, než je záměrem. Je to takové malé přiznání, že toto je nepopiratelná přednost notepadovských, čistě insertových editorů.

Selekce a pohyb po dokumentu je v kak(1) totéž. To znamená, že pohyb pomocí příkazů zároveň provádí selekci. Svým způsobem tak modální editor přejímá něco z čistě insertového editoru. Tato vlastnost je skvělá, neboť to často znamená méně úhozů, naneštěstí ne vždycky. Nicméně Kakoune má být údajně úspornější než Vim, počítáno na úhozy. Možné to je, nezaznamenal jsem velký rozdíl, pokud vůbec nějaký.

Speciální formou selekce je multiselekce, která umožňuje editaci pomocí multikurzoru. Multikurzor je mocný nástroj ruční editace na mnoha místech textu najednou se všemi dostupnými příkazy k dispozici. Dle mé zkušenosti funguje rychleji než ve vis(1). Nutno také poznamenat, že pohybové příkazy sice vycházejí z tradice vi(1), ale připadají mi logičtější. Bohužel, vimovská prstová paměť u mě zatím převažuje.

Ale určitě má kak(1) oproti vim(1) větší interaktivní možnosti. Už výše uvedený vizuální feedback je interaktivní. Jsou zde i dalšími vylepšení, automatická kontextová nápověda a interaktivní nabídka. Automatická kontextová nápověda se objevuje, když člověk napíše příkaz. Je to známý clippy ze starších produktů Microsoft. Interaktivní nabídka se objevuje, když chceme zadat příkaz, tedy když napíšeme dvojtečku. Nemusíme příkaz psát, můžeme ho vybrat z nabíkdy. Začneme-li psát, funkce fuzzy search postupně zužuje nabídku, takže v jisté chvíli může být úspornější příkaz vybírat z nabídky než ho dopsat do konce. Interaktivní nabídka se také objevuje, když píšu text, a v nabídce jsou již použitá slova. Opět zde funguje fuzzy search, tedy inkrementální vyhledávání. To mě zpočátku trochu rušilo, ale zvykl jsem si a občas dokonce využívám.

Samozřejmě nechybí syntax highlighting, pluginy, systém server-klient a propojení s unixovskými nástroji a filozofií.

S Kakoune jsme opsali půlkruh směrem k většímu vizuálnímu feedbacku a interaktivitě a přitom jsme zůstali v modálním paradigmatu a zachovali editační jazyk. Je to, řekl bych, méně spartánský a uživatelsky pohodlnější přístup.

Tak který?

Dalo by se říci, že máme k dispozici dva krajní přístupy: patricijský, elitní (Nvi) vs plebejský, masový (Kakoune). Další možné dělení je na konzistentví, věrný vlastní filozofii (Vis a Kakoune), a eklektický, slepenec čistě prakticky orientovaných příkazů (Vim). Nebo něco mezi tím vším. Chad samozřejmě sáhne po tom elitním a patricijském!

Nevědomý člověk by řekl, že je to jenom editor, nástroj k psaní textu. Jenže si neuvědomuje, že psaní je závažná věc, takřka posvátný úkon. Tomu musí odpovídat i nástroj k jeho vytváření. Jsi-li stoik, asketa, bonviván či dandy, vyber si nástroj dle svého gusta. Nebo používej různé podle okolností. Zlatý poměr mezi tím znát od každého něco a zároveň alespoň něco do hloubky.

EOF