Hlavní navigace

Helix: nový modální textový editor inspirovaný Vimem a Kakoune

12. 4. 2022
Doba čtení: 24 minut

Sdílet

 Autor: Pavel Tišnovský
Dnes se setkáme s dalším programátorským textovým editorem nazvaným Helix, jehož způsob ovládání je do značné míry inspirován textovým editorem Vim, popř. editorem Kakoune, s nímž jsme se již na stránkách Roota setkali.

Obsah

1. Helix – nový modální textový editor inspirovaný Vimem a Kakoune

2. Instalace editoru Helix

3. Struktura adresáře s Helixem

4. Spuštění textového editoru, první krůčky začínajícího uživatele

5. Režimy textového editoru Helix

6. Kontextová menu

7. Příkazy dostupné v normálním režimu

8. Režim výběru textu (selection)

9. Manipulace s výběrem

10. Vícenásobné změny ve vybraném textu

11. Přechod z normálního režimu do vkládacího režimu (insert)

12. Manipulace s okny

13. Vícenásobný kurzor

14. Pomůcky při manipulaci se zdrojovými kódy

15. Podpora Language Server Protokolu (LSP)

16. Základní informace o projektu LSP

17. LSP a textový editor Helix

18. Barvová témata

19. Závěrečné subjektivní zhodnocení

20. Odkazy na Internetu

1. Helix – nový modální textový editor inspirovaný Vimem a Kakoune

Dnes se setkáme s dalším programátorským textovým editorem, jehož způsob ovládání je do značné míry inspirován textovým editorem Vim popř. (do snad ještě větší míry) editorem Kakoune, s nímž jsme se již na stránkách Roota setkali. Helix patří mezi modální editory a navíc dokáže pracovat s větším množstvím dokumentů zobrazených v jednotlivých oknech (v rámci plochy terminálu), podporuje použití vícenásobných kurzorů (a tím pádem i editaci textu na více místech), samozřejmě podporuje zarovnání zdrojových kódů i zvýraznění syntaxe a v neposlední míře je podporován i Language Server Protokol, jenž umožňuje realizovat například automatické doplňování kódu, refaktoring atd. Z technologického hlediska je zajímavé, že například zvýraznění syntaxe není řešeno přes Vim skripty, ale nativním kódem (konfigurace je napsána ve Scheme), což je .

Obrázek 1: Textový editor Helix po spuštění. V levém dolním rohu je zobrazen právě používaný režim, zde konkrétně režim Normal.

Poznámka: modální ovládání použité v současnosti vyvíjených editorech Kakoune a Helix (z nichž druhý se označuje jako postmoderní editor, ať již to znamená cokoli) ve skutečnosti není žádná novinka, protože bylo použito již v původním editoru Vi i z něho odvozeném slavném editoru Vim, s nímž jsme se již na stránkách Rootu mnohokrát setkali, mj. i v samostatném seriálu. I díky modálnímu ovládání jsou úpravy textu v Helix velmi rychlé a efektivní (a to například i na klávesnicích se špatně umístěnými kurzorovými šipkami, což je případ mnoha typů notebooků), ovšem efektivní a rychlé editace se pochopitelně dosáhne až poté, co se uživatel naučí alespoň základní sadu příkazů nabízených tímto editorem.

Obrázek 2: Způsob zobrazení kontextových menu v editoru Helix.

Již v úvodní části dnešního článku je však nutné zdůraznit, že ani Helix ani Kakoune nejsou (i přes použité modální ovládání a mnohdy podobné klávesové zkratky) „pouhým“ dalším klony textového editoru Vi či Vim (zkratka „Vim“ původně znamenala „Vi iMitation“, dnes již pochopitelně „Vi iMproved“). Ve skutečnosti se jedná o zcela nové aplikace (jak na úrovni zdrojového kódu, tak i vnitřních datových struktur a rozdělení ovládání), které přebírají dobré myšlenky modálního editoru a současně používají i některé klávesové zkratky Vimu popř. Vimovské příkazy. Ovšem zdaleka ne všechny zkratky a příkazy fungují v Helixu stejně jako ve Vimu, což znamená, že přechod není ani zdaleka tak přímočarý jako (poněkud paradoxně) například přechod na Spacemacs.

Příkladem může být typický příkaz dw, který ve Vi i Vimu znamená „smaž slovo“, resp. přesněji „smaž text od pozice kurzoru do začátku následujícího slova“. V editoru Helix tento příkaz nebude fungovat, protože v tomto editoru nejsou podporovány operátory (delete) spojené s přesunem kurzoru (word). Ovšem namísto toho bude fungovat příkaz wd s odlišným významem „vyber slovo a to následně smaž“. Základní rozdíl tedy spočívá v odlišné filozofii práce s textem: text, s nímž se má nějaká operace provést, se nejdříve vybere (a je vizuálně zvýrazněn) a teprve poté se s ním provede zvolená operace (což umí i Vim, i když v poněkud omezenější míře).

Obrázek 3: U (téměř) každého příkazu z kontextového menu se zobrazí i krátká nápověda.

