Date: 2022-12-10 20:00:00 Tags: software Desc: Cesta kolem sveta modalnich editoru. # Viklouni a viklone Jiz jsem se zminoval, ze preferuju editor vi(1) a jeho klony. Podivame se a porovname nekolik blizsich a vzdalenych pribuznych tohoto tzv. modalniho editoru. Pokusim se pojmenovat, v cem se lisi, co jsou jejich typicke znaky. ## Pradedecek Vi Puvodni vi(1), ktere napsal Bill Joy, vlastne moc neznam. Jako uzivatel BSD pouzivam jeden z jeho prvnich klonu zvany nvi(1), ktery napsal Keith Bostic a ktery BSD pouzivaji namisto standardniho vi(1) od verze 4.4BSD. Nvi(1) pridava celou radu vylepseni, ale protoze take jde o velmi vousaty program, poslouzi nam jako _pradedecek_. Komu se to nezda spravedlive, muze puvodni vi(1) povazovat za prapredka nebo prapradedecka. Soucasti vi(1) je editor ex(1), coz je upgrade puvodniho editoru ed(1), o kterem jsem psal. Vi(1) je strankovy editor, ex(1) je radkovy editor. Zdanlive jde o vysledek evolucniho vyvoje, postupny upgrade ex(1) ve vi(1), kde se ex(1) stal "nadbytecnou" DNA, _legacy_ casti, bez ktere se lze obejit. Do jiste miry to tak je, ale pri hlubsim pohledu zjistime, ze oba jsou vlastne ruzna rozhrani tehoz programu. Pracuji stejnymi principy jako puvodni editor ed(1): jsou modalni a pracovni jednotkou editace je radek. Vzhled tak trochu klame, ale nvi(1) je stale radkovy editor. Leckdo by to nazval omezeni, ale jde o filozofii nebo zakladni myslenku editoru. Radka je mnozina znaku ukoncena znakem noveho radku. Na to je treba myslet, kdyz clovek voli, kde bude delat konce radku. Pokud hodla cist textovy soubor primo, delka radku do 80 znaku je z hlediska citelnosti nejlepsi. Editor umoznuje automaticky wrapping nebo je mozne vytvaret uhledne odstavce pomoci externich programu jako fmt(1) nebo par(1). Ma-li textovy soubor fungovat jako zdrojovy kod a ke cteni slouzi zkompilovany vysledek, osvedcilo se mi psat systemem > 1 veta = 1 radka. Takto po interpunkci nasleduje znak nove radky a nedochazi k zadnym zmatkum pri kompilaci nebo interpretaci textoveho souboru. Nvi(1) je velmi rychly a protoze je soucasti zakladniho systemu, nekdo by ho mohl povazovat za primitivni editor. Neni tomu tak. Ve skutecnosti je velmi sofistikovany a umi spoustu veci. Jen je pomerne tezke vyjmenovat jeho prednosti pri porovnavani s jeho potomky, editory, ktere se vyprofilovaly prave tim, ze pridavaji dalsi vlastnosti k tomu, co nvi(1) umi, nebo ignoruji, co jejich autori povazuji za legacy. Neomezene dlouhe radky, text pres celou obrazovku, _Extended Regular Expressions_ nebo _filename completion_ patri k pridanym ficuram nvi(1) proti prapradedeckovi, tedy puvodnimu vi(1). Umi rozdelit obrazovku na okna, ma nekonecne _undo_, umi pricitat/odecitat cisla, vyhledavat slovo pod kurzorem ci autoindent. Konfiguracni soubor `~/.nexrc` umoznuje sikovna makra, napr. mapovani klaves na vkladani textu nebo abreviace. Za zminku stoji, ze prikazova radka je vlastne buffer a okno zaroven s tim rozdilem, ze kazda radka v normalnim modu slouzi jako prikaz, ktery se spousti klavesou _Enter_. Takto lze snadno a prehledne prochazet historii prikazu, editovat je jako normalni text a vytvaret tak jednoradkove programy. Skutecne kouzlo totiz predstavuji adresy, vylepsene dedictvi po ed(1) a editovaci prikazy, ktere vlastne tvori _editovaci jazyk_. S jejich pomoci a s pomoci prikazu `global` a `substitute` lze provadet pokrocilou magii. Adresa muze byt jednoducha ci dvojita, dvojita definuje rozsah urceny k editaci. To vse znamena, ze je mozne psat editovacim jazykem pomerne slozite skripty, ktere "zmaknou" i sofistikovanou editaci textu. I dnes se da nvi(1) pouzivat k praci programatora, byt pro spartanske povahy, jako je tento chlapik. Pouzivat nvi(1) znamena maximalne se spolehnout na svuj intelekt a minimalne na vizualni zpetnou vazbu. Jinymi slovy chce to programatorsky pristup, nebot pokrocila editace je psani zvlastniho programu na reseni konkretniho editovaciho pozadavku. Na zasveceni do taju nvi(1) doporucuju tohoto pruvodce. Mnoha modernim programatorum take budou patrne chybet dve veci: _visual mode_ a _syntax highlighting_. Je tedy pouze pro elitu, ktera nepotrebuje okamzitou vizualni konfirmaci svych zameru s textem. Jak za chvili uvidime, vyvoj se totiz ubira prave timto smerem. ## Dedecek Vim a tatinek Neovim Toto je klasika a klasa a vrchol a zridlo. Michael W. Lucas v zertu(?) oznacil Vim za megalomansky kus softwaru. Luke Smith rika, ze je to spis zivotni styl nez editor. Je to proste pan editor! Prvni verzi Vim napsal Bram Moolenaar uz pro pocitac Amiga v roce 1991. Neovim cili nvim(1) je vim(1), ale napsany na zelene louce (udajne) lepsim a prehlednejsim zdrojovym kodem. To nedovedu tak docela posoudit, ale dlouhodobe jsem pouzival vim(1) i nvim(1) a nezaznamenal jsem rozdil. Snad je to tim, ze moje editovaci potreby jsou relativne skromne. Nadale budu mluvit o vim(1), ale mam tim na mysli i nvim(1), nebot mu z oka vypadl. Vim(1) umi vsechno krome myti nadobi a vareni snidane. Umi rozdelit okno a pouzivat zalozky cili taby. Samozrejme umi neprebernymi zpusoby editovat text. Mimo normalni a insert mod zna jeste nekolik dalsich modu, vcetne modu vizualnich. To je dle meho soudu _prvni_ revolucni zmena. Posun od programovaciho ci skriptovaciho zpusobu prace s editorem k interaktivnimu a vizualnimu. Je mozne oznacit urcitou cast textu, slova, celou radku nebo blok a provest s nim nejake upravy, pricemz clovek ma okamzitou vizualni zpetnou vazbu sveho pocinani. Uzivatele ruznych Notepadu, Leafpadu, Geditu a dalsich editoru insertoveho typu prakticky ani jiny zpusob neznaji. Jeden by rekl, ze je toho trochu moc a to jsem se zatim nezminil o moznosti psat pluginy ve vimscriptu nebo ve skriptovacim jazyce lua. To je _druha_ revolucni zmena. Moznost programovat pluginy umoznila vzniku celeho ekosystemu rozsireni editoru pro ruznorode ucely a funkce. Programator ma najednou k dispozici nejen obecny editor, ale vlastni IDE prizpusobene jazyku, ve kterem pise. I neprogramatori si prijdou na sve, napr. Vimwiki je system poznamek nebo wiki textu konvertibilnich do HTML. Predloni jsem psal o hierarchickych zaznamnicich Vimoutliner a Vim-outlaw. Jsou to prave pluginy, ktere stavi Vim na uroven Emacsu a jemu podobnych. Jeste bych rad zminil _digraph_, sikovnou vimovskou utilitku, ktera umoznuje vkladat znaky Unicode. Vim neni zadny strizlik, ale startuje stejne svizne jako jeho mensi pribuzni, alespon na primerene modernich strojich. Pry neni tak rychly pri praci s opravdu dlouhymi texty, jako jsou databaze apod, ale s tim nemam zkusenosti. Je velmi tezke ucinit za dost vsem moznostem, ktere tento editor ma, v nekolika odstavcich. Vim(1) je editor, ktery znam nejlepe a po nemz sahnu, kdyz si nevim rady v jinych klonech vi(1). ## Synator Vis Unix ma sveho nastupce, Plan9, ktery take sidlil na jednom z mych pocitacu a doufam, ze se nekdy dostanu k tomu ho lepe prozkoumat. Jsou taci, kdo tvrdi, ze svet by byl lepsim mistem pro vypocetni techniku a nasi interakci s ni, kdyby Plan9 nahradil aktualne pouzivane operacni systemy. Nicmene to odbocuju. Defaultnim editorem Plan9 je [Acme], editor podporujici extenzivni praci s mysi. Jeho predchudcem je sam(1), ktery kombinuje praci s mysi a prikazovy jazyk velmi podobny editoru ed(1), ale v urcitem smeru jednodussi ci logictejsi. Vis(1) se snazi zkombinovat modalni filozofii a moznosti editace vi(1) s prikazovym jazykem a strukturalnimi regulernimi vyrazy prevzatymi z editoru sam(1). Prave tady dochazi ke _treti_ revolucni zmene. Editory sam(1), acme(1) a vis(1) pouzivaji tento strukturalni regex, jehoz hlavnim znakem je opusteni konceptu radky. Takze kdyz napr. vyhledavame nejaky vyraz, editor nevrati radku, kde se vyraz nachazi jako ve vi(1), nybrz primo dalsi vyskyt tohoto vyrazu. Tato zdanlive mala zmena vyrazne meni logiku prace prikazoveho jazyka a resi potize, se kterymi se potykaji dalsi programy unixovskeho ekosystemu, pracujici s radkou jako zakladni pracovni jednotkou, napr. grep(1), sed(1) a dalsi. Prikaz `x/regex/ d` najde vsechny vyskyty slova "regex" a smaze je. Prikaz `x/regex/ c/mazec` najde vsechny vyskyty slova "regex" a nahradi je za "mazec". To jsou pouze dva jednoduche priklady syntaxe v prikazovem jazyce vis(1). Vice o strukturalnim regexu se lze docist v odkazech nize, taktez manualova stranka editoru vis(1). A pak je tu _Ctvrta_ revolucni zmena, ktera spociva v pouzivani vice kurzoru najednou. Tento koncept v jistem smyslu zna i vim(1) a jine editory, jako napr. Sublime. Ve vis(1) a hlavne v Kakoune (viz dale) je tato funkce plne rozvinuta a umoznuje skutecne temer libovolne editovat text na nekolika mistech. Skvele se hodi, kdyz clovek rucne prepisuje takovou vec jako gophermap. Multikurzor je dalsi funkce ve smeru interaktivity a vizualniho feedbacku. Jinak vis(1) vicemene verne kopiruje funkcionalitu vim(1) pouze s drobnymi zmenami. Usiluje o jednoduchost a minimalismus, takze nepodporuje taby pokrocily management oken ani jine libustky vim(1). To vsechno jsou podle autora veci, o ktere se ma starat window manager, terminalovy multiplexer a jine programy. Moznost napojeni na unixovske "rourove" workflow je samozrejmost. Je modularni i ve smyslu celkoveho designu: digraph nebo management souboru provadeji samostatne programy, ktere nicmene jsou soucasti instalace. Abych nezapomnel, take obsahuje API pro Lua, takze je mozne psat pluginy v Lua a konfiguracni soubor je take v Lua. Podporuje syntax highlighting. Mam radost, ze se jeho tvurce, Marc Andre Tanner ke svemu projektu zase vratil a po dlouhe dobe vysla nova verze. Byl dlouho mym oblibenym editorem a skoro vsechny me texty jsou psane v nem. Je trochu ostuda, ze neni v repozitarich FreeBSD. Port pro OpenBSD existuje, pouze se spousti pod nazvem vise(1), aby nekolidoval s jinym programem, ktery take nese jmeno vis. Nazev "Vis", a to je jedna z mych nekolika malo vyhrad vuci tomuto editoru, je nestastne zvoleny a dokonce probihala diskuze, zda by se nemel zmenit. Jak bylo receno vyse, koliduje s nazvem jednoho ze standardnich unixovskych programu na zobrazeni neviditelnych znaku. Tady autor hodne pochybil a tohle se vubec nemelo stat. Zadruhe, nazev castecne koliduje s Visual Studio, takze pri hledani na internetu vybehne spousta odkazu prave na VS nebo nejaky editor videa, coz neni uplne stastne. Uz nejakou dobu si po instalaci vytvarim symlink "svi", ktery kopiruje logiku nvi(1), s nicim nekoliduje a je kratsi. ## Bratranec Kakoune Tento text pisu v Kakoune cili kak(1). Jde o editor s retardovanym nazvem, ale vyjimecnymi schopnostmi, ktery rozsiruje funkce vim(1) vis(1) v nacrtnutem (r)evolucnim smeru. Kak(1) voli opet ponekud jednodussi model nez rozbujely a vsehoschopny vim(1). Nejsou zde zalozky, ani deleni oken ze stejnych duvodu jako vyse u vis(1). Ma take jen dva mody: normalni a vkladani. Neni zde zadny separatni vizualni mod pro oznacovani textu. _Pata_ revolucni novinka, kterou kak(1) prinasi, je vylepsena verze editacniho jazyka. Puvodni model vi(1) funguje tak, ze rika nejprve prikaz "smaz", tedy cinnost, a pak "co", tedy predmet. Kak(1) jednoduse toto poradi prikazu obraci . Nejdriv "vyber predmet" a teprve potom "cinnost". Prikaz `xd` smaze radek, "x" oznaci radek, "d" ho smaze. Zjevna vyhoda spociva v tom, ze uzivatel ma vetsi kontrolu nad tim, co predurcuje k mazani ci jine zmene. Ale jedine diky tomu, ze predmet (pozadovana cast textu) je oznacen vizualne, podobne jako u editoru, jez funguji ciste v insert modu. Uzivatel si tedy muze overit, jake casti textu zmena ovlivni predtim, nez zmenu skutecne provede. Vyhne se chybam, kdy prikaz provede vic nebo mene, nez je zamerem. Je to takove male priznani, ze toto je nepopiratelna prednost notepadovskych, ciste insertovych editoru. Selekce a pohyb po dokumentu je v kak(1) totez. To znamena, ze pohyb pomoci prikazu zaroven provadi selekci. Svym zpusobem tak modalni editor prejima neco z ciste insertoveho editoru. Tato vlastnost je skvela, nebot to casto znamena mene uhozu, nanestesti ne vzdycky. Nicmene Kakoune ma byt udajne uspornejsi nez Vim, pocitano na uhozy. Mozne to je, nezaznamenal jsem velky rozdil, pokud vubec nejaky. Specialni formou selekce je multiselekce, ktera umoznuje editaci pomoci multikurzoru. Multikurzor je mocny nastroj rucni editace na mnoha mistech textu najednou se vsemi dostupnymi prikazy k dispozici. Dle me zkusenosti funguje rychleji nez ve vis(1). Nutno take poznamenat, ze pohybove prikazy sice vychazeji z tradice vi(1), ale pripadaji mi logictejsi. Bohuzel, vimovska prstova pamet u me zatim prevazuje. Ale urcite ma kak(1) oproti vim(1) vetsi interaktivni moznosti. Uz vyse uvedeny vizualni feedback je interaktivni. Jsou zde i dalsimi vylepseni, automaticka kontextova napoveda a interaktivni nabidka. Automaticka kontextova napoveda se objevuje, kdyz clovek napise prikaz. Je to znamy _clippy_ ze starsich produktu Microsoft. Interaktivni nabidka se objevuje, kdyz chceme zadat prikaz, tedy kdyz napiseme dvojtecku. Nemusime prikaz psat, muzeme ho vybrat z nabikdy. Zacneme-li psat, funkce _fuzzy search_ postupne zuzuje nabidku, takze v jiste chvili muze byt uspornejsi prikaz vybirat z nabidky nez ho dopsat do konce. Interaktivni nabidka se take objevuje, kdyz pisu text, a v nabidce jsou jiz pouzita slova. Opet zde funguje fuzzy search, tedy inkrementalni vyhledavani. To me zpocatku trochu rusilo, ale zvykl jsem si a obcas dokonce vyuzivam. Samozrejme nechybi syntax highlighting, pluginy, system server-klient a propojeni s unixovskymi nastroji a filozofii. S Kakoune jsme opsali pulkruh smerem k vetsimu vizualnimu feedbacku a interaktivite a pritom jsme zustali v modalnim paradigmatu a zachovali editacni jazyk. Je to, rekl bych, mene spartansky a uzivatelsky pohodlnejsi pristup. ## Tak ktery? Dalo by se rici, ze mame k dispozici dva krajni pristupy: patricijsky, elitni (Nvi) vs plebejsky, masovy (Kakoune). Dalsi mozne deleni je na konzistentvi, verny vlastni filozofii (Vis a Kakoune), a eklekticky, slepenec ciste prakticky orientovanych prikazu (Vim). Nebo neco mezi tim vsim. _Chad_ samozrejme sahne po tom elitnim a patricijskem! Nevedomy clovek by rekl, ze je to jenom editor, nastroj k psani textu. Jenze si neuvedomuje, ze psani je zavazna vec, takrka posvatny ukon. Tomu musi odpovidat i nastroj k jeho vytvareni. Jsi-li stoik, asketa, bonvivan ci dandy, vyber si nastroj dle sveho gusta. Nebo pouzivej ruzne podle okolnosti. Zlaty pomer mezi tim znat od kazdeho neco a zaroven alespon neco do hloubky. => https://sites.google.com/a/bostic.com/keithbostic/vi/ [vi(1)] => svanda-s-edou.html [Svanda s Edou] => https://hugodaniel.com/posts/vi-is-not-vim/ [Vi is not Vim] => https://www.ele.uri.edu/faculty/vetter/Other-stuff/vi/009-index.html [Vi Learn] => https://www.vim.org/ [Vim] => https://neovim.io/ [Neovim] => https://vimwiki.github.io/ [Vimwiki] => pripad-markdown.html [Pripad markdown] => https://github.com/vimoutliner/vimoutliner [Vimoutliner] => https://github.com/lifepillar/vim-outlaw [Vim-outlaw] => https://9front.org/ [Plan9] => http://acme.cat-v.org/ [Acme editor] => http://sam.cat-v.org/ [sam (1)] => https://github.com/martanne/vis [vis(1)] => http://doc.cat-v.org/bell_labs/structural_regexps/se.pdf [Structural expressions] => http://martanne.github.io/vis/man/vis.1.html [Manual vis(1)] => https://kakoune.org/ [Kakoune]