Hlavní navigace

Projekt SpaceVim – moderní distribuce Vimu inspirovaná Spacemacsem

9. 9. 2021
Doba čtení: 26 minut

Sdílet

 Autor: Pavel Tišnovský
Na několik článků o Spacemacsu a taktéž o Doom Emacsu dnes navážeme pohledem na druhou stranu pomyslné barikády. Popíšeme si totiž projekt SpaceVim, který byl sice inspirován Spacemacsem, ovšem je kompletně postaven na Vimu.

Obsah

1. Textový editor Vim

2. Projekt SpaceVim

3. Instalace SpaceVimu

4. První spuštění SpaceVimu

5. Modální ovládání Vimu, alternativa představená SpaceVimem

6. Hlavní menu SpaceVimu a jeho podmenu

7. Příkazy dostupné v hlavním menu SpaceVimu

8. Další podmenu SpaceVimu

9. Práce se soubory

10. Práce s okny editoru

11. Modifikace informací zobrazených na stavové řádce

12. Informace o vedlejším režimu

13. Vlastní klávesové zkratky

14. Vrstvy – cesta k udržitelné konfiguraci Vimu

15. Pluginy používané SpaceVimem

16. Stručný popis některých použitých pluginů

17. Konfigurační soubor SpaceVimu

18. Modifikace konfiguračního souboru

19. Odkazy na relevantní články na Rootu

20. Odkazy na Internetu

1. Textový editor Vim

Jak jsem se již zmínil v perexu dnešního článku, čtenáři se mohli s textovým editorem Vim na stránkách Rootu setkat již nesčetněkrát. Většinou jsme se však zabývali těmi vlastnostmi Vimu, které jsou užitečné pro vývojáře popř. pro administrátory, tj. tím, jak lze Vim používat pro úpravu silně strukturovaných dokumentů (zdrojových kódů, konfiguračních souborů, dokumentů vytvořených ve značkovacích jazycích aj.). Příkladem takového přístupu může být například seriál Textový editor Vim jako IDE (který byl zaměřen na původní Vim, nikoli Neovim). O Vimu se sice běžně mluví jako o programátorském textovém editoru, ovšem ve skutečnosti jsou jeho praktické možnosti mnohem větší; dokonce pro něj vzniká i (dnes ještě nedokonalá, ale přesto existující) alternativa k org-mode.

Obrázek 1: Příklad pluginu pro standardní textový editor Vim, který z tohoto editoru vytvoří užitečný diář.

Značná konfigurovatelnost Vimu a současně i velký počet pluginů, které pro Vim postupem času vznikly, je ovšem dvojsečná zbraň. Pro zkušeného uživatele může být relativně snadné si Vim nakonfigurovat popř. si vybrat sadu pluginů, které mu vyhovuje, ovšem začátečníci či uživatelé, kteří se spíše potřebují soustředit na vlastní práci, by s velkou pravděpodobností uvítali předpřipravenou a otestovanou konfiguraci Vimu, ideálně nastavenou takovým způsobem, aby vyhovovala jak začátečníkům, tak i „power userům“. A právě tento požadavek je do značné míry splněn projektem nazvaným SpaceVim, jímž se budeme zabývat v dnešním článku.

Obrázek 2: Ukázka textového editoru Vim s pluginy, které se snaží napodobit funkcionalitu org mode z Emacsu.

2. Projekt SpaceVim

Jak jsme si již řekli v úvodní kapitole, popíšeme si v dnešním článku potenciálně velmi zajímavý projekt nazvaný příhodně SpaceVim. Jedná se o projekt inspirovaný jiným projektem (resp. přesněji řečeno dokonce dvěma projekty), kterými jsme se již na stránkách Roota zabývali – jedná se konkrétně o Spacemacs [1] [2] a taktéž o Doom Emacs [3]. Připomeňme si ve stručnosti, že jak Spacemacs, tak i Doom Emacs jsou projekty postavené nad klasickým Emacsem, jejichž cílem je zajistit funkční, snadno ovladatelné a do jisté míry i snadno konfigurovatelné prostředí, které je vhodné i pro začátečníky (a to včetně nastavení Org mode, souborového manažeru, balíčků pro vývoj ve vybraných programovacích jazycích atd.). V případě Spacemacsu a do ještě větší míry i Doom Emacsu se tento cíl, alespoň podle mého názoru, podařilo splnit, takže například v Doom Emacsu lze začít editovat texty, programovat, měnit konfiguraci atd. již po jeho instalaci a se znalostí prakticky jediné klávesové zkratky (navíc velmi jednoduché a snadno dostupné – stisku mezerníku).

Obrázek 3: Projekt Spacemacs, s nímž jsme se již na stránkách Roota setkali.