2. Instalace editoru Helix

Helix je naprogramován v Rustu, což mj. znamená, že je přeložen do jediného spustitelného souboru, který lze na dané kombinaci architektura+operační systém většinou bez problémů spustit (nezávisí na uživatelských knihovnách). Číslování verzí je poněkud neobvyklé (postmoderní?), takže poslední verze již nese číslo 22. Tarball této verze jak se spustitelným Helixem, tak i s podpůrnými soubory (gramatika, barvová schémata atd.) lze získat následovně:

$ wget https://github.com/helix-editor/helix/releases/download/22.03/helix-22.03-x86_64-linux.tar.xz
 
--2022-03-31 14:40:19--  https://github.com/helix-editor/helix/releases/download/22.03/helix-22.03-x86_64-linux.tar.xz
Resolving github.com (github.com)... 140.82.121.4
Connecting to github.com (github.com)|140.82.121.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/268424739/d49facff-2a7c-410d-9b22-02ab13c649b7?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220331T124019Z&X-Amz-Expires=300&X-Amz-Signature=303e43b54e56c0145d5e88aae148f791164f9303126374ec69b5dca98b77c72e&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=268424739&response-content-disposition=attachment%3B%20filename%3Dhelix-22.03-x86_64-linux.tar.xz&response-content-type=application%2Foctet-stream [following]
--2022-03-31 14:40:19--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/268424739/d49facff-2a7c-410d-9b22-02ab13c649b7?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220331%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220331T124019Z&X-Amz-Expires=300&X-Amz-Signature=303e43b54e56c0145d5e88aae148f791164f9303126374ec69b5dca98b77c72e&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=268424739&response-content-disposition=attachment%3B%20filename%3Dhelix-22.03-x86_64-linux.tar.xz&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7540728 (7.2M) [application/octet-stream]
Saving to: ‘helix-22.03-x86_64-linux.tar.xz’
 
helix-22.03-x86_64- 100%[===================>]   7.19M  --.-KB/s    in 0.1s
 
2022-03-31 14:40:20 (55.3 MB/s) - ‘helix-22.03-x86_64-linux.tar.xz’ saved [7540728/7540728]
 
tar xvfx helix-22.03-x86_64-linux.tar.xz

Po rozbalení získáme mj. i soubor hx,který by měl být spustitelný:

$ ./hx -V
 
helix 22.03 (d4e45fd4)

Samozřejmě je však možné provést překlad přímo ze zdrojových kódů projektu Helix. Vyžadována je instalace Rustu i Carga (balíčkovacího systému Rustovského ekosystému):

$ git clone https://github.com/helix-editor/helix
$ cd helix
$ cargo install --path helix-term

3. Struktura adresáře s Helixem

Pro zajímavost se nyní podívejme na strukturu adresáře s Helixem po rozbalení tarballu zmíněného v předchozí kapitole:

.
├── hx
├── LICENSE
├── README.md
├── runtime
│   ├── grammars
│   │   ├── bash.so
│   │   ├── cmake.so
│   │   ├── typescript.so
            ...
            ...
            ...
│   │   ├── vue.so
│   │   ├── wgsl.so
│   │   ├── yaml.so
│   │   └── zig.so
│   ├── queries
│   │   ├── bash
│   │   │   ├── highlights.scm
│   │   │   └── injections.scm
│   │   ├── c
│   │   │   ├── highlights.scm
│   │   │   ├── indents.toml
│   │   │   ├── injections.scm
│   │   │   └── textobjects.scm
│   │   ├── cmake
│   │   │   ├── highlights.scm
│   │   │   ├── indents.toml
│   │   │   ├── injections.scm
│   │   │   └── textobjects.scm
            ...
            ...
            ...
│   │   ├── wgsl
│   │   │   ├── highlights.scm
│   │   │   └── injections.scm
│   │   ├── yaml
│   │   │   ├── highlights.scm
│   │   │   ├── indents.toml
│   │   │   └── injections.scm
│   │   └── zig
│   │       ├── highlights.scm
│   │       ├── indents.toml
│   │       └── injections.scm
│   ├── themes
│   │   ├── base16_default_dark.toml
│   │   ├── base16_default_light.toml
│   │   ├── base16_terminal.toml
            ...
            ...
            ...
│   │   ├── solarized_dark.toml
│   │   ├── solarized_light.toml
│   │   └── spacebones_light.toml
│   └── tutor.txt
└── tree
 
67 directories, 281 files

Kromě spustitelného souboru hx a třech textových dokumentů LICENSE, README.md a tutor.txt obsahuje adresář s editorem tyto podadresáře:

  1. runtime/grammars obsahuje nativní knihovny(!) s gramatikami podporovaných značkovacích a programovacích jazyků
  2. runtime/queries obsahuje konfiguraci pro jednotlivé jazyky zapsanou ve Scheme
  3. runtime/themes obsahuje definici barvových schémat

Největší diskový prostor zabírají nativní knihovny s gramatikami (naproti tomu ve Vimu adresář s gramatikami zabírá 5 MB pro přibližně 600 jazyků):

