Textový editor Helix ve funkci vývojového prostředí

27. 6. 2023
Doba čtení: 31 minut

Sdílet

 Autor: Pavel Tišnovský
S (post)moderním modálním textovým editorem Helix jsme se již na stránkách Roota seznámili. V praxi se ukazuje, že kombinace inkrementálního parseru, LSP a DAP společně s logicky navrženými klávesovými zkratkami je velmi silná.

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

5. GLR parser v Helixu

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

10. Konfigurace editoru a LSP

11. Nové zjištění stavu LSP pro zvolený programovací jazyk

12. Výběr souborů pro editaci

13. Funkce poskytované LSP

14. Kontrola chyb ve zdrojových kódech

15. Hlavní menu editoru Helix

16. Menu pro výběr skoků

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

20. Odkazy na Internetu

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:

  1. 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.).
  2. 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.
  3. 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.
  4. 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.
  5. Podpora debuggerů pro vybrané programovací jazyky.
  6. Mnoho zkratek editoru je určeno pro práci se syntaxí jazyka (doskoky na definici funkce, datového typu apod.).
  7. 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).
Poznámka: mnoho těchto technologií lze použít i ve Vimu, ovšem až po úpravě jeho konfigurace a po instalaci doplňujících modulů. Naproti tomu v Helixu jsou tyto možnosti dostupné již ihned po jeho instalaci.

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 "//.*"
Poznámka: na jednu stranu je definice syntaxe ve Vimu relativně snadná, ovšem má i mnoho záporných vlastností – Vim „nezná“ celou strukturu souboru, rozpoznání syntaxe je mnohdy velmi pomalé (řádově i zlomky sekund až sekundy), typicky jsou problémy s delšími regiony (omezení kvůli rychlosti, resp. pomalosti rozeznávání syntaxe) a v některých případech se Vim „nevzpamatuje“, pokud v textu chybí nějaký ukončovací znak – poté je celý zbytek souboru označen nekorektně.

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.

Poznámka: tree-sitter je použit i v dalších editorech, například i v NeoVimu.

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]
Poznámka: jednotlivé gramatiky jsou v Helixu již přeloženy do nativního kódu. Z cca 130 megabajtové instalace tvoří právě tyto soubory největší objem. Například gramatika pro Python zabírá 394 kB:
$ 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é.

Poznámka: podpora pro debugger není nainstalována; k tomuto problému se ovšem ještě vrátíme.

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
Poznámka: zejména jsou užitečné příkazy 11–14, které využívají možností LSP a tedy dokážou skákat na definice atd. Tyto příkazy se používají prakticky pořád při úpravách kódu (skoky fungují i dovnitř nainstalovaných knihoven a lze se tedy například podívat na definice knihovních funkcí).

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.

Poznámka: jak se bude podpora DAP zlepšovat, tak se bude postupně zaplňovat i tabulka, kterou jsme viděli v osmé kapitole.

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.

ict ve školství 24

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):

Poznámka: většina moderních terminálů nastavuje obě proměnné prostředí automaticky, xterm však nemusí.