Vraťme se však k projektu SpaceVim, jímž se budeme zabývat dnes. Tento projekt si staví podobné cíle, jako je tomu v případě Spacemacsu a Doom Emacsu – tedy připravit takové prostředí, které je vhodné a použitelné i pro začátečníky, kteří nemusí zkoumat, jak se textový editor konfiguruje, jaké si má naistalovat pluginy, nemusí dokonce ani znát všechny původní zkratky a příkazy Vimu atd. Tento výběr pluginů a konfigurace, která již byla provedena autorem SpaceVimu (včetně dnes populárního tmavého tématu), sice nemusí na sto procent vyhovovat všem uživatelům, ovšem i změny v konfiguraci jsou možné a relativně snadné (editují se totiž konfigurační soubory ve formátu TOML (Tom's Obvious Minimal Language) a nikoli mnohdy poněkud kryptické skripty napsané ve Vim Scriptu). Projekt SpaceVim by tedy mohl přitáhnout k Vimu nové uživatele.

Obrázek 4: Doom Emacs po spuštění. Zde je již jasně vidět inspirace slavnou hrou Doom.

Poznámka: je ovšem jasné, že každý uživatel má jiné nároky na to, jak se má jím vybraný textový editor chovat. Například použití pluginu vim-smoothie pro zajištění plynulého scrollingu při posunech v textu je sice efektní, ale (alespoň pro autora článku) spíše zpomalující, takže je ho vhodné ve SpaceVimu vypnout. Taktéž výchozí barevné schéma zobrazuje kurzor ve vkládacím režimu zcela nekontrastním barvovým odstínem. Ovšem všechny tyto nedostatky lze změnit v konfiguračních souborech, a to relativně jednoduchým způsobem (některé lze dokonce změnit přímo z menu editoru).
Poznámka k VimScriptu: samotný SpaceVim sice pochopitelně využívá VimScript (přibližně 90 procent kódu je psáno ve VimScriptu, což je ovšem zavádějící, protože se to týká i definice syntaxe atd.), ovšem některé jeho části jsou naprogramovány v jazyku Lua, kterým jsme se na stránkách Roota taktéž již zabývali.

Obrázek 5: Nápověda k Doom Emacsu napsaná přímo v Org mode.

3. Instalace SpaceVimu

Instalace SpaceVimu je snadná, ovšem SpaceVim vyžaduje ke své činnosti několik programů, které již musí být dopředu nainstalovány. V první řadě je nutné mít nainstalován git (řádkový klient) a pochopitelně je vyžadována i instalace Vimu popř. NeoVimu – obě tyto závislosti jsou v instalačním skriptu pochopitelně testovány.

Samotný instalační skript je možné stáhnout a ihned spustit zadáním tohoto příkazu (pokud pochopitelně věříte skriptům staženým z Internetu – což byste ovšem obecně neměli):

$ curl -sLf https://spacevim.org/install.sh | bash
Poznámka: pochopitelně je možné si přes curl skript nejdříve stáhnout, prozkoumat ho a teprve poté spustit.

Nejprve se zobrazí úvodní informace i s verzí SpaceVimu:

        /######                                     /##    /##/##
       /##__  ##                                   | ##   | #|__/
      | ##  \__/ /######  /######  /####### /######| ##   | ##/##/######/####
      |  ###### /##__  ##|____  ##/##_____//##__  #|  ## / ##| #| ##_  ##_  ##
       \____  #| ##  \ ## /######| ##     | ########\  ## ##/| #| ## \ ## \ ##
       /##  \ #| ##  | ##/##__  #| ##     | ##_____/ \  ###/ | #| ## | ## | ##
      |  ######| #######|  ######|  ######|  #######  \  #/  | #| ## | ## | ##
       \______/| ##____/ \_______/\_______/\_______/   \_/   |__|__/ |__/ |__/
               | ##
               | ##
               |__/
                      version : 1.8.0-dev      by : spacevim.org

Dále se přes git naklonuje repositář se SpaceVimem:

[➭] Trying to clone SpaceVim
 
Cloning into '/home/tester/.SpaceVim'...
remote: Enumerating objects: 39775, done.
remote: Counting objects: 100% (228/228), done.
remote: Compressing objects: 100% (196/196), done.
remote: Total 39775 (delta 103), reused 66 (delta 30), pack-reused 39547
Receiving objects: 100% (39775/39775), 20.73 MiB | 4.96 MiB/s, done.
Resolving deltas: 100% (27732/27732), done.
[✔] Successfully clone SpaceVim

Provede se instalace SpaceVimu pro každý nalezený kompatibilní textový editor:

[✔] Installed SpaceVim for vim
[✔] Installed SpaceVim for neovim

V dalším kroku se nainstaluje plugin dein používaný pro správu dalších balíčků:

[➭] Install dein.vim
Cloning into '/home/tester/.cache/vimfiles/repos/github.com/Shougo/dein.vim'...
remote: Enumerating objects: 6489, done.
remote: Counting objects: 100% (567/567), done.
remote: Compressing objects: 100% (351/351), done.
remote: Total 6489 (delta 317), reused 418 (delta 185), pack-reused 5922
Receiving objects: 100% (6489/6489), 1.26 MiB | 3.41 MiB/s, done.
Resolving deltas: 100% (3685/3685), done.
 
[✔] dein.vim installation done

Nainstalují se taktéž fonty používané Gvimem/Kvimem nebo vybratelné v konfiguraci terminálu:

[➭] Downloading DejaVu Sans Mono Bold Oblique for Powerline.ttf
[✔] Downloaded DejaVu Sans Mono Bold Oblique for Powerline.ttf
[➭] Downloading DejaVu Sans Mono Bold for Powerline.ttf
[✔] Downloaded DejaVu Sans Mono Bold for Powerline.ttf
[➭] Downloading DejaVu Sans Mono Oblique for Powerline.ttf
[✔] Downloaded DejaVu Sans Mono Oblique for Powerline.ttf
[➭] Downloading DejaVu Sans Mono for Powerline.ttf
[✔] Downloaded DejaVu Sans Mono for Powerline.ttf
[➭] Downloading DroidSansMonoForPowerlinePlusNerdFileTypesMono.otf
[✔] Downloaded DroidSansMonoForPowerlinePlusNerdFileTypesMono.otf
[➭] Downloading Ubuntu Mono derivative Powerline Nerd Font Complete.ttf
[✔] Downloaded Ubuntu Mono derivative Powerline Nerd Font Complete.ttf
[➭] Downloading WEBDINGS.TTF
[✔] Downloaded WEBDINGS.TTF
[➭] Downloading WINGDNG2.ttf
[✔] Downloaded WINGDNG2.ttf
[➭] Downloading WINGDNG3.ttf
[✔] Downloaded WINGDNG3.ttf
[➭] Downloading devicons.ttf
[✔] Downloaded devicons.ttf
[➭] Downloading mtextra.ttf
[✔] Downloaded mtextra.ttf
[➭] Downloading symbol.ttf
[✔] Downloaded symbol.ttf
[➭] Downloading wingding.ttf
[✔] Downloaded wingding.ttf
[➭] Updating font cache, please wait ...
[✔] font cache done!

A to je vše:

Almost done!
==============================================================================
==    Open Vim or Neovim and it will install the plugins automatically      ==
==============================================================================
 
That's it. Thanks for installing SpaceVim. Enjoy!

Obrázek 6: První část instalace v konzoli/terminálu.

Obrázek 7: Druhá část instalace v konzoli/terminálu.

Obrázek 8: Některé části instalace se dokončí později po spuštění Vimu.

Poznámka: vaše původní konfigurace Vimu zůstane zachována, pouze dojde k přejmenování souboru .vimrc i celého adresáře .vim. Lze tedy mít vedle sebe jak klasický Vim, tak i SpaceVim – a budou pracovat zcela odděleně.

4. První spuštění SpaceVimu

SpaceVim, podobně jako jeho ideový vzor Spacemacs obsahuje úvodní obrazovku, která zjednodušuje orientaci novým uživatelům. Podobnou obrazovku nalezneme i ve SpaceVimu – viz též následující dva screenshoty. Můžeme zde vidět nejužitečnější příkazy – vytvoření nového bufferu (tedy souboru), dále přístup k dříve otevřeným souborům, a možnost přímého ukončení SpaceVimu – nyní tedy tato diskuse s 2,4 miliony shlédnutí již není potřebná :-)

Obrázek 9: Úvodní stránka SpaceVimu.

V pravém okně se nachází průzkumník, tedy plugin umožňující zobrazení a procházení obsahem jednotlivých adresářů a otevírání souborů v nich uložených.

Obrázek 10: Alternativní zobrazení úvodní stránky SpaceVimu.

5. Modální ovládání Vimu, alternativa představená SpaceVimem

Textový editor Vim je založen na použití většího množství módů, mezi nimiž se uživatel musí explicitně přepínat. Zkráceně toto chování označujeme termínem „modální editor“. Modální ovládání ve skutečnosti není žádná žhavá novinka, protože bylo použito již v původním editoru Vi (viz též například článek o historii vzniku Vi). Toto chování bylo prakticky beze změny převzato Vimem, ale například i moderním editorem Kakoune. Modální ovládání má své nesporné výhody, ovšem taktéž některé nevýhody. Především je nutné se ho naučit a taktéž množství dostupných klávesových zkratek (pro další pluginy) je omezené, protože většina jednopísmenných příkazů je obsazena již samotným Vimem a další rozšiřování mnohdy vede ke kolizím. První problém je do určité míry řešen menu, které lze zobrazit jak v GVimu a KVimu (Vim běžící s plnohodnotným grafickým uživatelským rozhraním), tak i ve Vimu, který běží v terminálu (konzoli), viz též :help console-menus, popř. https://vimhelp.org/gu­i.txt.html#console-menus.

Obrázek 11: Režimy standardního Vimu a způsob přechodu mezi nimi s využitím různých klávesových zkratek.

Ovšem klasická menu mají několik nepříjemných vlastností, které souvisí s tím, že vyvolání nějakého příkazu přes menu (což je činnost prováděná začátečníkem popř. znalým uživatelem pro méně často prováděné operace) je odlišné od případné klávesové zkratky.

Obrázek 12: V Notepadu se příkaz Paste vyvolává dvěma zcela odlišnými cestami. Buď stiskem Ctrl+V nebo přes menu posloupností kláves Alt+E P popř. F10 E P.

Poznámka: ve skutečnosti je do větší či menší míry modální prakticky každý textový editor, protože například již jen stisk klávesy Shift v tak jednoduchém (až primitivním) editoru, jakým je Notepad, vlastně provádí přepnutí do režimu výběru textu a následný stisk nějaké alfanumerické klávesy má odlišný význam.

6. Hlavní menu SpaceVimu a jeho podmenu

Hlavní menu SpaceVimu je zobrazeno, jak jsme se již ostatně dozvěděli v předchozích kapitolách, po stisku klávesy Space, a to až po uplynutí určitého časového intervalu (pokud totiž za mezerníkem ihned stisknete další klávesu či klávesy, provede se uživatelem zapsaný příkaz ihned). V hlavním menu se nachází jak přímé příkazy, které se ihned po svém výběru provedou (například přechod do jednoho z devíti oken), ale taktéž příkazy, které vyvolají další podmenu. I zobrazení těchto podmenu je řízeno stejnými pravidly, jako zobrazení hlavního menu – tedy že se (podmenu) na obrazovce zobrazí až po určitém časovém intervalu. Tohoto chování využijí prakticky všichni uživatelé, tedy i profesionálové, kteří si ovšem ve skutečnosti nemusí pamatovat naprosto všechny nabízené příkazy. Příkladem může být příkaz určený pro zobrazení stromu s adresáři a soubory. Tento příkaz se vyvolává posloupností kláves Space f T, ovšem pokud si někdo pamatuje pouze fakt, že Space f zobrazí podmenu s příkazy pro práci se soubory, může zadat pouze tento příkaz a příslušné podmenu se zobrazí, pochopitelně i s příkazem T (Tree).

Obrázek 13: Hlavní menu SpaceVimu.

7. Příkazy dostupné v hlavním menu SpaceVimu

V hlavním menu je nabízeno několik příkazů, které se provedou ihned, tj. bez přechodu do nějakého podmenu. Jedná se o ty nejčastěji používané příkazy (alespoň podle mínění tvůrců SpaceVimu). V první řadě zde nalezneme devět příkazů, které slouží pro přechod do jednoho z devíti otevřených oken. Seznam oken i s jejich čísly je přitom zobrazen na prvním řádku uživatelského prostředí textového editoru:

Příkaz Stručný popis
Space 1 přepnutí do prvního okna v pořadí
Space 2 přepnutí do druhého okna v pořadí
Space 9 přepnutí do devátého okna v pořadí
Poznámka: ve skutečnosti se číslem nebudou označovat okna získaná vertikálním rozdělením aktuálního okna, tedy například s využitím standardní Vimovské klávesové zkratky Ctrl+W v.

Dále se v hlavním menu nachází příkazy Space " a Space ' určené pro otevření nového okna se shellem, a to buď v aktuálním adresáři nebo v adresáři, ve kterém se nachází editovaný soubor. Rozdíly jsou zřejmé a oba příkazy využijeme (každý ovšem jindy) například při práci se složitěji strukturovaným projektem (například příkaz make volaný shellem má smysl pustit v jiném adresáři, než například příkaz grep).

8. Další podmenu SpaceVimu

V hlavním menu SpaceVimu nalezneme kromě výše zmíněných přímo spustitelných/volatelných příkazů i celkem 21 podmenu, každé s vlastní sadou dostupných (a v některých případech i konfigurovatelných) příkazů:

Příkaz Zobrazené menu
Space a Další „aplikace“, tedy nástroje poskytované nějakým pluginem Vimu
Space b Operace pro práci s buffery (viz další text)
Space B Práce s globálními buffery
Space c Zakomentování/odkomentování části kódu
Space d Příkazy debuggeru
Space e Zpracování chyb produkovaných například překladačem či příkazem make
Space f Práce s adresáři, soubory a adresářovým stromem
Space h Nápověda
Space i Vkládání speciálních textových objektů do dokumentu (například UUID nebo Lorem Ipsum)
Space j Všechny příkazy skoku do určitého místa dokumentu, přechod na URL atd.
Space l Nastavení pro daný programovací jazyk
Space m Hlavní režimy (například editace čistého textu, práce s HTML dokumentem, práce se zdrojovým kódem atd.)
Space n Zvýšení či snížení hodnoty, která se nachází v blízkosti textového kurzoru
Space p Práce s projekty
Space q Ukončení SpaceVimu (takže nejčastější problém Vimu je vyřešen!)
Space r Práce s registry
Space s Příkazy pro vyhledání textu, symbolu atd.
Space t Změna chování samotného SpaceVimu (velmi užitečné, že se nachází na jediném místě)
Space T Nastavení grafického uživatelského rozhraní SpaceVimu
Space w Operace s okny
Space x Změna velikosti textu, zarovnání atd.
Poznámka: povšimněte si, že se zde do značné míry (kde je to jen trochu možné) využívá mnemotechnických zkratek, tedy Space f pro práci se soubory (File), Space w pro práci s okny (Windows) atd. atd.

9. Práce se soubory

Menu pro práci se soubory se zobrazí snadno zapamatovatelnou klávesovou zkratkou Space f; ostatně stejnou zkratkou začínají i všechny příkazy určené pro práci se soubory. Nalezneme zde i příkaz Space f T, který zobrazí strom s adresáři a se soubory, který pochopitelně umožňuje procházení adresáři a výběr souborů pro editaci. Důležitý je i (poměrně nesnadno zapamatovalelný) příkaz Space f v d, který přímo ve SpaceVimu otevře jeho konfigurační soubor.

Obrázek 14: Podmenu s příkazy pro práci se soubory.

10. Práce s okny editoru

Ve standardním Vimu se pro práci s okny (tedy „pohledy“ na editované soubory) používají klávesové zkratky začínající na Ctrl+W. Tato možnost zůstala ve SpaceVimu zachována, ovšem byla doplněna o vlastní podmenu. Všechny příkazy určené pro práci s okny jsou dostupné v menu zobrazeném klávesovou zkratkou Space w. Nalezneme zde příkazy pro rozdělení aktuálního okna na dvě okna, a to buď vertikálně či horizontálně, dokonce i s volbou, zda se má přenést fokus na nově vytvořené okno (potenciálně velmi užitečné).

Obrázek 15: Podmenu s příkazy pro práci s okny editoru.

Poznámka: povšimněte si, že zůstává zachována logika zkratek h/j/k/l, které se správným prefixem slouží pro přeskok do příslušného okna popř. pro posun okna při stisku klávesy Shift.

11. Modifikace informací zobrazených na stavové řádce

Samotný textový editor Vim umožňuje modifikovat informace, které jsou zobrazeny na stavové řádce. Tyto informace jsou získány buď z interních proměnných samotného Vimu, nebo je lze získat zavoláním nějaké funkce. Jedná se o velmi silnou techniku, která má ovšem jednu nevýhodu – specifikace zobrazených informací se provádí přes určitou formu formátovacího řetězce a není tedy příliš uživatelsky příjemná k běžným uživatelům, kteří pouze potřebují například zobrazit čas nebo stav baterie (navíc se striktně odlišuje od stavové řádky a pravítka, ovšem chování při zobrazení jediného okna je ve výchozím nastavení odlišné).

SpaceVim k tomuto problému přistupuje právě z pohledu běžného uživatele. Z tohoto důvodu jsou příkazy pro změnu informací zobrazených na stavové řádce sdruženy do pod-pod-menu vyvolaného posloupností kláves Space t m. Jedná se o následující přepínače, tedy příkazy, které buď povolí nebo naopak zakážou zobrazení příslušné informace:

Příkaz Stručný popis
Space t m b zobrazení informací o baterii (vyžaduje nainstalované acpi)
Space t m i zobrazení zvolené vstupní metody
Space t m M informace o hlavním režimu (text, HTML, zdrojový kód, …)
Space t m m informace o vedlejším režimu
Space t m p zobrazení pozice kurzoru v rámci aktivního bufferu
Space t m t čas
Space t m d datum
Space t m v informace získané ze správce verzí (pokud je buffer registrován)

Obrázek 16: Menu pro změnu informací zobrazených na stavovém řádku.

V případě, že stavová řádka jen zbytečně zabírá prostor, nebo jsou na ní zobrazené (a měněné) informace příliš rušivé, je možné ji zakázat a popř. znovu povolit posloupností kláves Space t m T.

Poznámka k výchozímu chování standardního Vimu: textový editor Vim zobrazuje ve svém okně (popřípadě v okně terminálu, v němž je spuštěn) kromě vlastního editovaného textu i několik dalších informací, jejichž způsob zobrazení a formát je samozřejmě možné konfigurovat, a to v poměrně širokém rozsahu. Většina těchto informací je zobrazována v takzvaném pravítku (ruler) a ve stavovém řádku (statusline). Pravítko může být zobrazeno v nejspodnějším textovém řádku, do něhož se kromě vlastního pravítka zapisují i příkazy v normálním a příkazovém režimu, zatímco stavový řádek je většinou zobrazen pod každým podoknem obsahujícím jeden editovaný buffer (viz též vysvětlující obrázek). To kromě jiného znamená, že formát informací zobrazených na pravítku je nastavován globálně (je platný pro všechny editované buffery), zatímco u stavové řádky je možné zvolit buď globální nastavení, nebo nastavení lokální, tj. nastavení platné pouze pro jeden editovaný buffer.

Obrázek 17: Pravítko a stavový řádek, který je implicitně zobrazený v případě, že je okno editoru rozděleno na více podoken. U nejspodnějšího podokna je možné zvolit, zda se pro něj má stavový řádek zobrazit či nikoli.

12. Informace o vedlejším režimu

Na stavovém řádku se kromě dalších informací zobrazují i informace o takzvaném vedlejším režimu neboli minor mode. Každý z několika indikátorů je představován jediným znakem, který buď používá tvar z Unicode (pokud je to povoleno) nebo naopak znak ze standardní sady ASCII. Význam jednotlivých znaků resp. indikátorů je popsán v následující tabulce:

Příkaz Zobrzení Unicode fontem Zobrazení ASCII fontem Stručný popis
Space t 8 8 zvýraznění aktuálního řádku (i pokud je delší, než řádek obrazovky)
Space t f f zvýraznění mezního sloupce, kdy se překračuje nastavená délka řádku
Space t s s je zapnutý režim kontroly syntaxe)
Space t S S je zapnutý režim kontroly překlepů (na základě slovníku)
Space t w w režim zvýraznění mezer nebo dalších bílých znaků na konci řádku (výhodné pro AsciiDoc)