$ du -h -d 1 .
 
328K    ./themes
64M     ./grammars
2,5M    ./queries
67M     .

Obrázek 4: Tutoriál dodávaný společně s Helixem v souboru tutor.txt.

4. Spuštění textového editoru, první krůčky začínajícího uživatele

Textový editor Helix se v tom nejjednodušším případě spouští příkazem hx, tedy následujícím způsobem:

$ hx

Po spuštění se editor nachází v takzvaném normálním režimu (normal mode), který má naprosto stejný význam jako v textovém editoru Vim. V normálním režimu se typicky pracuje s textovým kurzorem (jeho přesun v rámci editovaného textu), volají se základní editační operace a taktéž se přechází do dalších režimů s využitím k tomu určených klávesových zkratek (výběrový režim, vkládací režim atd.). Aktuálně vybraný režim je zobrazen v levém dolním rohu – jedná se o text „NOR“ (za ním je název editovaného bufferu).

Pochopitelně je možné textovému editoru předat i jméno souboru, který se následně načte a zobrazí v okně editoru:

$ hx cesta_k_souboru

V případě hledání chyb, ke kterým může během činnosti Helixu dojít (například se neinicializuje LSP server atd.), lze editor spustit s přepínačem -v, jenž povoluje výpis podrobnějších informací do logovacího souboru:

$ hx -v

Vytvořený soubor s logovacími zprávami Helixu je umístěn v adresáři „~/.cache/helix“ a jeho obsah může vypadat následovně:

$ cat ~/.cache/helix/helix.log
 
2022-03-31T17:27:26.544 helix_view::theme [WARN] Theme: malformed hexcode: fg
2022-03-31T17:27:26.544 helix_view::theme [WARN] Theme: malformed hexcode: form
2022-03-31T17:27:54.877 helix_view::editor [ERROR] Failed to initialize the LSP for `source.python` { cannot find binary path }
2022-03-31T17:29:01.754 helix_view::editor [ERROR] Failed to initialize the LSP for `source.python` { cannot find binary path }
2022-03-31T17:29:44.520 helix_view::editor [ERROR] Failed to initialize the LSP for `source.go` { cannot find binary path }
2022-04-08T15:17:39.791 helix_view::editor [ERROR] Failed to initialize the LSP for `source.toml` { LSP not defined }
Poznámka: konfigurace Helixu se ukládá do adresáře „~/.config/helix“.

Obrázek 5: Změna barvového schématu editoru Helix.

5. Režimy textového editoru Helix

Jak jsme si již řekli v úvodní kapitole, patří Helix mezi takzvané modální textové editory, tj. jedná se o aplikaci, která se v daný okamžik nachází vždy v jednom uživatelem zvoleném režimu (módu). Výchozím režimem je takzvaný normální režim (normal mode, zkráceně indikováno jako NOR), ve kterém editor očekává příkazy pro pohyb kurzoru v textu, pro výběr určité části textu (selection, což je zvláštní vedlejší režim), další editační operace a popř. i příkazy, které provedou přepnutí režimu. V následující tabulce jsou jednotlivé režimy vypsány. Povšimněte si, že se seznam režimů v některých ohledech odlišuje od editoru Vi/Vim, ovšem dva základní režimy (normal a insert) jsou zachovány a navíc command mode do značné míry odpovídá Vimovskému command mode spojeného s podrežimy pro vyhledávání a pro manipulaci s okny:

Název režimu Stručný popis
normal výchozí režim, v němž lze přesouvat kurzor v rámci bufferu, provádět základní editaci a přecházet do dalších režimů
insert režim zápisu (většinou vkládání) textu do aktivního bufferu
command odpovídá kombinaci Vimovského příkazového a vyhledávacího režimu (příkazy začínají dvojtečkou, vyhledávání typicky lomítkem)
select (extend) režim výběru takzvaných textových objektů
goto přesuny v rámci bufferu či mezi buffery
view ovládání textového a výběrového kurzoru, práce s oknem, skrolování atd.
match vyhledávání a doskok na odpovídající závorky atd.
window manipulace s okny zobrazenými v ploše editoru
space operace dostupné přes LSP apod.
Poznámka: v dokumentaci se rozlišuje mezi hlavními a vedlejšími režimy, to však v daný okamžik není tak důležité.

Obrázek 6: Normální režim je označen zkratkou NOR.

Podívejme se ještě na klávesové zkratky určené pro přechod do vedlejších režimů (tedy vlastně do všech režimů s výjimkou režimu normálního a vkládacího):

Název režimu Klávesová zkratka
command :
select (extend) v
goto g
view z
match m
sticky view Z
window Ctrl+W
space Space

Obrázek 7: Výběrový režim je označen zkratkou SEL (a část textu je již vybrána).

6. Kontextová menu

Při přepnutí do některého z vedlejších režimů se (ve výchozím nastavení editoru) zobrazí kontextové menu s nabídkou dalších příkazů, které je možné ve zvoleném vedlejším režimu provést. Podívejme se pro zajímavost, jak taková vedlejší menu vypadají pro jednotlivé režimy:

