Obsah
1. Textový editor Helix ve funkci vývojového prostředí
2. Prostředky a technologie určené pro programátory
3. Obarvení textů na základě syntaxe: klasický Vim vs. Helix
4. Technologie pro obarvení syntaxe ve Vimu
6. Instalace nejnovější stabilní verze Helixu
7. Instalace z předpřipravených balíčků pro různé distribuce Linuxu
8. Zjištění podpory programovacích jazyků Helixem
9. Instalace LSP a dalších nástrojů pro zvolený programovací jazyk
11. Nové zjištění stavu LSP pro zvolený programovací jazyk
14. Kontrola chyb ve zdrojových kódech
17. Využití debuggeru ovládaného přes DAP (Debug Adapter Protocol)
18. Závěrečné subjektivní zhodnocení
19. Příloha: nastavení xtermu pro Helix
1. Textový editor Helix ve funkci vývojového prostředí
V článku Helix: nový modální textový editor inspirovaný Vimem a Kakoune jsme se seznámili se základními vlastnostmi textového editoru nazvaného Helix. Jedná se o modální textový editor, který je primárně určen pro spuštění v terminálu, i když jeho interní architektura umožňuje přidání dalších frontendů. Když se napíše „modální textový editor“, každého pochopitelně napadne Vi, resp. Vim. Helix skutečně přebírá mnoho vlastností z Vimu, ovšem nesnaží se s ním být kompatibilní, takže přechod z Vimu na Helix není úplně bezbolestný. Na druhou stranu však Helix nemusí přebírat všechny (dnes již spíše historické) vlastnosti a jeho tvůrci tak měli poměrně volnou ruku v implementaci nových a zajímavých vlastností. Ovládání Helixu je taktéž jednodušší, zejména pro začátečníky v oblasti modálních textových editorů (zatímco my dlouhodobí uživatelé Vimu spíše zpočátku trpíme :-).
Obrázek 1: Logo textového editoru Helix.
V dnešním článku si však nebudeme popisovat rozdíly mezi Helixem a Vimem. Zaměříme se spíše na technologie, které jsou určeny pro programátory, protože právě programátoři jsou primární cílovou skupinou editoru Helix (populární je zejména mezi programátory používající Rust, ovšem naprosto stejné vlastnosti nám Helix nabídne i pro další programovací jazyky).
Obrázek 2: Logo textového editoru Vim.
2. Prostředky a technologie určené pro programátory
Textový editor Helix obsahuje už ve svém základu (a to bez potřeby instalace rozšiřujících modulů nebo dokonce i bez potřeby konfigurace) mnoho technologií určených primárně pro programátory:
- Panel pro výběr souborů pro editaci, v němž je možné rychlé vyhledávání s využitím „fuzzy“ vyhledávání (tedy mezi hledanými znaky se mohou nacházet i další znaky, výběr souborů se postupně zužuje atd.).
- Rychlé a především korektní zvýraznění syntaxe, což je technologie, o které se podrobněji zmíníme v dalších kapitolách.
- Podpora LSP pro velké množství programovacích jazyků (cca 160 jazyků). Ve výsledku tak můžeme očekávat, že Helix bude nabízet podobné funkce jako například VSCode.
- Doplňování názvů funkcí a metod, nápověda k parametrům funkcí/metod, zvýraznění chyb nalezených ve zdrojovém kódu.
- Podpora debuggerů pro vybrané programovací jazyky.
- Mnoho zkratek editoru je určeno pro práci se syntaxí jazyka (doskoky na definici funkce, datového typu apod.).
- Podpora pro editaci více míst zdrojového kódu současně s využitím technologie nazvané multicursor (ta je použita i v jiných textových editorech).
Obrázek 3: Prostředí textového editoru Helix
3. Obarvení textů na základě syntaxe: klasický Vim vs. Helix
Zastavme se nyní u jedné technologie, která poměrně dobře ilustruje rozdíl v přístupu Vimu a Helixu k řešení dennodenních úkolů. Jedná se o podporu pro obarvení syntaxe určená jak pro programovací jazyky, tak i pro jazyky značkovací. Nejdříve se podívejme, jak je tento problém řešen ve Vimu, v navazujícím textu si pak přiblížíme, jak se k problému postavili tvůrci Helixu.
Obrázek 4: Minifikovaný program v JavaScriptu otevřený ve Vimu. Technologie použitá pro zvýraznění syntaxe zde selhává.
Obrázek 5: Totožný minifikovaný program v JavaScriptu otevřený v Helixu. Vše je naprosto v pořádku a hlavně je editace možná a rychlá.
4. Technologie pro obarvení syntaxe ve Vimu
Společně s textovým editorem Vim je dodáváno několik stovek (více než 500) konfiguračních souborů obsahujících syntaktická pravidla pro různé programovací jazyky, značkovací jazyky (HTML, XML, TeX) i některé typy konfiguračních souborů. I přes velké úsilí, které mnoho programátorů do tvorby konfiguračních souborů se syntaktickými pravidly vkládá, se však může stát, že je nutné vytvořit nová pravidla a/nebo zcela nový konfigurační soubor. Veškeré vytváření, nastavení či mazání syntaktických pravidel se provádí pomocí příkazu :syntax, jenž se obvykle zkracuje na :syn nebo méně často na :sy. Pokud je tento příkaz pouze spuštěn bez dalších parametrů, vypíše právě aktivní syntaktická pravidla, která se samozřejmě liší podle toho, jaký soubor je právě editován.
Obrázek 6: Definice syntaxe ve Vimu – klíčová slova a regulární výrazy.
Za příkazem :syntax lze uvést poměrně velké množství dalších modifikátorů a atributů, nás však budou v tomto článku zajímat pouze čtyři modifikátory, které jsou vypsány v následující tabulce:
Příkaz | Význam |
---|---|
:syntax clear | vymazání všech syntaktických kategorií |
:syntax clear kategorie | vymazání jedné syntaktické kategorie (užitečné především při postupném ladění různých možností) |
:syntax keyword kategorie … | vytvoření nové syntaktické kategorie obsahující klíčová slova |
:syntax match kategorie … | vytvoření nové syntaktické kategorie zadané regulárním výrazem |
:syntax region kategorie … | vytvoření nové syntaktické kategorie zadané regulárním výrazem označujícím začátek kategorie a druhým výrazem označujícím její konec |
Obrázek 7: Definice syntaxe ve Vimu – klíčová slova.
Nejsnazší je vytvoření nové syntaktické kategorie definované výčtem klíčových slov. Pro vytvoření této kategorie se používá následující formát příkazu :syntax:
:syntax keyword kategorie slovo slovo slovo...
Příklady (pro Javu):
:syntax keyword javaConditional if else switch :syntax keyword javaRepeat while for do :syntax keyword javaBoolean true false :syntax keyword javaConstant null :syntax keyword javaTypedef this super :syntax keyword javaOperator new instanceof ... ... ...
U velkého množství strukturovaných souborů si s pouhým přiřazením barev jednotlivým klíčovým slovům nevystačíme. V tomto případě přichází na řadu další možnost definice syntaktických kategorií – použití regulárních výrazů s využitím příkazu :syntax match:
:highlight Tab1 ctermbg=lightgreen guibg=#e0ffe0 :highlight Tab2 ctermbg=lightred guibg=#ffe0e0 :highlight Tab3 ctermbg=lightblue guibg=#e0e0ff :highlight Tab4 ctermbg=lightcyan guibg=#ffffe0 :syntax match Tab1 "\t" :syntax match Tab2 "\t\t" :syntax match Tab3 "\t\t\t" :syntax match Tab4 "\t\t\t\t" :highlight def IP_Address ctermfg=darkred :syntax clear IP_Address :syntax match IP_Address /\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)\.\(25[0-5]\|2[0-4][0-9]\|[01]\?[0-9][0-9]\?\)/ :syntax match NumericConstantOctal "0[0-7_]*\>" :syntax match NumericConstantBinary "0[bB][01_]*\>" :syntax match NumericConstantHex "0[xX][0-9a-fA-F_]*\>" :syntax match NumericConstantDecimal "[1-9_][0-9_]*\>" :syntax match NumericConstantFloat "[0-9_]*\.[0-9_]*\([eE][+-]\=[0-9_]*\)\=\>"
Obrázek 8: Definice syntaxe ve Vimu – regulární výrazy.
Ovšem ani definice syntaktické kategorie s využitím regulárního výrazu nemusí ve všech případech dostačovat. Jedná se například o případy, kdy se ve zdrojovém kódu vyskytují nějaké vnořené bloky. Nemusí se přitom jednat jen o příkazové bloky, ale o jakékoli bloky s jasně určeným začátkem a koncem, v nichž se vyskytuje další text, který je vhodné mnohdy taktéž zvýraznit:
:syntax region multiLineComment start="/\*" end="\*/" :syntax region commandBlock start="{" end="}"
Ve skutečnosti však je však situace s bloky trošku složitější, protože většinou potřebujeme uvnitř bloků zvýraznit i další syntaktické kategorie. Podívejme se na následující příklad:
:hi CodeBlock guifg=cyan :hi Numbers guifg=yellow :hi Comment guifg=gray :syn clear CodeBlock :syn clear Numbers :syn clear Comment :syn region CodeBlock start="{" end="}" :syn match Numbers /[0-9]\+/ :syn match Comment "//.*"
Obrázek 9: Vim dokáže snadno „ztratit“ synchronizaci při zvýrazňování syntaxe.
Obrázek 10: Stejný soubor, ovšem nyní zobrazený korektně.
5. GLR parser v Helixu
Tvůrci Helixu si byli vědomi, že zvýraznění syntaxe je v současnosti velmi důležitou součástí textového editoru, takže celou problematiku pojali odlišným způsobem – namísto snahy a použití regulárních výrazů a pravidel pro začátky a konce bloků použili knihovnu tree-sitter, která zdrojový kód interně reprezentuje formou stromu (obdoba AST – abstract syntax tree). A navíc jsou veškeré úpravy tohoto stromu postupně upravovány tak, jak uživatel edituje zdrojový kód. Tato vlastnost se nazývá incremental parsing. A snad ještě důležitější je fakt, že se parser implementovaný v tree-sitteru dokáže „vzpamatovat“ i tehdy, pokud zdrojový kód obsahuje syntaktické chyby (error recovery).
Obrázek 11: Logo knihovny tree-sitter.
Původní tree-sitter byl založen na klasickém LR parseru (Left-to-right, Rightmost derivation in reverse), ovšem záhy (ještě před vydáním první veřejné verze) se přešlo na GLR parser (generalized LR parser). Tento parser nabízí výše zmíněné technologie error recovery a incremental parsing (modifikuje se jen část stromu) a je velmi rychlý. To si ostatně můžete sami otestovat na stránce https://tree-sitter.github.io/tree-sitter/playground.
Jak je interně reprezentován zdrojový kód si ukážeme na jednoduchém příkladu naprogramovaném v Pythonu:
def add(x: int, y: int): return x + y print(add(1, 2))
Interní podoba stromu bude vypadat takto (asi jste již uhodli, co znamenají čísla v hranatých závorkách):
module [0, 0] - [5, 0] function_definition [0, 0] - [1, 16] name: identifier [0, 4] - [0, 7] parameters: parameters [0, 7] - [0, 23] typed_parameter [0, 8] - [0, 14] identifier [0, 8] - [0, 9] type: type [0, 11] - [0, 14] identifier [0, 11] - [0, 14] typed_parameter [0, 16] - [0, 22] identifier [0, 16] - [0, 17] type: type [0, 19] - [0, 22] identifier [0, 19] - [0, 22] body: block [1, 4] - [1, 16] return_statement [1, 4] - [1, 16] binary_operator [1, 11] - [1, 16] left: identifier [1, 11] - [1, 12] right: identifier [1, 15] - [1, 16] expression_statement [4, 0] - [4, 16] call [4, 0] - [4, 16] function: identifier [4, 0] - [4, 5] arguments: argument_list [4, 5] - [4, 16] call [4, 6] - [4, 15] function: identifier [4, 6] - [4, 9] arguments: argument_list [4, 9] - [4, 15] integer [4, 10] - [4, 11] integer [4, 13] - [4, 14]
Naprosto stejným způsobem si můžeme do podoby stromu transformovat podobný příklad, tentokrát ovšem naprogramovaný v jazyku Go:
func add(x, y int) int { return x + y } println(add(1, 2))
Výsledkem bude:
source_file [0, 0] - [6, 0] function_declaration [0, 0] - [2, 1] name: identifier [0, 5] - [0, 8] parameters: parameter_list [0, 8] - [0, 18] parameter_declaration [0, 9] - [0, 17] name: identifier [0, 9] - [0, 10] name: identifier [0, 12] - [0, 13] type: type_identifier [0, 14] - [0, 17] result: type_identifier [0, 19] - [0, 22] body: block [0, 23] - [2, 1] return_statement [1, 4] - [1, 16] expression_list [1, 11] - [1, 16] binary_expression [1, 11] - [1, 16] left: identifier [1, 11] - [1, 12] right: identifier [1, 15] - [1, 16] call_expression [5, 0] - [5, 18] function: identifier [5, 0] - [5, 7] arguments: argument_list [5, 7] - [5, 18] call_expression [5, 8] - [5, 17] function: identifier [5, 8] - [5, 11] arguments: argument_list [5, 11] - [5, 17] int_literal [5, 12] - [5, 13] int_literal [5, 15] - [5, 16]
$ ls -l runtime/grammars/python.so -rw-r--r-- 1 ptisnovs ptisnovs 394072 May 18 09:48 runtime/grammars/python.so
6. Instalace nejnovější stabilní verze Helixu
Textový editor Helix je naprogramován v jazyku Rust, což mj. znamená, že je přeložen do jediného spustitelného souboru, který je možné na dané kombinaci architektura+operační systém většinou bez problémů spustit (nezávisí na uživatelských knihovnách, jen na základních knihovnách systémových – o čemž se zmíníme dále). Číslování verzí je poněkud neobvyklé (postmoderní?), takže poslední verze již nese číslo 23 (23.05). Tarball této verze jak se spustitelným Helixem, tak i s podpůrnými soubory (gramatiky pro podporované jazyky, barvová schémata atd.) lze získat následovně (příkaz byl spuštěn pro Linux na architektuře x86–64):
$ wget https://github.com/helix-editor/helix/releases/download/23.05/helix-23.05-x86_64-linux.tar.xz --2023-06-24 15:27:12-- https://github.com/helix-editor/helix/releases/download/23.05/helix-23.05-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/8d0a1a55-4be3-4cb4-be07-7de7ede57fd5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKI****************************%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230624T132712Z&X-Amz-Expires=300&X-Amz-Signature=7ab3*********************************************************772&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=268424739&response-content-disposition=attachment%3B%20filename%3Dhelix-23.05-x86_64-linux.tar.xz&response-content-type=application%2Foctet-stream [following] --2023-06-24 15:27:12-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/268424739/8d0a1a55-4be3-4cb4-be07-7de7ede57fd5?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKI*************************624%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230624T132712Z&X-Amz-Expires=300&X-Amz-Signature=7ab**********************************************************772&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=268424739&response-content-disposition=attachment%3B%20filename%3Dhelix-23.05-x86_64-linux.tar.xz&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ... Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 10690132 (10M) [application/octet-stream] Saving to: ‘helix-23.05-x86_64-linux.tar.xz’ helix-23.05-x86_64-linux.tar.xz 100%[==============================================================================>] 10,19M 2,40MB/s in 4,1s 2023-06-24 15:27:17 (2,46 MB/s) - ‘helix-23.05-x86_64-linux.tar.xz’ saved [10690132/10690132]
Rozbalení staženého archivu (tar + xz) se následně provede příkazem:
$ tar xvfx helix-23.05-x86_64-linux.tar.xz
Po rozbalení získáme mj. i soubor nazvaný hx, který by měl být spustitelný. Ovšem na starších systémech může být se spuštěním problém, protože je vyžadována poměrně nová verze knihovny glibc (povšimněte si – jedná se o jedinou závislost na dynamické knihovně a i tato jediná závislost se ukazuje být problematická):
$ ./hx ./hx: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./hx) ./hx: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./hx) ./hx: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./hx)
Samozřejmě je však možné provést překlad Helixu přímo ze zdrojových kódů projektu Helix (potom problém s glibc nenastane). V takovém případě je vyžadována instalace Rustu i Carga (balíčkovacího systému Rustovského ekosystému) a samotný překlad je přímočarý:
$ git clone https://github.com/helix-editor/helix $ cd helix $ cargo install --path helix-term
7. Instalace z předpřipravených balíčků pro různé distribuce Linuxu
Další možnost instalace spočívá ve využití balíčků určených pro většinu populárních distribucí Linuxu, ale i pro další systémy (pozor na to, že balíčky mohou být zastaralé – o jednu či více minoritních verzí). Jednotlivé postupy jsou popsány na stránce https://docs.helix-editor.com/install.html. Ukažme si například instalaci na Mintu. Ten sice není na stránce zmíněn, ale použijeme postup pro Ubuntu:
$ sudo add-apt-repository ppa:maveonair/helix-editor [sudo] password for ptisnovs: top secret Sorry, try again. You are about to add the following PPA: A post-modern text editor. The source code used to build the package can be found here: https://github.com/maveonair/helix-ppa. More info: https://launchpad.net/~maveonair/+archive/ubuntu/helix-editor Press Enter to continue or Ctrl+C to cancel Executing: /tmp/apt-key-gpghome.CYWSmOkP6D/gpg.1.sh --keyserver hkps://keyserver.ubuntu.com:443 --recv-keys 27642B9FD7F1A161FC2524E3355A4FA515D7C855 gpg: key 355A4FA515D7C855: public key "Launchpad PPA for Fabian Mettler" imported gpg: Total number processed: 1 gpg: imported: 1 $ sudo apt update ... ... ... $ sudo apt install helix Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: helix 0 upgraded, 1 newly installed, 0 to remove and 92 not upgraded. Need to get 10,6 MB of archives. After this operation, 133 MB of additional disk space will be used. Get:1 http://ppa.launchpad.net/maveonair/helix-editor/ubuntu focal/main amd64 helix amd64 23.05-8~ubuntu20.04~ppa1 [10,6 MB] Fetched 10,6 MB in 12s (912 kB/s) Selecting previously unselected package helix. (Reading database ... 291696 files and directories currently installed.) Preparing to unpack .../helix_23.05-8~ubuntu20.04~ppa1_amd64.deb ... Unpacking helix (23.05-8~ubuntu20.04~ppa1) ... Setting up helix (23.05-8~ubuntu20.04~ppa1) ... Processing triggers for mime-support (3.64ubuntu1) ... Processing triggers for hicolor-icon-theme (0.17-2) ... Processing triggers for gnome-menus (3.36.0-1ubuntu1) ... Processing triggers for desktop-file-utils (0.24+linuxmint1) ...
Na konec si vyzkoušíme, zda je Helix skutečně nainstalován:
$ whereis hx hx: /usr/lib/hx $ hx --version helix 23.05 (7f5940be)
8. Zjištění podpory programovacích jazyků Helixem
Jednou z předností Helixu je možnost velmi snadného propojení s LSP pro různé programovací jazyky a v mnoha případech i na debuggery pro tyto jazyky. V naprosté většině případů postačuje pouze LSP nainstalovat a Helix bez potřeby další instalace tento LSP začne používat. Ostatně můžeme se o tom snadno přesvědčit spuštěním příkazu:
$ hx --health
Helix vypíše, které LSP podporuje a ke kterým má skutečně přístup (výstup je ve skutečnosti obarvený, takže i lépe čitelný):
Config file: /home/user/.config/helix/config.toml Language file: /home/user/.config/helix/languages.toml Log file: /home/user/.cache/helix/helix.log Runtime directories: /home/user/.config/helix/runtime;/home/user/helix/runtime Runtime directory does not exist: /home/user/.config/helix/runtime Clipboard provider: xclip System clipboard provider: xclip Language LSP DAP Highlight Textobject Indent astro None None ✓ ✘ ✘ awk ✘ awk-lan… None ✓ ✓ ✘ bash ✘ bash-la… None ✓ ✘ ✓ bass ✘ bass None ✓ ✘ ✘ beancount None None ✓ ✘ ✘ bibtex ✘ texlab None ✓ ✘ ✘ bicep ✘ bicep-l… None ✓ ✘ ✘ c ✘ clangd ✘ lldb-vs… ✓ ✓ ✓ c-sharp ✘ OmniSha… ✘ netcore… ✓ ✓ ✘ cabal None None ✘ ✘ ✘ cairo None None ✓ ✘ ✘ capnp None None ✓ ✘ ✓ clojure ✘ clojure… None ✓ ✘ ✘ cmake ✘ cmake-l… None ✓ ✓ ✓ comment None None ✓ ✘ ✘ common-lisp… ✘ cl-lsp None ✓ ✘ ✘ cpon None None ✓ ✘ ✓ cpp ✘ clangd ✘ lldb-vs… ✓ ✓ ✓ crystal ✘ crystal… None ✓ ✓ ✘ css ✘ vscode-… None ✓ ✘ ✘ cue ✘ cuelsp None ✓ ✘ ✘ d ✘ serve-d… None ✓ ✓ ✓ dart ✘ dart None ✓ ✘ ✓ devicetree None None ✓ ✘ ✘ dhall ✘ dhall-l… None ✓ ✓ ✘ diff None None ✓ ✘ ✘ dockerfile ✘ docker-… None ✓ ✘ ✘ dot ✘ dot-lan… None ✓ ✘ ✘ dtd None None ✓ ✘ ✘ edoc None None ✓ ✘ ✘ eex None None ✓ ✘ ✘ ejs None None ✓ ✘ ✘ elixir ✘ elixir-… None ✓ ✓ ✓ elm ✘ elm-lan… None ✓ ✓ ✘ elvish ✘ elvish None ✓ ✘ ✘ env None None ✓ ✘ ✘ erb None None ✓ ✘ ✘ erlang ✘ erlang_… None ✓ ✓ ✘ esdl None None ✓ ✘ ✘ fish None None ✓ ✓ ✓ fortran ✘ fortls None ✓ ✘ ✓ gdscript None None ✓ ✓ ✓ git-attribu… None None ✓ ✘ ✘ git-commit None None ✓ ✓ ✘ git-config None None ✓ ✘ ✘ git-ignore None None ✓ ✘ ✘ git-rebase None None ✓ ✘ ✘ gleam ✘ gleam None ✓ ✓ ✘ glsl None None ✓ ✓ ✓ go ✘ gopls ✘ dlv ✓ ✓ ✓ godot-resou… None None ✓ ✘ ✘ gomod ✘ gopls None ✓ ✘ ✘ gotmpl ✘ gopls None ✓ ✘ ✘ gowork ✘ gopls None ✓ ✘ ✘ graphql None None ✓ ✘ ✘ hare None None ✓ ✘ ✘ haskell ✘ haskell… None ✓ ✓ ✘ hcl ✘ terrafo… None ✓ ✘ ✓ heex ✘ elixir-… None ✓ ✓ ✘ hosts None None ✓ ✘ ✘ html ✘ vscode-… None ✓ ✘ ✘ hurl None None ✓ ✘ ✓ idris ✘ idris2-… None ✘ ✘ ✘ iex None None ✓ ✘ ✘ ini None None ✓ ✘ ✘ java ✘ jdtls None ✓ ✓ ✘ javascript ✘ typescr… ✘ ✓ ✓ ✓ jsdoc None None ✓ ✘ ✘ json ✘ vscode-… None ✓ ✘ ✓ jsonnet ✘ jsonnet… None ✓ ✘ ✘ jsx ✘ typescr… None ✓ ✓ ✓ julia ✘ julia None ✓ ✓ ✓ just None None ✓ ✓ ✓ kdl None None ✓ ✘ ✘ kotlin ✘ kotlin-… None ✓ ✘ ✘ latex ✘ texlab None ✓ ✓ ✘ lean ✘ lean None ✓ ✘ ✘ ledger None None ✓ ✘ ✘ llvm None None ✓ ✓ ✓ llvm-mir None None ✓ ✓ ✓ llvm-mir-ya… None None ✓ ✘ ✓ lua ✘ lua-lan… None ✓ ✓ ✓ make None None ✓ ✘ ✘ markdoc ✘ markdoc… None ✓ ✘ ✘ markdown ✘ marksma… None ✓ ✘ ✘ markdown.in… None None ✓ ✘ ✘ matlab None None ✓ ✘ ✘ mermaid None None ✓ ✘ ✘ meson None None ✓ ✘ ✓ mint ✘ mint None ✘ ✘ ✘ msbuild None None ✓ ✘ ✓ nasm None None ✓ ✓ ✘ nickel ✘ nls None ✓ ✘ ✓ nim ✘ nimlang… None ✓ ✓ ✓ nix ✘ nil None ✓ ✘ ✘ nu None None ✓ ✘ ✘ ocaml ✘ ocamlls… None ✓ ✘ ✓ ocaml-inter… ✘ ocamlls… None ✓ ✘ ✘ odin ✘ ols None ✓ ✘ ✓ opencl ✘ clangd None ✓ ✓ ✓ openscad ✘ opensca… None ✓ ✘ ✘ org None None ✓ ✘ ✘ pascal ✘ pasls None ✓ ✓ ✘ passwd None None ✓ ✘ ✘ pem None None ✓ ✘ ✘ perl ✘ perlnav… None ✓ ✓ ✓ php ✘ intelep… None ✓ ✓ ✓ po None None ✓ ✓ ✘ ponylang None None ✓ ✓ ✓ prisma ✘ prisma-… None ✓ ✘ ✘ prolog ✘ swipl None ✘ ✘ ✘ protobuf None None ✓ ✘ ✓ prql None None ✓ ✘ ✘ purescript ✘ purescr… None ✓ ✘ ✘ python ✘ pylsp None ✓ ✓ ✓ qml ✘ qmlls None ✓ ✘ ✓ r ✘ R None ✓ ✘ ✘ racket ✘ racket None ✓ ✘ ✘ regex None None ✓ ✘ ✘ rego ✘ regols None ✓ ✘ ✘ rescript ✘ rescrip… None ✓ ✓ ✘ rmarkdown ✘ R None ✓ ✘ ✓ robot ✘ robotfr… None ✓ ✘ ✘ ron None None ✓ ✘ ✓ rst None None ✓ ✘ ✘ ruby ✘ solargr… None ✓ ✓ ✓ rust ✘ rust-an… ✘ lldb-vs… ✓ ✓ ✓ sage None None ✓ ✓ ✘ scala ✘ metals None ✓ ✘ ✓ scheme None None ✓ ✘ ✘ scss ✘ vscode-… None ✓ ✘ ✘ slint ✘ slint-l… None ✓ ✘ ✓ smithy ✘ cs None ✓ ✘ ✘ sml None None ✓ ✘ ✘ solidity ✘ solc None ✓ ✘ ✘ sql None None ✓ ✘ ✘ sshclientco… None None ✓ ✘ ✘ starlark None None ✓ ✓ ✘ svelte ✘ sveltes… None ✓ ✘ ✘ sway ✘ forc None ✓ ✓ ✓ swift ✘ sourcek… None ✓ ✘ ✘ tablegen None None ✓ ✓ ✓ task None None ✓ ✘ ✘ tfvars ✘ terrafo… None ✓ ✘ ✓ toml ✘ taplo None ✓ ✘ ✘ tsq None None ✓ ✘ ✘ tsx ✘ typescr… None ✓ ✓ ✓ twig None None ✓ ✘ ✘ typescript ✘ typescr… None ✓ ✓ ✓ ungrammar None None ✓ ✘ ✘ uxntal None None ✓ ✘ ✘ v ✘ v None ✓ ✓ ✓ vala ✘ vala-la… None ✓ ✘ ✘ verilog ✘ svlangs… None ✓ ✓ ✘ vhdl ✘ vhdl_ls… None ✓ ✘ ✘ vhs None None ✓ ✘ ✘ vue ✘ vls None ✓ ✘ ✘ wast None None ✓ ✘ ✘ wat None None ✓ ✘ ✘ wgsl ✘ wgsl_an… None ✓ ✘ ✘ wit None None ✓ ✘ ✓ xit None None ✓ ✘ ✘ xml None None ✓ ✘ ✓ yaml ✘ yaml-la… None ✓ ✘ ✓ yuck None None ✓ ✘ ✘ zig ✘ zls ✘ lldb-vs… ✓ ✓ ✓
9. Instalace LSP a dalších nástrojů pro zvolený programovací jazyk
Zkontrolujme si stav podpory pro nějaký programovací jazyk. V první polovině článku se zaměříme na Python:
$ hx --health |grep python python ✘ pylsp None ✓ ✓ ✓
Python je sice Helixem podporován, ovšem LSP pro něj nebyl nalezen, takže se ve skutečnosti plná podpora nevyužije. Zobrazit si můžeme i podrobnější informace:
$ hx --health python Configured language server: pylsp Binary for language server: 'pylsp' not found in $PATH Configured debug adapter: None Highlight queries: ✓ Textobject queries: ✓ Indent queries: ✓
Náprava tohoto stavu je ve skutečnosti snadná. Jméno LSP známe – zobrazil ho sám Helix, takže vyžadované LSP nainstalujeme. V případě Pythonu se instalace provede přes pip:
$ pip3 install --user pylsp
Průběh instalace:
Defaulting to user installation because normal site-packages is not writeable Collecting python-lsp-server Downloading python_lsp_server-1.7.3-py3-none-any.whl (68 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 69.0/69.0 KB 1.5 MB/s eta 0:00:00 Requirement already satisfied: jedi<0.19.0,>=0.17.2 in /home/user/.local/lib/python3.10/site-packages (from python-lsp-server) (0.18.1) Collecting docstring-to-markdownf): Downloading docstring_to_markdown-0.12-py3-none-any.whl (18 kB)nd self.b+self.c>self.a: Collecting python-lsp-jsonrpc>=1.0.0 Downloading python_lsp_jsonrpc-1.0.0-py3-none-any.whl (8.5 kB) Requirement already satisfied: setuptools>=39.0.0 in /usr/lib/python3.10/site-packages (from python-lsp-server) (57.4.0) Collecting ujson>=3.0.0 Downloading ujson-5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (53 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.9/53.9 KB 4.4 MB/s eta 0:00:00 Collecting pluggy>=1.0.0n True Downloading pluggy-1.2.0-py3-none-any.whl (17 kB) Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/user/.local/lib/python3.10/site-packages (from jedi<0.19.0,>=0.17.2->python-lsp-server) (0.8.3) Installing collected packages: ujson, pluggy, docstring-to-markdown, python-lsp-jsonrpc, python-lsp-server Successfully installed docstring-to-markdown-0.12 pluggy-1.2.0 python-lsp-jsonrpc-1.0.0 python-lsp-server-1.7.3 ujson-5.8.0
Navíc si nainstalujeme i podporu pro kontrolu typů, která je realizována nástrojem Mypy:
$ pip3 install --user pylsp-mypy Collecting pylsp-mypy Downloading pylsp_mypy-0.6.7-py3-none-any.whl (10 kB) Requirement already satisfied: mypy>=0.981 in /usr/lib/python3.10/site-packages (from pylsp-mypy) (0.982) Requirement already satisfied: tomli>=1.1.0 in /usr/lib/python3.10/site-packages (from pylsp-mypy) (1.2.3) Requirement already satisfied: python-lsp-server>=1.7.0 in /home/user/.local/lib/python3.10/site-packages (from pylsp-mypy) (1.7.3) Requirement already satisfied: typing_extensions>=3.10 in /usr/lib/python3.10/site-packages (from mypy>=0.981->pylsp-mypy) (3.10.0.2) Requirement already satisfied: mypy_extensions>=0.4.3 in /usr/lib/python3.10/site-packages (from mypy>=0.981->pylsp-mypy) (0.4.3) Requirement already satisfied: jedi<0.19.0,>=0.17.2 in /home/user/.local/lib/python3.10/site-packages (from python-lsp-server>=1.7.0->pylsp-mypy) (0.18.1) Requirement already satisfied: docstring-to-markdown in /home/user/.local/lib/python3.10/site-packages (from python-lsp-server>=1.7.0->pylsp-mypy) (0.12) Requirement already satisfied: ujson>=3.0.0 in /home/user/.local/lib/python3.10/site-packages (from python-lsp-server>=1.7.0->pylsp-mypy) (5.8.0) Requirement already satisfied: pluggy>=1.0.0 in /home/user/.local/lib/python3.10/site-packages (from python-lsp-server>=1.7.0->pylsp-mypy) (1.2.0) Requirement already satisfied: python-lsp-jsonrpc>=1.0.0 in /home/user/.local/lib/python3.10/site-packages (from python-lsp-server>=1.7.0->pylsp-mypy) (1.0.0) Requirement already satisfied: setuptools>=39.0.0 in /usr/lib/python3.10/site-packages (from python-lsp-server>=1.7.0->pylsp-mypy) (57.4.0) Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/user/.local/lib/python3.10/site-packages (from jedi<0.19.0,>=0.17.2->python-lsp-server>=1.7.0->pylsp-mypy) (0.8.3) Installing collected packages: pylsp-mypy Successfully installed pylsp-mypy-0.6.7
10. Konfigurace editoru a LSP
Konfigurace editoru Helix je uložena v adresáři ~/.config/helix/config.toml. Jak název tohoto souboru napovídá, je použit formát TOML, s nímž jsme se již na Rootu setkali. Výchozí konfigurace Helixu umožňuje konformní práci (proto tento soubor ani nemusí existovat), ovšem ukažme si, jak by mohlo vypadat například nastavení kurzorů pro různé režimy editoru:
[editor.cursor-shape] insert = "bar" normal = "block" select = "underline"
Nastavení editoru pro různé programovací jazyky je uloženo v tomtéž adresáři, ovšem v souboru s názvem languages.toml. Podívejme se, jak by mohlo vypadat nastavení pro Python, kde explicitně povolujeme kontrolu typů přes Mypy:
[[language]] name = "python" language-server = { command = "pylsp"} auto-format = true [language.config.pylsp.plugins] mypy = {enabled = true, live_mode = true, strict = true}
Je ovšem možná i odlišná konfigurace postavená nikoli na pylsp ale na pyright-langserver:
[[language]] name = "python" scope = "source.python" injection-regex = "python" file-types = ["py"] shebangs = ["python"] roots = ["pyproject.toml", "setup.py", "Poetry.lock"] comment-token = "#" language-server = { command = "pyright-langserver", args = ["--stdio"] } auto-format = false indent = { tab-width = 4, unit = " " } config = {}
11. Nové zjištění stavu LSP pro zvolený programovací jazyk
Poté, co byl nainstalován LSP pro námi zvolený programovací jazyk (v našem případě se jedná o Python), je vhodné zjistit, jestli textový editor Helix skutečné daný LSP dokáže najít a začít používat. Pro tento účel použijeme následující příkaz:
$ hx --health |grep python python ✓ pylsp None ✓ ✓ ✓
Podrobnější informace se zjistí příkazem:
$ hx --health python
Helix by nyní na konzoli (terminál) měl vypsat informace o tom, že podpora pro Python závisí na pylsp a v jakém adresáři byl tento server nalezen:
Configured language server: pylsp Binary for language server: /home/user/.local/bin/pylsp Configured debug adapter: None Highlight queries: ✓ Textobject queries: ✓ Indent queries: ✓
V případě, že na konzoli skutečně uvidíte podobnou zprávu, je velmi pravděpodobné, že všechny „programátorské“ funkce pro Python budou v Helixu již bez problémů dostupné.
12. Výběr souborů pro editaci
Nenápadným, ale velmi užitečným nástrojem programátora je dialog určený pro výběr souborů (včetně náhledu na ně), který se zobrazí například klávesovou zkratkou Ctrl+f nebo Ctrl+F. Tento dialog podporuje takzvaný fuzzy search, což konkrétně znamená, že seznam souborů je možné zúžit zápisem části jména souboru nebo pouze několika písmen, které se mají v názvu souboru objevit (a to nikoli striktně za sebou). To je chování umožňující rychlé vyhledání souboru bez nutnosti pracovat s regulárními výrazy nebo s globy. Navíc je vyhledávání rychlé i u projektů obsahujících stovky nebo dokonce tisíce souborů. Podívejme se na několik příkladů:
Obrázek 12: Přímý výběr souboru kurzorovými šipkami.
Obrázek 13: Rychlé vyhledávání v seznamu souborů (199 souborů z 8500 odpovídá zapsaným znakům).
Obrázek 14: Povšimněte si, že se nevyhledají pouze soubory s názvem „server.go“, ale například i jednotkové testy apod.
Obrázek 15: V pravé části se zobrazuje rychlý náhled na soubor, pochopitelně podporující zvýraznění syntaxe. Povšimněte si, že jsme narazili na limit 100000 souborů, ovšem dialog je stále velmi rychlý.
13. Funkce poskytované LSP
Prakticky všechny funkce poskytované přes protokol LSP jsou v Helixu dostupné. Týká se to zejména automatického doplnění názvu metody nebo funkce (ve Vimu omnicompletion, komerční produkty mají pro tuto vlastnost jiné názvy):
Obrázek 16: Automatické doplnění názvu metody pro zvolený objekt (resp. strukturu v Go).
Taktéž se zcela automaticky zobrazuje nápověda k zapisovaným funkcím, metodám a datovým typům. A pochopitelně se zobrazí i chyby vztahující se k aktuálně editovanému kódu (vše je přitom velmi rychlé – žádné čekání na překreslení okna atd.):
Obrázek 17: Zobrazení nápovědy k volané metodě + zobrazení informace o chybě (nemáme zadány všechny očekávané parametry).
Pokud LSP podporuje refaktoring nebo alespoň přejmenování identifikátorů (funkcí, metod, proměnných, parametrů), opět se jedná o funkcionalitu, která je Helixem podporována (nejedná se tedy o klasické „hloupé“ search&replace). Užitečná je i zkratka gd, která provede skok na definici funkce, metody, třídy nebo datové struktury.
14. Kontrola chyb ve zdrojových kódech
Díky podpoře LSP dokáže Helix zvýraznit chyby nalezené ve zdrojových kódech vyvíjené aplikace. Protože výchozím front-endem Helixu je textový terminál, není zvýraznění chyb realizováno s využitím grafických efektů, ale pouze obarvenými Unicode znaky (což podle mého názoru plně dostačuje). Ostatně nejlépe bude vše patrné při pohledu na screenshoty:
Obrázek 18: Zvýraznění chyb nalezených nástrojem Mypy. Chybný řádek je označen na levém pravítku (gutter) a navíc je chyba či chyby podtrženy (což je vlastnost, kterou mají textové terminály prakticky odjakživa, nyní však byla tato vlastnost vylepšena).
Obrázek 19: Příkazem Space+d si můžeme všechny chyby nechat vypsat v samostatném okně.
Obrázek 20: Při najetí na chybu se zobrazí „tooltip“ (červený text) s popisem této konkrétní chyby.
15. Hlavní menu editoru Helix
Helix jako modální textový editor podporuje relativně velké množství režimů (módů). Ty se rozdělují na hlavní režimy a podrežimy. 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. Jeden důležitý podrežim se nazývá space, protože je vyvolán klávesovou zkratkou Space (podobně jako ve SpaceVimu atd.). Tento režim vlastně nabízí hlavní menu Helixu, protože nám nabízí přepnutí do dalších (pod)režimů, jak je to ostatně patrné i při pohledu na screenshot:
Obrázek 21: Výběrové menu, které je možné považovat za hlavní menu editoru Helix.
Tento podrežim uživatelé vyvolávají často, ale většinou ihned následuje další příkaz, například Space+d, Space+f atd. Je to umožněno velmi rychlým zobrazením nabídky.
16. Menu pro výběr skoků
Po zadání prefixu g (mnemotechnická zkratka od goto) je možné 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é (jejich zkratky i význam jsou mnohdy logičtější):
# | 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 |
Obrázek 22: Kontextové menu vedlejšího režimu goto.
17. Využití debuggeru ovládaného přes DAP (Debug Adapter Protocol)
Velmi užitečná, ovšem v současnosti poněkud omezená, je podpora pro DAP neboli Debug Adapter Protocol. Podobně jako v případě LSP se jedná o technologii umožňující propojení textového editoru či integrovaného vývojového prostředí s debuggerem (LSP realizuje propojení s analyzátorem kódu). Pro Python je prozatím podpora problematická, ale pro programovací jazyk Rust či Go pracuje spolehlivě. Podívejme se například na stav Helixu v případě, že je nainstalován debugger Delve určený pro jazyk Go:
$ hx --health go Configured language server: gopls Binary for language server: /home/ptisnovs/go/bin/gopls Configured debug adapter: dlv Binary for debug adapter: /home/ptisnovs/go/bin/dlv Highlight queries: ✓ Textobject queries: ✓ Indent queries: ✓
V tomto případě můžeme z Helixu otevřít kontextové menu pro připojení a ovládání debuggeru. Příslušnou klávesovou zkratkou je Space+g. Z kontextového menu je možné debugger spustit, připojit k němu editovaný zdrojový kód, nechat si zobrazit obsahy proměnných a samozřejmě i nastavovat breakpointy, krokovat kódem atd. atd.:
Obrázek 23: Spuštění debuggeru a zobrazení lokálních proměnných. Žlutá tečka označuje breakpoint nastavený na řádku číslo 6.
Obrázek 24: Krokování laděným kódem se zobrazením obsahu lokálních proměnných.
Obrázek 25: Krokování laděným kódem se zobrazením obsahu lokálních proměnných.
18. Závěrečné subjektivní zhodnocení
V této kapitole se pokusím o čistě subjektivní zhodnocení editoru Helix, a to z pohledu dlouhodobého spokojeného uživatele textového editoru Vim (je to až neuvěřitelné, ale první změna v mém .vimrc se datuje do roku 2001). Helix lze, na rozdíl od Vimu, prakticky začít používat už po jeho instalaci, a to bez nutnosti dalších úprav (ty lze provést, ale není to většinou zapotřebí). Taktéž je patrná rychlost všech operací v Helixu oproti Vimu (ještě více je to patrné u SpaceVimu); týká se to jak zvýraznění syntaxe, tak i například rychlosti vyhledávání souborů atd. Vyzdvihnout je taktéž možné prakticky bezproblémovou podporu LSP a DAP a logické klávesové zkratky (založené na výběru+příkaz a nikoli příkaz+posun kurzoru), což sice skalní Vimisté neocení, ale uživatelé, kteří se chtějí seznámit s modálními textovými editory už pravděpodobně ano. Ovšem v současnosti neposkytuje Helix všechny požadované vlastnosti (spell checker), což omezuje možnosti jeho použití při psaní dokumentů.
Obrázek 26: Tutoriál dodávaný společně s Helixem.
19. Příloha: nastavení xtermu pro Helix
Jen pro zajímavost si ukažme, jak se nastaví emulátor terminálu xterm tak, aby Helix rozeznal, že tento terminál podporuje plné barvy. Před spuštěním Helixu je zapotřebí nastavit následující dvě proměnné prostředí:
$ export COLORTERM=24bit $ export TERM=xterm-256color
Výsledek by měl vypadat následovně (samozřejmě se bude lišit, pokud si zvolíte jiné barvové téma):
20. Odkazy na Internetu
- Helix: nový modální textový editor inspirovaný Vimem a Kakoune
https://www.root.cz/clanky/helix-novy-modalni-textovy-editor-inspirovany-vimem-a-kakoune/ - 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 - How to install the default language servers
https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers - Taking a look at the Helix editor (Nov 5th, 2022)
https://www.youtube.com/watch?v=8L308PdmhMY - Helix – the Rust Powered Development Environment
https://www.youtube.com/watch?v=xHebvTGOdH8 - Python LSP setups for productive coding
https://www.reddit.com/r/HelixEditor/comments/13wpa72/python_lsp_setups_for_productive_coding/ - Helix documentation: Configuration
https://docs.helix-editor.com/configuration.html - Helix documentation: Languages
https://docs.helix-editor.com/master/languages.html - Looking to try Helix. How is support for Python?
https://www.reddit.com/r/HelixEditor/comments/119mhch/looking_to_try_helix_how_is_support_for_python/ - Python LSP Server (GitHub)
https://github.com/python-lsp/python-lsp-server#configuration - (dot file): Helix
https://github.com/gerlacdt/dotfiles/blob/e50ea089dbfd5e71e2cb6c10abfde305bf4a5b6e/helix/.config/helix/languages.toml#L2 - 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 - tree-sitter
https://github.com/tree-sitter/tree-sitter - Introduction: tree-siter
https://tree-sitter.github.io/tree-sitter/ - tree-siter: Queries
https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries - Textový editor Vim jako IDE
https://www.root.cz/clanky/textovy-editor-vim-jako-ide/ - Textový editor Vim jako IDE (2.část)
https://www.root.cz/clanky/textovy-editor-vim-jako-ide-2-cast/ - Textový editor Vim jako IDE (3.část)
https://www.root.cz/clanky/textovy-editor-vim-jako-ide-3-cast/ - Textový editor Vim jako IDE (4.část)
https://www.root.cz/clanky/textovy-editor-vim-jako-ide-4-cast/ - Textový editor Vim jako IDE (5.část)
https://www.root.cz/clanky/textovy-editor-vim-jako-ide-5-cast/ - A Comprehensive Introduction to Tree-sitter
https://derek.stride.host/posts/comprehensive-introduction-to-tree-sitter - Guide to your first Tree-sitter grammar
https://gist.github.com/Aerijo/df27228d70c633e088b0591b8857eeef - LR parser (Wikipedia)
https://en.wikipedia.org/wiki/LR_parser - GLR Parser (Wikipedia)
https://en.wikipedia.org/wiki/GLR_parser