Obrázek 18: Zobrazení informací o vedlejších režimech (viz zvýrazněný obdélník).

13. Vlastní klávesové zkratky

Z předchozích kapitol je zřejmé, že SpaceVim dosti podstatným způsobem modifikuje chování standardního Vimu, a to včetně jeho klávesových zkratek (původní zkratky většinou zachovává a nové přidává). Je ovšem možné toto chování změnit a nadefinovat si například vlastní klávesovou zkratku? To pochopitelně možné je, dokonce k tomuto účelu můžeme použít standardní příkaz Vimu nazvaný :map.

Pokud například budeme chtít, aby se po stisku klávesy F2 uložil aktuálně editovaný buffer, použijeme tento příkaz:

:map <F2> :w<CR>
Poznámka: poznámka: tato klávesová zkratka pochází z dnešního pohledu z doby kamenné – byla totiž používána již na začátku devadesátých let minulého století v některých integrovaných vývojových prostředích (TurboPascal apod.)

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

Mezi další potenciálně užitečné mapování patří změna chování příkazů j a k ve chvíli, kdy je dlouhý řádek na ploše terminálu vizuálně zalomen do několika terminálových řádků:

:map j gj
:map k gk
Poznámka: bližší informace lze získat příkazy :help gj a :help gk, tedy s využitím standardního příkazového režimu Vimu, který je ve SpaceVimu pochopitelně taktéž dostupný.