Obrázek 8: Kontextové menu vedlejšího režimu goto.

Obrázek 9: Kontextové menu vedlejšího režimu view.

Obrázek 10: Kontextové menu vedlejšího režimu match.

Obrázek 11: Kontextové menu vedlejšího režimu view.

Obrázek 12: Kontextové menu vedlejšího režimu window.

Obrázek 13: Kontextové menu vedlejšího režimu space.

7. Příkazy dostupné v normálním režimu

V normálním režimu (který v Helixu je, jak již víme, výchozí) je možné specifikovat příkazy pro pohyby v textu, tj. pro přesuny textového kurzoru po editovaném dokumentu (resp. přesněji řečeno v rámci bufferu, protože jeden dokument může být otevřen ve větším množství bufferů). Některé základní příkazy jsou zadávány jediným znakem popř. kombinací klávesy Ctrl s jinou klávesou. V první tabulce jsou vypsány základní příkazy, které jsou většinou kompatibilní s Vimem:

# Příkaz/zkratka Stručný popis
1 h přesun textového kurzoru o jeden znak doleva (jako ve Vimu)
2 j přesun textového kurzoru o jeden řádek dolů (jako ve Vimu)
3 k přesun textového kurzoru o jeden řádek nahoru (jako ve Vimu)
4 l přesun textového kurzoru o jeden znak doprava (jako ve Vimu)
5    
6 Page Up přesun o celou viditelnou stránku nahoru
7 Ctrl+B dtto, přesun o celou viditelnou stránku nahoru
8 Page Down přesun o celou viditelnou stránku dolů
9 Ctrl+F dtto, přesun o celou viditelnou stránku dolů
10 Ctrl+U přesun o polovinu viditelné stránky nahoru
11 Ctrl+D přesun o polovinu viditelné stránky dolů
Poznámka: před jednotlivé příkazy určené pro pohyb kurzoru můžete přidat počet opakování. Tj. pokud se například potřebujete v rámci aktuálně editovaného bufferu posunout o deset řádků níže, postačuje použít příkaz 10j (zde není oproti Vimu žádný podstatný rozdíl – pouze počet opakování není dostupný pro zkratky Ctrl+D a Ctrl+U, které mají ve Vimu odlišný význam).

To však samozřejmě není zdaleka vše, protože po zadání prefixu g (mnemotechnická zkratka od goto) je možné zadat specifikovat příkazy určené pro pohyb kurzoru (v této chvíli se nacházíme v režimu goto). Tyto příkazy jsou sice odlišné od Vimu, ovšem (zejména pro začínající uživatele) mohou být snadněji zapamatovatelné:

# Příkaz/zkratka Stručný popis
1 gg přechod na začátek bufferu (první textový řádek, jako ve Vimu, popř. n-tý řádek)
3 ge přechod na poslední řádek bufferu
     
4 gh přechod na začátek řádku, na němž se nachází kurzor (tedy „ultimátní“ příkaz h)
5 gl přechod na konec řádku, na němž se nachází kurzor (tedy „ultimátní“ příkaz l)
6 gs přechod na první znak na řádku, který není mezerou nebo TABeml)
     
7 gt přechod na první viditelný řádek (top) nebo n-tý řádek od začátku obrazovky
8 gb přechod na poslední viditelný řádek (bottom) nebo n-tý řádek od konce obrazovky
9 gc přechod na prostřední viditelný řádek (center)
     
10 g. přechod na text, který byl naposledy změněn či editován
     
11 gd skok na definici symbolu (přes LSP)
12 gy skok na definici typu (přes LSP)
13 gr skok na referenci (přes LSP)
14 gi skok na implementaci funkce/metody (přes LSP)
     
15 gn přechod na další buffer
16 gp přechod na předchozí buffer
Poznámka: u těchto příkazů se většinou nezadává počet opakování.

8. Režim výběru textu (selection)

Textový editor Vim nabízí uživatelům takzvaný vizuální režim spouštěný klávesou v, V či Ctrl+V. V tomto režimu je možné nejprve vybrat určitý text a posléze s tímto textem provádět další operace (vymazání, změna/náhrada atd.). V editoru Helix je výběr textu jednou z nejdůležitějších operací, protože zde neexistuje (jak již víme) kombinace operátor+příkaz_pro_pohyb_kurzoru. Z tohoto důvodu zde také kromě vizuálního režimu, který vyžaduje stisk jedné klávesy navíc, nalezneme celou skupinu příkazů sloužících pro výběr části textu (vizuální režim je však stále podporován, minimálně jeho základní verze zapnutá příkazem v):