20. Odkazy na Internetu

  1. Helix: nový modální textový editor inspirovaný Vimem a Kakoune
    https://www.root.cz/clanky/helix-novy-modalni-textovy-editor-inspirovany-vimem-a-kakoune/
  2. Představení Helixu
    https://helix-editor.com/
  3. Helix: A post-modern modal text editor
    https://githubplus.com/helix-editor/helix
  4. Helix na GitHubu
    https://github.com/helix-editor/helix
  5. Helix: dokumentace
    https://docs.helix-editor.com/
  6. Helix: troubleshooting
    https://github.com/helix-editor/helix/wiki/Troubleshooting
  7. Klávesové zkratky Helixu
    https://docs.helix-editor.com/keymap.html
  8. How to install the default language servers
    https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers
  9. Taking a look at the Helix editor (Nov 5th, 2022)
    https://www.youtube.com/wat­ch?v=8L308PdmhMY
  10. Helix – the Rust Powered Development Environment
    https://www.youtube.com/wat­ch?v=xHebvTGOdH8
  11. Python LSP setups for productive coding
    https://www.reddit.com/r/He­lixEditor/comments/13wpa72/pyt­hon_lsp_setups_for_produc­tive_coding/
  12. Helix documentation: Configuration
    https://docs.helix-editor.com/configuration.html
  13. Helix documentation: Languages
    https://docs.helix-editor.com/master/languages.html
  14. Looking to try Helix. How is support for Python?
    https://www.reddit.com/r/He­lixEditor/comments/119mhch/lo­oking_to_try_helix_how_is_sup­port_for_python/
  15. Python LSP Server (GitHub)
    https://github.com/python-lsp/python-lsp-server#configuration
  16. (dot file): Helix
    https://github.com/gerlac­dt/dotfiles/blob/e50ea089dbfd5e71e2cb6c10ab­fde305bf4a5b6e/helix/.con­fig/helix/languages.toml#L2
  17. gopls
    https://www.getman.io/posts/gopls/
  18. Kakoune: A Better Code Editor Heavily Inspired by Vim
    https://www.tecmint.com/kakoune-better-code-editor-for-linux/
  19. Kakoune demo
    https://vimeo.com/82711574
  20. 6 Best Vi/Vim-Inspired Code Editors for Linux
    https://www.tecmint.com/vi-vim-inspired-code-editors-for-linux/
  21. Why Kakoune — The quest for a better code editor
    https://kakoune.org/why-kakoune/why-kakoune.html
  22. Kakoune design
    https://github.com/mawww/ka­koune/blob/master/doc/desig­n.asciidoc
  23. Kakoune (modální textový editor)
    http://kakoune.org/
  24. Kakoune: Selections
    https://github.com/mawww/ka­koune/wiki/Selections
  25. Migrating from Vim
    https://github.com/mawww/ka­koune/wiki/Migrating-from-Vim
  26. kakoune-vertical-selections
    https://github.com/occivink/kakoune-vertical-selection
  27. Langserver.org
    https://langserver.org/
  28. Language Server Protocol
    https://microsoft.github.io/language-server-protocol/
  29. Language Server Protocol Specification
    https://microsoft.github.io/language-server-protocol/specification
  30. Implementations Language Servers
    https://microsoft.github.io/language-server-protocol/implementors/servers
  31. JSON-RPC 2.0 Specification
    https://www.jsonrpc.org/specification
  32. Why You Should Know the Language Server Protocol
    https://tomassetti.me/what-is-the-language-server-protocol/
  33. Language Server Protocol: A Language Server For DOT With Visual Studio Code
    https://tomassetti.me/language-server-dot-visual-studio/
  34. Python Language Server
    https://github.com/palantir/python-language-server
  35. Jedi – an awesome autocompletion/static analysis library for Python
    https://github.com/davidhalter/jedi
  36. What is lsp
    https://www.reddit.com/r/vim/com­ments/7lnhrt/which_lsp_plu­gin_should_i_use/
  37. Evil (Emacs Wiki)
    https://www.emacswiki.org/emacs/Evil
  38. Evil (na GitHubu)
    https://github.com/emacs-evil/evil
  39. Evil (na stránkách repositáře MELPA)
    https://melpa.org/#/evil
  40. 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
  41. Vrapper aneb spojení možností Vimu a Eclipse
    https://mojefedora.cz/vrapper-aneb-spojeni-moznosti-vimu-a-eclipse/
  42. 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/
  43. Emacs/Evil-mode – A basic reference to using evil mode in Emacs
    http://www.aakarshnair.com/posts/emacs-evil-mode-cheatsheet
  44. From Vim to Emacs+Evil chaotic migration guide
    https://juanjoalvarez.net/es/de­tail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/
  45. Introduction to evil-mode {video)
    https://www.youtube.com/wat­ch?v=PeVQwYUxYEg
  46. Vim-style keybinding in Emacs/Evil-mode
    https://gist.github.com/tro­yp/6b4c9e1c8670200c04c16036805773d8
  47. Evil-surround
    https://github.com/emacs-evil/evil-surround
  48. Spacemacs
    http://spacemacs.org/
  49. Neovim: literally the future of vim
    https://neovim.io/
  50. AMP – A Vi/Vim Inspired Text Editor for Linux Terminal
    https://www.tecmint.com/amp-vi-vim-inspired-text-editor-for-linux/
  51. Amp: A text editor for your terminal
    https://github.com/jmacdonald/amp
  52. Stránky projektu Amp.rs
    https://amp.rs/
  53. Dokumentace k editoru Amp
    https://amp.rs/docs/
  54. Vis: a vi-like editor based on Plan 9's structural regular expressions
    https://github.com/martanne/vis
  55. Very opinionated Node.JS VI clone
    https://github.com/mikesmullin/nvi
  56. PyVim: Pure Python Vim clone
    https://github.com/prompt-toolkit/pyvim
  57. pyvim 2.0.24 na PyPi
    https://pypi.org/project/pyvim/
  58. vim2elvis (1)
    https://www.root.cz/clanky/vim2elvis-1/
  59. vim2elvis (2)
    https://www.root.cz/clanky/vim2elvis-2/
  60. Seriál Textový editor Vim jako IDE
    https://www.root.cz/serialy/textovy-editor-vim-jako-ide/
  61. Obsah Rootu označený nálepkou Vim
    https://www.root.cz/n/vim/
  62. Atom: moderní textový editor
    https://www.root.cz/clanky/atom-moderni-textovy-editor/
  63. Atom: moderní textový editor (dokončení)
    https://www.root.cz/clanky/atom-moderni-textovy-editor-dokonceni/
  64. Why I switched to VIM from Visual Studio Code
    https://freshman.tech/from-vscode-to-vim/
  65. VSCodeVim
    https://marketplace.visual­studio.com/items?itemName=vsco­devim.vim
  66. VSCodeVim/Vim na GitHubu
    https://github.com/VSCodeVim/Vim
  67. How Vim killed Atom and VSCode on my Machine
    https://medium.com/@aswinmohanme/how-vim-killed-atom-and-vscode-723a68ad59dc
  68. tree-sitter
    https://github.com/tree-sitter/tree-sitter
  69. Introduction: tree-siter
    https://tree-sitter.github.io/tree-sitter/
  70. tree-siter: Queries
    https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries
  71. Textový editor Vim jako IDE
    https://www.root.cz/clanky/textovy-editor-vim-jako-ide/
  72. Textový editor Vim jako IDE (2.část)
    https://www.root.cz/clanky/textovy-editor-vim-jako-ide-2-cast/
  73. Textový editor Vim jako IDE (3.část)
    https://www.root.cz/clanky/textovy-editor-vim-jako-ide-3-cast/
  74. Textový editor Vim jako IDE (4.část)
    https://www.root.cz/clanky/textovy-editor-vim-jako-ide-4-cast/
  75. Textový editor Vim jako IDE (5.část)
    https://www.root.cz/clanky/textovy-editor-vim-jako-ide-5-cast/
  76. A Comprehensive Introduction to Tree-sitter
    https://derek.stride.host/pos­ts/comprehensive-introduction-to-tree-sitter
  77. Guide to your first Tree-sitter grammar
    https://gist.github.com/A­erijo/df27228d70c633e088b05­91b8857eeef
  78. LR parser (Wikipedia)
    https://en.wikipedia.org/wi­ki/LR_parser
  79. GLR Parser (Wikipedia)
    https://en.wikipedia.org/wi­ki/GLR_parser

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.