14. Vrstvy – cesta k udržitelné konfiguraci Vimu

Ve SpaceVimu jsou konfigurovatelné přídavné moduly rozděleny do takzvaných vrstev neboli layers. V současné verzi se jedná o devět vrstev:

  1. autocomplete
  2. checkers
  3. format
  4. edit
  5. ui
  6. core
  7. core#banner
  8. core#statusline
  9. core#tabline

Díky rozdělení do vrstev je možné udržovat konfiguraci SpaceVimu v rozumných mezích, na rozdíl od „chaotické“ konfigurace běžných pluginů Vimu. V současnosti existuje přibližně 150 vrstev, které jsou přímo podporovány SpaceVimem. Pro zajímavost se jedná o tyto vrstvy (ovšem jejich seznam je uveden i v konfiguraci, kde se bude postupně rozšiřovat společně s dalšími verzemi SpaceVimu):

autocomplete chat checkers chinese
colorscheme core#banner core#statusline core#tabline
core cscope ctrlp ctrlspace
debug default denite edit
floobits foldsearch format fzf
git github gtags japanese
lang#actionscript lang#agda lang#asciidoc lang#aspectj
lang#assembly lang#autohotkey lang#batch lang#c
lang#chapel lang#clojure lang#coffeescript lang#crystal
lang#csharp lang#d lang#dart lang#dockerfile
lang#e lang#eiffel lang#elixir lang#elm
lang#erlang lang#extra lang#factor lang#fennel
lang#fortran lang#foxpro lang#fsharp lang#go
lang#goby lang#gosu lang#graphql lang#groovy
lang#hack lang#haskell lang#html lang#hy
lang#idris lang#io lang#ipynb lang#j
lang#janet lang#java lang#javascript lang#julia
lang#kotlin lang#lasso lang#latex lang#lisp
lang#livescript lang#lua lang#markdown lang#matlab
lang#moonscript lang#nim lang#nix lang#ocaml
lang#pact lang#pascal lang#perl lang#php
lang#plantuml lang#pony lang#povray lang#powershell
lang#processing lang#prolog lang#puppet lang#purescript
lang#python lang#r lang#racket lang#reason
lang#red lang#rescript lang#ring lang#rst
lang#ruby lang#rust lang#scala lang#scheme
lang#sh lang#slim lang#smalltalk lang#sml
lang#swift lang#tcl lang#toml lang#typescript
lang#v lang#vbnet lang#vim lang#vue
lang#WebAssembly lang#wolfram lang#xml lang#zig
language-server-protocol leaderf shell sudo
test tmux tools#dash tools#mpv
tools#zeal tools ui unite
VersionControl      