# Příkaz/zkratka Stručný popis
1 b výběr od pozice kurzoru na začátek předchozího slova
2 e výběr od pozice kurzoru do konce slova
3 w výběr od pozice kurzoru na začátek dalšího slova
4 x výběr celého řádku
5 f výběr včetně specifikovaného znaku (find)
6 F dtto, ovšem v opačném směru
7 t výběr až do specifikovaného znaku (kromě tohoto znaku – till)
8 T dtto, ovšem v opačném směru
Poznámka: další výběrové operace již (na rozdíl od editoru Kakoune, kterým se Helix inspiroval) provádí po stisku v – zde mají všechny příkazy pro pohyb kurzoru odlišný význam, protože rozšiřují výběr). Kupodivu prozatím nejsou podporovány textové objekty.

9. Manipulace s výběrem

Ve chvíli, kdy je nějaký text vybraný, je možné s ním různým způsobem manipulovat. Nabídka příkazů je v režimu selection poměrně široká:

# Příkaz/zkratka Stručný popis
1 d vymazání vybraného textu, přesun vymazaného textu do schránky editoru
2 Alt+d vymazání, ovšem bez přesunu do schránky editoru
3 c přepis vybraného textu, přesun změněného textu do schránky editoru
4 Alt+c přepis vybraného textu, ovšem bez přesunu původního textu do schránky editoru
     
5 ~ změna velikosti písmen (upper case a zpět)
6 ` změna velikosti písmen (lower case)
7 Alt+` změna velikosti písmen (upper case)
8 > posun vybraného textu doprava (podle zvyklostí jazyka)
9 < posun vybraného textu doleva (podle zvyklostí jazyka)
10 = naformátování vybraného textu (opět podle zvyklostí jazyka a přes LSP)
     
11 | filtrace textu přes zvolený externí nástroj (například grep)
12 Alt+| dtto, ale text se nepřepíše
13 ! spuštění příkazu v shellu, vložení výsledku před vybraný text
14 Alt+! spuštění příkazu v shellu, vložení výsledku za vybraný text

10. Vícenásobné změny ve vybraném textu

V případě, že v režimu výběru použijeme příkaz s, zeptá se editor na text či regulární výraz, který má vyhledat a označit. Pokud najde více výskytů textu, budou označeny všechny tyto výskyty. Další operace, typicky změna (change) textu, bude provedena současně se všemi výskyty nalezeného textu, což bude i vizuálně patrné v okně textového editoru:

Obrázek 14: Vícenásobné změny ve vybraném textu.

11. Přechod z normálního režimu do vkládacího režimu (insert)

V normálním (a současně i ve výchozím) režimu nalezneme i mnohé další užitečné příkazy. Poměrně velké množství příkazů (převzatých z Vimu) slouží pro přechod do vkládajícího režimu, ovšem ještě před tímto přechodem se typicky provede nějaká operace, například pohyb kurzoru, vložení nového řádku do bufferu atd.:

# Příkaz/zkratka Stručný popis
1 a přechod do vkládacího režimu za pozicí kurzoru (append)
2 i přechod do vkládacího režimu před pozicí kurzoru (insert)
3 A přechod do vkládacího režimu na začátku řádku
4 I přechod do vkládacího režimu na konci řádku
     
5 o přechod do vkládacího režimu na začátku nově vytvořeného řádku pod kurzorem
6 O přechod do vkládacího režimu na začátku nově vytvořeného řádku nad kurzorem
     
7 c změna/modifikace vybraného textu

V případě, že je text již vybrán, tedy když se editor nachází v režimu selection, je význam prvních dvou zkratek odlišný:

# Příkaz/zkratka Stručný popis
1 a přechod do vkládacího režimu za vybraným textem (append) + rozšíření výběru o zapsaný text
2 i přechod do vkládacího režimu před vybraným textem (insert)

12. Manipulace s okny

