Obsah
1. Helix – nový modální textový editor inspirovaný Vimem a Kakoune
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
7. Příkazy dostupné v normálním režimu
8. Režim výběru textu (selection)
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)
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
19. Závěrečné subjektivní zhodnocení
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.

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:
- runtime/grammars obsahuje nativní knihovny(!) s gramatikami podporovaných značkovacích a programovacích jazyků
- runtime/queries obsahuje konfiguraci pro jednotlivé jazyky zapsanou ve Scheme
- 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 }

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. |

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ů |
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 |
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 |
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í.
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.

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.
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í.
20. Odkazy na Internetu
- Představení Helixu
https://helix-editor.com/ - Helix: A post-modern modal text editor
https://githubplus.com/helix-editor/helix - Helix na GitHubu
https://github.com/helix-editor/helix - Helix: dokumentace
https://docs.helix-editor.com/ - Helix: troubleshooting
https://github.com/helix-editor/helix/wiki/Troubleshooting - Klávesové zkratky Helixu
https://docs.helix-editor.com/keymap.html - gopls
https://www.getman.io/posts/gopls/ - Kakoune: A Better Code Editor Heavily Inspired by Vim
https://www.tecmint.com/kakoune-better-code-editor-for-linux/ - Kakoune demo
https://vimeo.com/82711574 - 6 Best Vi/Vim-Inspired Code Editors for Linux
https://www.tecmint.com/vi-vim-inspired-code-editors-for-linux/ - Why Kakoune — The quest for a better code editor
https://kakoune.org/why-kakoune/why-kakoune.html - Kakoune design
https://github.com/mawww/kakoune/blob/master/doc/design.asciidoc - Kakoune (modální textový editor)
http://kakoune.org/ - Kakoune: Selections
https://github.com/mawww/kakoune/wiki/Selections - Migrating from Vim
https://github.com/mawww/kakoune/wiki/Migrating-from-Vim - kakoune-vertical-selections
https://github.com/occivink/kakoune-vertical-selection - Langserver.org
https://langserver.org/ - Language Server Protocol
https://microsoft.github.io/language-server-protocol/ - Language Server Protocol Specification
https://microsoft.github.io/language-server-protocol/specification - Implementations Language Servers
https://microsoft.github.io/language-server-protocol/implementors/servers - JSON-RPC 2.0 Specification
https://www.jsonrpc.org/specification - Why You Should Know the Language Server Protocol
https://tomassetti.me/what-is-the-language-server-protocol/ - Language Server Protocol: A Language Server For DOT With Visual Studio Code
https://tomassetti.me/language-server-dot-visual-studio/ - Python Language Server
https://github.com/palantir/python-language-server - Jedi – an awesome autocompletion/static analysis library for Python
https://github.com/davidhalter/jedi - What is lsp
https://www.reddit.com/r/vim/comments/7lnhrt/which_lsp_plugin_should_i_use/ - Evil (Emacs Wiki)
https://www.emacswiki.org/emacs/Evil - Evil (na GitHubu)
https://github.com/emacs-evil/evil - Evil (na stránkách repositáře MELPA)
https://melpa.org/#/evil - Evil Mode: How I Switched From VIM to Emacs
https://blog.jakuba.net/2014/06/23/evil-mode-how-to-switch-from-vim-to-emacs.html - Vrapper aneb spojení možností Vimu a Eclipse
https://mojefedora.cz/vrapper-aneb-spojeni-moznosti-vimu-a-eclipse/ - 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/ - Emacs/Evil-mode – A basic reference to using evil mode in Emacs
http://www.aakarshnair.com/posts/emacs-evil-mode-cheatsheet - From Vim to Emacs+Evil chaotic migration guide
https://juanjoalvarez.net/es/detail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/ - Introduction to evil-mode {video)
https://www.youtube.com/watch?v=PeVQwYUxYEg - Vim-style keybinding in Emacs/Evil-mode
https://gist.github.com/troyp/6b4c9e1c8670200c04c16036805773d8 - Evil-surround
https://github.com/emacs-evil/evil-surround - Spacemacs
http://spacemacs.org/ - Neovim: literally the future of vim
https://neovim.io/ - AMP – A Vi/Vim Inspired Text Editor for Linux Terminal
https://www.tecmint.com/amp-vi-vim-inspired-text-editor-for-linux/ - Amp: A text editor for your terminal
https://github.com/jmacdonald/amp - Stránky projektu Amp.rs
https://amp.rs/ - Dokumentace k editoru Amp
https://amp.rs/docs/ - Vis: a vi-like editor based on Plan 9's structural regular expressions
https://github.com/martanne/vis - Very opinionated Node.JS VI clone
https://github.com/mikesmullin/nvi - PyVim: Pure Python Vim clone
https://github.com/prompt-toolkit/pyvim - pyvim 2.0.24 na PyPi
https://pypi.org/project/pyvim/ - vim2elvis (1)
https://www.root.cz/clanky/vim2elvis-1/ - vim2elvis (2)
https://www.root.cz/clanky/vim2elvis-2/ - Seriál Textový editor Vim jako IDE
https://www.root.cz/serialy/textovy-editor-vim-jako-ide/ - Obsah Rootu označený nálepkou Vim
https://www.root.cz/n/vim/ - Atom: moderní textový editor
https://www.root.cz/clanky/atom-moderni-textovy-editor/ - Atom: moderní textový editor (dokončení)
https://www.root.cz/clanky/atom-moderni-textovy-editor-dokonceni/ - Why I switched to VIM from Visual Studio Code
https://freshman.tech/from-vscode-to-vim/ - VSCodeVim
https://marketplace.visualstudio.com/items?itemName=vscodevim.vim - VSCodeVim/Vim na GitHubu
https://github.com/VSCodeVim/Vim - 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