15. Pluginy používané SpaceVimem

SpaceVim již ve výchozí instalaci obsahuje několik pluginů, které jsou automaticky použity. Jedná se o poměrně zajímavý výběr takových pluginů, které skutečně zvyšují použitelnost Vimu a současně nebudou žádným zásadním způsobem zasahovat do klávesových zkratek a systému menu SpaceVimu:

ale clever-f.vim CompleteParameter.vim context_filetype.vim
cscope.vim defx-git defx-icons defx.nvim
dein.vim delimitMate deoplete-dictionary deoplete.nvim
editorconfig-vim fcitx.vim fortran.vim git.vim
gruvbox gtags.vim incsearch.vim indent-blankline.nvim
indentLine neco-syntax neobundle.vim neocomplete.vim
neoformat neoinclude.vim neomake neopairs.vim
neosnippet-snippets neosnippet.vim nerdcommenter nerdtree
nvim-yarp open-browser.vim smalltalk spacevim
tabular tagbar tagbar-makefile.vim tagbar-proto.vim
undotree unite.vim vim-airline vim-airline-themes
vim-asciidoc vim-bepo vim-better-whitespace vim-bookmarks
vim-choosewin vim-cursorword vim-easymotion vim-easyoperator-line
vim-elang vim-emoji vim-expand-region vimfiler.vim
vim-grepper vim-hug-neovim-rpc vim-jplus vim-jsx-typescript
vim-matchup vim-mundo vim-povray vimproc.vim
vim-reason VimRegStyle vim-repeat vim-rescript
vim-smoothie vim-snippets vim-startify vim-surround
vim-table-mode vim-textobj-entire vim-textobj-indent vim-textobj-line
vim-textobj-user wildfire.vim    