Editor Helix, ostatně podobně jako Vim, obsahuje podporu pro rozdělení plochy terminálu na několik samostatných oblastí, v nichž je možné zobrazit jednotlivé editované buffery (a liší se od Kakoune, který tuto operaci ponechává na nástrojích screen nebo tmux. Podporovány jsou zejména příkazy dostupné z menu zobrazeného klávesovou zkratkou Ctrl+W (W jako window):

Klávesa Příkaz
n nové okno (získané vertikálním či horizontálním rozdělením)
s rozdělení aktivního okna horizontálně na dvě samostatná okna
v rozdělení aktivního okna vertikálně na dvě samostatná okna
q zavření aktivního okna
o zavření všech oken kromě aktivního okna
   
w přechod do další okno v pořadí
   
h přechod do okna nalevo
j přechod do okna dole
k přechod do okna nahoře
l přechod do okna napravo
Ctrl+h přechod do okna nalevo
Ctrl+j přechod do okna dole
Ctrl+k přechod do okna nahoře
Ctrl+l přechod do okna napravo

13. Vícenásobný kurzor

Další zajímavou vlastností textového editoru Helix je podpora takzvaného vícenásobného kurzoru, kterou (v různých obměnách) nalezneme i v některých dalších moderních textových editorech, například v Atomu atd. Kurzor je možné zduplikovat klávesou C a veškeré další operace (změna, smazání, přidání, dokonce i zvýšení či snížení hodnoty klávesami Ctrl+A a Ctrl+D) se provede na všech místech, kde se zduplikované kurzory nachází, současně. V tomto případě ovšem poměrně citelně chybí možnost duplikovat kurzor pomocí myši, protože možnosti příkazu C jsou omezeny na sousední řádky (popř. na řádky, mezi nimiž se nachází prázdné řádky).

14. Pomůcky při manipulaci se zdrojovými kódy

Zdrojové kódy podporovaných programovacích popř. značkovacích jazyků jsou v Helixu – jak je dnes nepsaným standardem – barevně zvýrazněny na základě analýzy syntaxe. Pro každý jazyk je přitom připravena nativní knihovna s gramatikou, takže práce i s rozsáhlými zdrojovými kódy je velmi rychlá a navíc se zvýraznění syntaxe u delších souborů „nerozhodí“ tak, jak je tomu ve Vimu (ve Vimu se totiž z důvodu urychlení práce syntaktické prvky hledají jen v určitém rozsahu). Podobně je na základě použitého jazyka řešeno odsazování atd. Všechny další složitější operace, tj. zejména automatické doplňování kódu, je řešeno přes LSP, což je téma navazujících kapitol.

Obrázek 15: Zvýraznění syntaxe zdrojových kódů.

15. Podpora Language Server Protokolu (LSP)

Textový editor Helix podporuje, ostatně podobně jako mnoho dalších v současnosti používaných programátorských textových editorů (Vim, Emacs, VSCode, Atom, …), podporu pro Language Server Protocol neboli zkráceně LSP, což umožňuje provádění takových operací, jako je kontextové doplňování názvů funkcí, atributů či metod, refaktoring, propojení s debuggerem (ale i automatické doplňování kódu přes AI) atd.

Language Server Protocol je otevřený standard navržený takovým způsobem, aby umožňoval komunikaci mezi textovými editory popř. mezi integrovanými vývojovými prostředími (IDE) na jedné straně a různými typy programátorských nástrojů na straně druhé. Mezi nástroje, které je díky existenci LSP možné z editoru/IDE použít, mohou patřit zejména různé lintery, statické analyzátory kódu, programy pro kontrolu stylu zápisu programů, nástroje umožňující refaktoring zdrojového kódu, teoreticky i profilery atd. Nesmíme samozřejmě zapomenout na dnes již všemi programátory očekávané nástroje pro automatické doplňování jmen funkcí, metod, objektů atd., „inteligentní“ vyhledávání ve zdrojovém kódu, doskoky na definici funkce, objektu nebo proměnné apod. Všechny tyto nástroje mohou komunikovat s editorem/IDE přímo (pokud obsahují podporu pro LSP), nebo je možné využít nějaký obecnější nástroj, který je většinou nazývaný Language Server a který podporuje větší množství funkcí (typicky vyhledání definic, refaktoring a automatické doplňování; samozřejmě v závislosti na konkrétní implementaci).

Obrázek 16: Textový editor Emacs ve funkci integrovaného vývojového prostředí.

Poznámka: samotný protokol je nezávislý na tom, jestli Language Server běží na stejném počítači jako samotný editor/IDE, či zda běží na nějakém vzdáleném serveru (jako služba). V prvním případě samozřejmě budou odezvy rychlejší a doba odezvy by v ideálním případě neměla být uživatelem vůbec zaznamenána (tj. prostředí musí reagovat do max. jedné sekundy, spíše však rychleji). Ve druhém případě se může jednat o sofistikovanější nástroje, které například používají vlastní databázi, AI modul atd.

Myšlenka, na které je language server protocol postaven, samozřejmě není nijak nová ani převratná, protože se podobný princip využíval již dříve, například v textových editorech Vim a Emacs, které takto mohly komunikovat s nástroji běžícími na pozadí (daemons), viz též https://github.com/Microsoft/language-server-protocol/wiki/Protocol-History. Příkladem může být integrace nástroje Jedi do Vimu, o níž jsme se relativně nedávno zmínili v článku Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu.

Poznámka: to, že je LSP vůbec reálně využitelný, je do značné míry zajištěno díky vysokému výpočetnímu výkonu současných (desktopových) počítačů. Dříve byly podobné nástroje velmi úzce propojeny se samotným editorem právě z toho důvodu, aby byla odezva editoru/IDE dostatečně rychlá. Na druhou stranu se samozřejmě nejedná o univerzální řešení a dnes již například IDE specializované na jediný jazyk nebývají tolik oblíbena, jako v minulosti, což je kvůli rostoucí složitosti a provázanosti technologií v IT pochopitelné.

Obrázek 17: Dnes již historické IDE Turbo Pascalu určené pouze pro jediný jazyk. Prakticky všechny nástroje jsou nedílnou součástí tohoto IDE (s výjimkou externích nástrojů grep a Turbo Debugger).

16. Základní informace o projektu LSP

Samotný protokol je založen na formátu JSON, přesněji řečeno na protokolu JSON-RPC. Při použití Language Server Protokolu je textový editor či IDE považován za klienta a language server pochopitelně vystupuje v roli serveru, který klientovi poskytuje takzvané „language service(s)“. Mezi klientem a serverem probíhá komunikace s využitím tří typů zpráv:

  • Požadavek (request) je posílán klientem (tedy v našem případě Helixem) na server. Server musí na tento požadavek odpovědět. Pro tento účel se používá protokol JSON-RPC.
  • Odpověď (response) serveru na požadavek klienta (Helixu). Klient vždy dokáže spárovat svůj požadavek s odpovědí serveru (to je základ JSON-RPC).
  • Oznamovací zprávy (notification) může posílat jak klient, tak i server, přičemž se na tyto zprávy nemusí posílat odpověď. Klient (editor) může například serveru ohlásit, že uživatel posunul kurzor na další funkci, ale prozatím od něj neočekává žádnou další službu a záleží jen na serveru, zda tuto operaci nějakým způsobem zpracuje či nikoli.

Uveďme si příklad jednoduché komunikace mezi klientem a serverem. Na levé straně je klient/editor, na straně pravé language server:

textDocument/didOpen ->
textDocument/didChange ->
<- textDocument/publishDiagnostics
<- textDocument/didClose

Konkrétní tvar dotazu může vypadat takto:

{'method': 'textDocument/hover', 'jsonrpc': '2.0', 'id': 4,
 'params': {'textDocument': {'uri': 'file:///home/ptisnovs/t.py'},
 'position': {'character': 0, 'line': 21}}}

Jeden typ notifikace vrácené serverem klientovi:

textDocument/publishDiagnostics {'uri': 'file:///home/ptisnovs/t.py',
'diagnostics': [{'source': 'pycodestyle',
'range': {'start': {'line': 3, 'character': 19},
          'end': {'line': 3, 'character': 21}},
          'message': 'W291 trailing whitespace', 'code': 'W291', 'severity': 2}]}

17. LSP a textový editor Helix

Textový editor Helix dokáže při otevření zdrojového kódu automaticky spustit příslušný language server, pochopitelně ovšem za předpokladu, že je nainstalován. Například v případě jazyka Go se Helix pokouší spustit gopls, který je nutné nejdříve nainstalovat (žádná další konfigurace již není zapotřebí):

$ go get golang.org/x/tools/gopls@latest

Pokud se LSP nespustí, je vhodné Helix spusit příkazem:

$ hx -v

a prohlédnout si chybová hlášení v logu.

18. Barvová témata

Na závěr se ještě podívejme na způsob změny stylu zobrazení Helixu. K dispozici je poměrně velké množství barevných témat, která jsou součástí instalace tohoto textového editoru. Barvové téma je možné změnit příkazem :theme. Po stisku klávesy Tab se zobrazí menu se všemi dostupnými schématy, z něhož je možné si vybrat. Mnohá témata jsou přitom nabízena ve dvou variantách podle toho, zda je pozadí terminálu světlé či naopak tmavé.

Obrázek 18: Barvové schéma.

CS24_early

19. Závěrečné subjektivní zhodnocení

Helix se i přes vysoké číslo verze (22.03) prozatím nachází spíše ve fázi vývoje a i když obsahuje některé zajímavé nápady (celý koncept výběr+příkaz, částečně převzatý z Emacsu a Kakoune, multivýběry a multikurzory), ještě podle mého skromného názoru není plnohodnotnou náhradou Vimu či nějakého dalšího modálního editoru (Spacemacs, Doom Emacs nebo i běžný Evil v Emacsu). Nicméně bude zajímavé sledovat, kam se oba zmíněné editory, tedy jak Helix, tak i Kakoune, posunou v dalších měsících a letech. Prozatím však (opět – subjektivně) nepřináší tolik užitečných vlastností, aby byly vhodné pro každodenní použití.

Poznámka: asi by Helixu neuškodila větší modularita, plně konfigurovatelné klávesové zkratky atd.

20. Odkazy na Internetu

  1. Představení Helixu
    https://helix-editor.com/
  2. Helix: A post-modern modal text editor
    https://githubplus.com/helix-editor/helix
  3. Helix na GitHubu
    https://github.com/helix-editor/helix
  4. Helix: dokumentace
    https://docs.helix-editor.com/
  5. Helix: troubleshooting
    https://github.com/helix-editor/helix/wiki/Troubleshooting
  6. Klávesové zkratky Helixu
    https://docs.helix-editor.com/keymap.html
  7. gopls
    https://www.getman.io/posts/gopls/
  8. Kakoune: A Better Code Editor Heavily Inspired by Vim
    https://www.tecmint.com/kakoune-better-code-editor-for-linux/
  9. Kakoune demo
    https://vimeo.com/82711574
  10. 6 Best Vi/Vim-Inspired Code Editors for Linux
    https://www.tecmint.com/vi-vim-inspired-code-editors-for-linux/
  11. Why Kakoune — The quest for a better code editor
    https://kakoune.org/why-kakoune/why-kakoune.html
  12. Kakoune design
    https://github.com/mawww/ka­koune/blob/master/doc/desig­n.asciidoc
  13. Kakoune (modální textový editor)
    http://kakoune.org/
  14. Kakoune: Selections
    https://github.com/mawww/ka­koune/wiki/Selections
  15. Migrating from Vim
    https://github.com/mawww/ka­koune/wiki/Migrating-from-Vim
  16. kakoune-vertical-selections
    https://github.com/occivink/kakoune-vertical-selection
  17. Langserver.org
    https://langserver.org/
  18. Language Server Protocol
    https://microsoft.github.io/language-server-protocol/
  19. Language Server Protocol Specification
    https://microsoft.github.io/language-server-protocol/specification
  20. Implementations Language Servers
    https://microsoft.github.io/language-server-protocol/implementors/servers
  21. JSON-RPC 2.0 Specification
    https://www.jsonrpc.org/specification
  22. Why You Should Know the Language Server Protocol
    https://tomassetti.me/what-is-the-language-server-protocol/
  23. Language Server Protocol: A Language Server For DOT With Visual Studio Code
    https://tomassetti.me/language-server-dot-visual-studio/
  24. Python Language Server
    https://github.com/palantir/python-language-server
  25. Jedi – an awesome autocompletion/static analysis library for Python
    https://github.com/davidhalter/jedi
  26. What is lsp
    https://www.reddit.com/r/vim/com­ments/7lnhrt/which_lsp_plu­gin_should_i_use/
  27. Evil (Emacs Wiki)
    https://www.emacswiki.org/emacs/Evil
  28. Evil (na GitHubu)
    https://github.com/emacs-evil/evil
  29. Evil (na stránkách repositáře MELPA)
    https://melpa.org/#/evil
  30. Evil Mode: How I Switched From VIM to Emacs
    https://blog.jakuba.net/2014/06/23/e­vil-mode-how-to-switch-from-vim-to-emacs.html
  31. Vrapper aneb spojení možností Vimu a Eclipse
    https://mojefedora.cz/vrapper-aneb-spojeni-moznosti-vimu-a-eclipse/
  32. Vrapper aneb spojení možností Vimu a Eclipse (část 2: vyhledávání a nahrazování textu)
    https://mojefedora.cz/vrapper-aneb-spojeni-moznosti-vimu-a-eclipse-cast-2-vyhledavani-a-nahrazovani-textu/
  33. Emacs/Evil-mode – A basic reference to using evil mode in Emacs
    http://www.aakarshnair.com/posts/emacs-evil-mode-cheatsheet
  34. From Vim to Emacs+Evil chaotic migration guide
    https://juanjoalvarez.net/es/de­tail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/
  35. Introduction to evil-mode {video)
    https://www.youtube.com/wat­ch?v=PeVQwYUxYEg
  36. Vim-style keybinding in Emacs/Evil-mode
    https://gist.github.com/tro­yp/6b4c9e1c8670200c04c16036805773d8
  37. Evil-surround
    https://github.com/emacs-evil/evil-surround
  38. Spacemacs
    http://spacemacs.org/
  39. Neovim: literally the future of vim
    https://neovim.io/
  40. AMP – A Vi/Vim Inspired Text Editor for Linux Terminal
    https://www.tecmint.com/amp-vi-vim-inspired-text-editor-for-linux/
  41. Amp: A text editor for your terminal
    https://github.com/jmacdonald/amp
  42. Stránky projektu Amp.rs
    https://amp.rs/
  43. Dokumentace k editoru Amp
    https://amp.rs/docs/
  44. Vis: a vi-like editor based on Plan 9's structural regular expressions
    https://github.com/martanne/vis
  45. Very opinionated Node.JS VI clone
    https://github.com/mikesmullin/nvi
  46. PyVim: Pure Python Vim clone
    https://github.com/prompt-toolkit/pyvim
  47. pyvim 2.0.24 na PyPi
    https://pypi.org/project/pyvim/
  48. vim2elvis (1)
    https://www.root.cz/clanky/vim2elvis-1/
  49. vim2elvis (2)
    https://www.root.cz/clanky/vim2elvis-2/
  50. Seriál Textový editor Vim jako IDE
    https://www.root.cz/serialy/textovy-editor-vim-jako-ide/
  51. Obsah Rootu označený nálepkou Vim
    https://www.root.cz/n/vim/
  52. Atom: moderní textový editor
    https://www.root.cz/clanky/atom-moderni-textovy-editor/
  53. Atom: moderní textový editor (dokončení)
    https://www.root.cz/clanky/atom-moderni-textovy-editor-dokonceni/
  54. Why I switched to VIM from Visual Studio Code
    https://freshman.tech/from-vscode-to-vim/
  55. VSCodeVim
    https://marketplace.visual­studio.com/items?itemName=vsco­devim.vim
  56. VSCodeVim/Vim na GitHubu
    https://github.com/VSCodeVim/Vim
  57. How Vim killed Atom and VSCode on my Machine
    https://medium.com/@aswinmohanme/how-vim-killed-atom-and-vscode-723a68ad59dc

Autor: Pavel Tišnovský   2022

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.