Obrázek 20: Při povolení dalšího pluginu se automaticky provede jeho inicializace.

16. Stručný popis některých použitých pluginů

S některými výše zmíněnými pluginy jsme se již mohli setkat v některém z dřívějších článků, takže jen v krátkosti:

Plugin undotree slouží, především pro grafické znázornění obsahu stromu vytvářeného při editaci i při provádění operací undo a redo. Se znázorněným stromem, jehož pseudografika částečně připomíná způsob zobrazení větvení v GITu, je možné různým způsobem manipulovat, především zobrazit, jaké editační operace se již provedly a do kterého stavu dokumentu se má editor přenést. Modul taktéž zobrazí rozdíl (diff) mezi dvěma větvemi.

Druhý plugin určený pro textový editor VimSpaceVim se jmenuje vim-airline (neplést prosím s Vim Airlines :-). Doplňkový modul vim-airline slouží především k úpravě stavového řádku (status line), ovšem je ho možné použít taktéž k zobrazení dalšího řádku obsahujícího seznam otevřených bufferů. Informace zobrazené na stavovém řádku – včetně aktuálně nastaveného režimu editoru – jsou vizuálně zvýrazněny různou barvou písma a pozadí, ovšem navíc je možné použít i speciální fonty obsahující ikony, které vim-airline může využít pro další „vyšperkování“.

Další modul je nazvaný NERD Commenter. Funkce tohoto pluginu je zdánlivě velmi jednoduchá – zakomentování popř. odkomentování aktuálního řádku či vybraných řádků zdrojového kódu. Ve skutečnosti je však přídavný modul NERD Commenter poměrně sofistikovaný, protože dokáže pracovat s velkým množstvím programovacích jazyků (cca 300) a dalších strukturovaných souborů, přičemž každý jazyk má obecně jiný způsob zápisu komentářů. Modul NERD Commenter dokáže pracovat i se zanořenými komentáři a při dodržení určitých pravidel je možné zakomentovat či odkomentovat i blok programového kódu, který již komentáře obsahuje, a to dokonce i v těch programovacích jazycích, které vnoření značek pro komentáře nepodporují (příkladem může být ANSI C, resp. přesněji řečeno C89). U některých programovacích jazyků jsou podporovány dva styly zakomentování většího množství řádků: komentářové značky mohou být vloženy na každý řádek či na začátek a konec celého bloku.

Další přídavný modul se jmenuje NERD Tree. V tomto modulu je implementován poměrně propracovaný správce souborů založený na zobrazení stromu obsahujícího adresáře a soubory, podobně jako je tomu i u většiny integrovaných vývojových prostředí. Strom se zobrazuje v samostatném podokně a pro jeho vyvolání se ve standardním Vimu (ale i SpaceVimu) používá příkaz :NERDTree.

Použit je i plugin nazvaný table-mode, jehož repositář naleznete na adrese https://github.com/dhruvasagar/vim-table-mode. Na tomto pluginu je zajímavé mj. i to, že je celý naprogramován přímo ve VimScriptu a tudíž nevyžaduje žádné externí nástroje a dokonce ani to, aby byl Vim přeložen s podporou rozhraní pro další jazyky (Python, Luu, Perl atd.). Plugin slouží pro tvorbu tabulek v textovém dokumentu. Novou tabulku je možné vytvořit hned několika různými způsoby. Pokud již máme k dispozici data s nějakým oddělovačem sloupců, můžeme taková data převést na tabulku velmi snadno, a to příkazem :Tableize. Vstupem může být soubor s tímto obsahem:

ID|Name|Surname
01|Foo|Bar

Výběrem obou řádků (libovolným způsobem) a spuštěním příkazu Tableize můžeme tento buffer změnit na tabulku:

| ID | Name | Surname |
| 01 | Foo  | Bar     |

17. Konfigurační soubor SpaceVimu

Klasický textový editor Vim je konfigurován s využitím souborů, které jsou vytvořeny ve VimScriptu. To je jednoúčelový a postupně rozšiřovaný programovací jazyk, který může být pro mnoho uživatelů těžko čitelný (například komentáře začínají uvozovkami, rozlišují se globální proměnné, lokální proměnné a parametry funkcí pomocí prefixu atd.). Část takového konfiguračního souboru může vypadat následovně (jedná se o vybrané řádky z mého .vimrc, které se postupně vyvíjí už prakticky dvacet let):

if v:version>=600               " verze starsi nez 6.00 neumi nektere commandy
    let g:resolution="1280"     " 800/1024/1280
    let g:colors="darkblue"     " white/green/blue/darkblue/black
    let g:menu=0                " 0/1
    let g:calendar_monday=1     " ceske razeni dnu v tydnu
    set encoding=utf-8
endif
 
 
 
" Makro justify a prikazy k nemu {{{
if v:version>=600
    so $VIMRUNTIME/macros/justify.vim
endif
map \ vap,gqkgqap{vap:call Justify('tw',4)<CR>}/xyzzy<CR>
map ,, vap,gqkgqap{vap:call Justify('tw',4)<CR>}/xyzzy<CR>
map "" :
 
cmap ggs :!git status<cr>
cmap ggd :!git diff %<cr>
cmap gga :!git add %<cr>
cmap ggc :!git commit -m "
cmap ggp :!git push<cr>
cmap ggb :!git blame %<cr>

atd. atd. atd.

Zásah do takto relativně složitě strukturovaného souboru nemusí být triviální a může vést k mnoha chybám, které se projeví až při startu nové instance Vimu (a mohou ho učinit nepoužitelným – i když je pochopitelně možné zpracování tohoto souboru zakázat a vrátit se tak do časů editoru Vi). Z tohoto důvodu je konfigurace SpaceVimu řešena odlišným způsobem – pro většinu nastavení je nutné upravit pouze soubor pojmenovaný init.toml, který se nachází v podadresáři .SpaceVim.d umístěný v domácím adresáři uživatele. Jak již koncovka tohoto souboru naznačuje, jedná se o formát TOML, neboli Tom's Obvious, Minimal Language. Tento formát sice zdánlivě (alespoň na první pohled) vychází ze souborů typu INI, ovšem ve skutečnosti se jedná o odlišný, v mnoha ohledech vylepšený a především promyšlený formát, z něhož byly odstraněny prakticky všechny nevýhody INI a přitom byla zachována čitelnost a snadnost úprav.

Ve formátu TOML jsou kromě řetězců, celých čísel a seznamů podporovány i další datové typy – pravdivostní typ, čísla s plovoucí řádovou čárkou a zejména pak, což je v praxi velmi užitečné, typ „datum+čas“ neboli časové razítko. Konfigurační soubor obsahující hodnoty těchto typů může vypadat následovně:

integer1 = 1
integer2 = 0x2a
 
float1 = 3.14
float2 = -2e-5
float3 = -inf
float4 = nan
 
bool1 = true
bool2 = false
 
date1 = 2000-01-01 01:10:00Z
date2 = 2000-01-01 01:10:00-02:00
date3 = 2000-01-01T01:10:00Z
date4 = 2000-01-01T01:10:00+06:30

Podívejme se však raději na to, jak vypadá konfigurační soubor SpaceVimu. Jeho původní verze (tak, jak je nastavena po instalaci) je až triviálně jednoduchá:

#=============================================================================
# basic.toml --- basic configuration example for SpaceVim
# Copyright (c) 2016-2020 Wang Shidong & Contributors
# Author: Wang Shidong < wsdjeg at 163.com >
# URL: https://spacevim.org
# License: GPLv3
#=============================================================================
 
# All SpaceVim option below [option] section
[options]
    # set spacevim theme. by default colorscheme layer is not loaded,
    # if you want to use more colorscheme, please load the colorscheme
    # layer
    colorscheme = "gruvbox"
    colorscheme_bg = "dark"
    # Disable guicolors in basic mode, many terminal do not support 24bit
    # true colors
    enable_guicolors = false
    # Disable statusline separator, if you want to use other value, please
    # install nerd fonts
    statusline_separator = "nil"
    statusline_iseparator = "bar"
    buffer_index_type = 4
    windows_index_type = 3
    enable_tabline_filetype_icon = false
    enable_statusline_mode = false
    statusline_unicode_symbols = false
    # Enable vim compatible mode, avoid changing origin vim key bindings
    vimcompatible = true
 
# Enable autocomplete layer
[[layers]]
name = 'autocomplete'
auto_completion_return_key_behavior = "complete"
auto_completion_tab_key_behavior = "cycle"
 
[[layers]]
name = 'shell'
default_position = 'top'
default_height = 30

18. Modifikace konfiguračního souboru

Povšimněte si, že konfigurační soubor je rozdělen na sekci nazvanou [options] a potom na sekce pojmenované [[layers]], kterých může být větší množství. V sekci [options] lze modifikovat například barvové schéma, měnit styl zobrazení stavové řádky, povolit či zakázat Unicode znaky ve stavové řádce (o tom jsme se již zmiňovali výše), povolit či zakázat režim plné kompatibility s Vimem atd.

MIF analytika

V praxi jsou však důležitější konfigurace jednotlivých vrstev. K této relativně rozsáhlé problematice se vrátíme při popisu vybraných nejdůležitějších resp. přesněji řečeno nejužitečnějších pluginů.

19. Odkazy na relevantní články na Rootu

Již v úvodních větách dnešního článku jsme se zmínili o tom, že jak textový editor Vim, tak i konkurenční Emacs a jeho nadstavby (Spacemacs a Doom Emacs) již byly na stránkách Roota popsány. Konkrétně se jedná o následující sérii článků:

  1. Užitečné skripty a pluginy pro textový editor Vim
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim/
  2. Užitečné skripty a pluginy pro textový editor Vim (2.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-2-cast/
  3. Užitečné skripty a pluginy pro textový editor Vim (3.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-3-cast/
  4. Užitečné skripty a pluginy pro textový editor Vim (4.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-4-cast/
  5. Užitečné skripty a pluginy pro textový editor Vim (5.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-5-cast/
  6. Užitečné skripty a pluginy pro textový editor Vim (6.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-6-cast-cestovani-v-case/
  7. Užitečné skripty a pluginy pro textový editor Vim (7.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-7-cast/
  8. Tvorba vlastního pluginu pro textový editor Vim
    http://www.root.cz/clanky/tvorba-vlastniho-pluginu-pro-textovy-editor-vim/
  9. Vim ve funkci textového editoru pro tvůrčí psaní
    https://www.root.cz/clanky/vim-ve-funkci-textoveho-editoru-pro-tvurci-psani/
  10. Asynchronní skripty: další přiblížení Vimu k možnostem IDE
    https://www.root.cz/clanky/asynchronni-skripty-dalsi-priblizeni-vimu-k-moznostem-ide/
  11. Evil: kombinace editačních příkazů Vimu a síly Emacsu
    https://www.root.cz/clanky/evil-kombinace-editacnich-prikazu-vimu-a-sily-emacsu/
  12. Úpravy Emacsu a tvorba nových modulů s využitím Emacs Lispu
    https://www.root.cz/clanky/upravy-emacsu-a-tvorba-novych-modulu-s-vyuzitim-emacs-lispu/
  13. Úpravy Emacsu a tvorba nových modulů s využitím Emacs Lispu (2)
    https://www.root.cz/clanky/upravy-emacsu-s-emacs-lisp-zakladni-konstrukce-jazyka/
  14. Spacemacs: to nejlepší z editorů Emacs a Vim
    https://www.root.cz/clanky/spacemacs-to-nejlepsi-z-editoru-emacs-a-vim/
  15. Spacemacs: práce s projekty psanými v Pythonu a režim Org
    https://www.root.cz/clanky/spacemacs-prace-s-projekty-psanymi-v-pythonu-a-rezim-org/
  16. Doom Emacs: elegantní a snadno použitelné uživatelské rozhraní Emacsu
    https://www.root.cz/clanky/doom-emacs-elegantni-a-snadno-pouzitelne-uzivatelske-rozhrani-emacsu/

20. Odkazy na Internetu

  1. SpaceVim
    https://spacevim.org/
  2. A First Look At SpaceVim
    https://www.youtube.com/wat­ch?v=iXPS_NHLj9k
  3. Spacemacs vs SpaceVim
    https://stackshare.io/stac­kups/spacemacs-vs-spacevim
  4. Vim – the ubiquitous text editor
    https://www.vim.org/
  5. Vim Awesome
    https://vimawesome.com/plu­gin/landscape-vim
  6. SpaceVim: A Vimmer’s Eval
    https://medium.com/@jyscao/spacevim-a-vimmers-eval-d2020118b517
  7. SpaceVim (Google groups)
    https://groups.google.com/g/spa­cevim?pli=1
  8. Historie vývoje textových editorů (2)
    https://www.root.cz/clanky/historie-vyvoje-textovych-editoru-2/
  9. Vim: console-menus
    https://vimhelp.org/gui.txt­.html#console-menus
  10. dein.vim na GitHubu
    https://github.com/Shougo/dein.vim
  11. Trying out dein.vim – a dark powered plugin manager
    https://herringtondarkhol­me.github.io/2016/02/26/de­in/
  12. Editor config
    https://editorconfig.org/

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.