Hlavní navigace

Spacemacs: práce s projekty psanými v Pythonu a režim Org

16. 2. 2021
Doba čtení: 27 minut

Sdílet

Dnes se zaměříme na tři oblasti, které jsou zaměřeny čistě prakticky. Popíšeme si práci s projekty psanými v Pythonu, ukážeme si využití Org mode a taktéž se zmíníme o balíčku s nastavením vzhledu Emacsu.

Obsah

1. Spacemacs a projekty vytvářené v Pythonu

2. Nastavení virtuálního prostředí Pythonu

3. Language Server Protocol: LSP

4. Python Language Server

5. Instalace LSP pro Python

6. Povolení vrstev důležitých pro vývoj Pythonu

7. Spuštění Emacsu v roli IDE pro Python

8. Automatické doplňování názvů funkcí, metod, proměnných, parametrů

9. Kooperace s interaktivní smyčkou interpretru Pythonu (REPL)

10. Spacemacs a režim Org

11. Instalace Org-mode do Spacemacsu

12. Struktura dokumentů používaných v org-mode

13. Nadpisy, seznamy, tabulky, odkazy

14. Klávesové zkratky v režimu Org

15. Seznamy

16. Tabulky

17. Tvorba delších dokumentů a článků v org-mode

18. Balíček určený pro nastavení vizuálního stylu Spacemacsu

19. Předchozí články o Emacsu

20. Odkazy na Internetu

1. Spacemacs a projekty vytvářené v Pythonu

Ve druhém článku o Spacemacsu, který navazuje na článek z minulého týdne nazvaný Spacemacs: to nejlepší z editorů Emacs a Vim, si nejdříve ukážeme, jakým způsobem je možné Spacemacs použít ve funkci poměrně robustního integrovaného vývojového prostředí pro projekty vytvářené v Pythonu (ovšem podobně lze pracovat i s dalšími skriptovacími jazyky – většinou postačuje stáhnout a nakonfigurovat příslušný LSP). Následně se budeme zabývat slavným režimem Org, s nímž jsme se částečně seznámili již ve výše zmíněném úvodním článku. A v samotném závěru si řekneme, jak lze jednoduše změnit barvové schéma Spacemacsu s využitím vrstvy pojmenované Themes Megapack, která v současnosti obsahuje přibližně stovku barvových schémat, mezi kterými je možné se přepínat klávesovou zkratkou (například v závislosti na denní/noční době atd.).

Obrázek 1: Čistě nainstalovaný Emacs 26.3 připravený na přerod do Spacemacsu. Většina screenshotů pro dnešní článek byla vytvořena v Mintu, zatímco minule se jednalo o Fedoru.

Poznámka: všechny konkrétní příklady z úvodní části článku používají Python 3.x, konkrétně Python 3.8, i když je možné využít jakoukoli verzi 3.6 a vyšší. Teoreticky je možné použít i Python 2.7, ovšem bez záruky.

Obrázek 2: Základní konfigurace Spacemacsu popsaná minule.

2. Nastavení virtuálního prostředí Pythonu

Spacemacs bude v režimu Pythonu používat jak samotný interpret Pythonu, tak i další podpůrné nástroje z rozsáhlého ekosystému tohoto jazyka. Samozřejmě je možné použít interpret i nástroje nainstalované přímo v operačním systému (či pro daného uživatele volbou –user), ovšem to může vést k některým problémům, které se začátečníkům mnohdy těžko odlaďují – například se nespustí dále popsaný LSP server atd. Proto je výhodnější využít možností nabízených například nástrojem virtualenv, který mj. umožňuje, aby jeden uživatel měl k dispozici libovolné množství virtuálních prostředí Pythonu, každé s vlastními balíčky a jejich verzemi. Pokud virtualenv není na operačním systému ve výchozím stavu nainstalován (případ Mintu a některých dalších uživatelsky orientovaných distribucí), provedeme jeho instalaci, a to buď nástrojem pip (zde záleží na konfiguraci systému – nové již používají Python 3 jako výchozí interpret):

$ pip install --user virtualenv

nebo explicitně:

$ pip3 install --user virtualenv

Při instalaci s volbou –user si doplňte nastavení cesty k podadresáři, v němž se nachází spustitelný soubor virtualenv:

export PATH=$PATH:~/.local/bin
Poznámka: v případě, že je virtualenv nainstalován do odlišného podadresáře, který se nenachází na PATH, vypíše se na konci instalace varování s informací, jak se má PATH upravit.

Dále vytvoříme adresář, v němž budou nainstalovány balíčky pro jednotlivá virtuální prostředí. Tento adresář se může nacházet kdekoli a mít libovolné jméno. My pro jednoduchost použijeme „venv“:

$ mkdir venv

Vytvoříme nové virtuální prostředí nazvané „test“ a inicializujeme ho:

$ virtualenv venv/test
$ cd venv/test/bin/
$ source activate

To, že se provedlo přepnutí do virtuálního prostředí Pythonu, se mj. projeví i na modifikované výzvě (prompt), která bude obsahovat název tohoto prostředí v závorkách:

(test) $

Pro jistotu si otestujeme, jaká verze Pythonu je v daném virtuálním prostředí aktivní:

(test) $ python
 
Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Obrázek 3: Instalace základních balíčků, na nichž je Spacemacs postavený.

3. Language Server Protocol: LSP

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

Obrázek 4: Textový editor Emacs (v „klasické“ podobě, nikoli přebalený do Spacemacsu) ve funkci integrovaného vývojového prostředí.

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

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

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

Příklad komunikace (na levé straně je klient/editor, na straně pravé language server):

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

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

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

Jeden typ notifikace vrácené serverem klientovi:

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

4. Python Language Server

V navazujících kapitolách si ukážeme, jakým způsobem je možné integrovat language server protocol do Spacemacsu. Aby bylo možné použít reálné příklady, použijeme konkrétní implementaci LSP určenou pro programovací jazyk Python. Tato implementace se jmenuje jednoduše Python Language Server, kráceně PYLS či jen pyls, implementace od společnosti Microsoft pak mspyls. Instalace Python Language Serveru je jednoduchá a provedeme ji s využitím nástroje pip. Přitom je instalace provedena do virtuálního prostředí Pythonu, což je užitečné, protože v jiném virtuálním prostředí může být nainstalován odlišný LSP (resp. odlišný server komunikující s Emacsem přes LSP).

Obrázek 5: Instalace LSP se nabízí i přímo v Emacsu.

5. Instalace LSP pro Python

Teoreticky postačuje instalovat pouze balíček nazvaný python-language-server:

$ pip install python-language-server

Ve skutečnosti je však užitečné nainstalovat i další doplňky k základnímu serveru (linter, formátovač atd.):

$ pip install 'python-language-server[all]'

Kromě toho si můžete vyzkoušet nainstalovat i další podpůrné nástroje, ke kterým je opět zajištěn přístup přes LSP:

Balíček Stručný popis
pyls-mypy typový systém (+ kontrola typů) v Pythonu (pokud používáte)
pyls-isort setřídění importovaných balíčků nástrojem isort
pyls-black pokročilá kontrola a formátování kódu nástrojem Black

Průběh instalace závisí na tom, zda již máte nainstalovány všechny závislé balíčky či nikoli. V mém případě jsem již některé balíčky měl nainstalované (minimálně od doby psaní článku o Jedi), takže instalace byla prakticky okamžitá:

Collecting python-language-server
  Downloading https://files.pythonhosted.org/packages/9f/1d/2817b5dc2dd77f897410a11c1c9e2a6d96b3273c53d4219dd9edab7882af/python-language-server-0.21.2.tar.gz (51kB)
Requirement already satisfied: future>=0.14.0 in ./.local/lib/python3.6/site-packages (from python-language-server)
Requirement already satisfied: jedi>=0.12 in ./.local/lib/python3.6/site-packages (from python-language-server)
Requirement already satisfied: python-jsonrpc-server in ./.local/lib/python3.6/site-packages (from python-language-server)
Requirement already satisfied: pluggy in /usr/lib/python3.6/site-packages (from python-language-server)
Requirement already satisfied: parso>=0.3.0 in ./.local/lib/python3.6/site-packages (from jedi>=0.12->python-language-server)
Installing collected packages: python-language-server
  Running setup.py install for python-language-server: started
    Running setup.py install for python-language-server: finished with status 'done'
Successfully installed python-language-server-0.21.2

Pro velmi rychlou kontrolu, zda instalace proběhla v pořádku, si můžete Python Language Server spustit a zjistit, zda příkaz vůbec existuje, popř. zda při spuštění nedojde k nějaké chybě:

$ pyls -v
 
2021-02-13 20:08:20,185 UTC - INFO - pyls.python_ls - Starting PythonLanguageServer IO language server

6. Povolení vrstev důležitých pro vývoj Pythonu

Nyní bychom již měli mít nainstalován jak Spacemacs, tak i nejdůležitější balíčky pro Python, zejména jazykový server, s nímž může Emacs komunikovat přes protokol LSP. Zbývá nám pouze povolit vrstvy (layers) důležité pro vývoj Pythonu. Připomeňme si, že vrstvami jsou označovány balíčky samotného Emacsu a především jejich konfigurace. Pokud změníte hodnotu symbolu dotspacemacs-configuration-layers v souboru .spacemacs (ten je umístěn v domácím adresáři), bude příslušný balíček či balíčky automaticky nainstalován při inicializaci Spacemacsu, popř. po stisku klávesové zkratky SPC f e R. Výchozí nastavení vrstev vypadá následovně:

;; List of configuration layers to load.
dotspacemacs-configuration-layers
'(;; ----------------------------------------------------------------
  ;; Example of useful layers you may want to use right away.
  ;; Uncomment some layer names and press `SPC f e R' (Vim style) or
  ;; `M-m f e R' (Emacs style) to install them.
  ;; ----------------------------------------------------------------
  ;; auto-completion
  ;; better-defaults
  emacs-lisp
  ;; git
  helm
  ;; lsp
  ;; markdown
  multiple-cursors
  ;; org
  ;; (shell :variables
  ;;        shell-default-height 30
  ;;        shell-default-position 'bottom)
  ;; spell-checking
  ;; syntax-checking
  ;; version-control
  treemacs)

Pro využití Spacemacsu jako IDE pro Python proveďte tyto úpravy:

;; List of configuration layers to load.
dotspacemacs-configuration-layers
'(
  ;; ----------------------------------------------------------------
  ;; Example of useful layers you may want to use right away.
  ;; Uncomment some layer names and press `SPC f e R' (Vim style) or
  ;; `M-m f e R' (Emacs style) to install them.
  ;; ----------------------------------------------------------------
  python
  auto-completion
  ;; better-defaults
  emacs-lisp
  ;; git
  helm
  lsp
  ;; markdown
  multiple-cursors
  ;; org
  ;; (shell :variables
  ;;        shell-default-height 30
  ;;        shell-default-position 'bottom)
  ;; spell-checking
  ;; syntax-checking
  ;; version-control
  treemacs)

Po nové inicializaci Spacemacsu dojde ke stažení a konfiguraci těchto balíčků:

Obrázek 6: Instalace balíčků z nově povolených vrstev.

7. Spuštění Emacsu v roli IDE pro Python

Spacemacs je ideální spouštět přímo v rámci virtuálního prostředí Pythonu. V tomto případě by se při otevření zdrojového souboru měl automaticky (na pozadí) nastartovat LSP server a měly by být k dispozici i další nástroje – zejména kontrola chyb ve skriptech, podpora automatického doplňování po stisku klávesy TAB, popř. možnost spuštění REPLu Pythonu s předáním části kódu, který se má v interaktivním shellu spustit. K dispozici je pochopitelně i nápověda:

Obrázek 7: Nápověda k režimu Pythonu.

Podívejme se nyní na některé možnosti, které jsou k dispozici.

Obrázek 8: Červeně jsou podtrženy chybně zapsané programové řádky nebo jejich části. Po najetí kurzorem myši se vypíšou podrobnější informace o chybě.

Obrázek 9: Detekují se i problémy se strukturou zápisu programového kódu (lintery).

Obrázek 10: Podrobnější informace o funkcích, metodách a proměnných dostupných v balíčku os.

8. Automatické doplňování názvů funkcí, metod, proměnných, parametrů

Mnoho funkcí nabízených kombinací vrstev Python a auto-completion je založeno na kontextové nabídce názvů funkcí, metod, tříd, parametrů atd. Typicky je taková nabídka zobrazena automaticky po stisku klávesy Tab.

Obrázek 11: Jednou z nejdůležitějších vlastností je automatické doplňování funkcí, metod, proměnných či parametrů (opět v závislosti na kontextu).

Obrázek 12: V pravé části je automaticky zobrazena dokumentace k použité třídě, resp. přesněji řečeno ke třídě, jejíž konstruktor se volá.

Obrázek 13: Nabídka metod a atributů objektu x, který je instancí třídy X, což LSP samozřejmě dokáže automaticky detekovat.

Obrázek 14: V dolní části okna si povšimněte nápovědy týkající se parametrů volané metody.

9. Kooperace s interaktivní smyčkou interpretru Pythonu (REPL)

Neméně důležitá funkcionalita při práci s Pythonem (ale i s dalšími skriptovacími jazyky) je představována možností spuštění a zobrazení interaktivní smyčky REPL přímo v prostředí Spacemacsu. Do takto inicializovaného interpretru je následně možné posílat části editovaných souborů (či celé soubory) a sledovat vypočtené a zobrazené výsledky. Opět se podívejme na sérii screenshotů, na nichž je tato funkcionalita postupně představena.

Poznámka: prozatím se zaměříme na klasický interpret Pythonu, ovšem použít je možné v případě potřeby i IPython, což je možnost, kterou si ukážeme v navazujícím článku.

Obrázek 15: Po stisku klávesové zkratky SPC m se zobrazí menu, které se týká hlavního aktuálně nastaveného režimu. Takto menu vypadá ve chvíli, kdy je hlavním režimem Python.

Obrázek 16: Podmenu zobrazené po výběru klávesové zkratky SPC m c, což znamená „execute code“. Do interpretru Pythonu lze předat vybraný zdrojový soubor.

Obrázek 17: Výsledek spuštění našeho skriptu ukázal, že se v něm nachází chyby detekované za běhu (runtime).

Obrázek 18: Po opravě již bylo možné skript bez problémů spustit.

Obrázek 19: Menu zobrazené po výběru příkazu SPC m s nabízí možnosti předání určité části kódu do REPLu s možností jeho vykonání (tedy spuštění).

Obrázek 20: Aktivní interaktivní smyčka Pythonu.

Obrázek 21: Při ukončování Spacemacsu je nutné interpret, interpretry či další na pozadí spuštěné procesy ukončit.

10. Spacemacs a režim Org

Ve druhé třetině dnešního článku si ukážeme některé možnosti, které uživatelům nabízí kombinace Spacemacsu a slavného režimu Org, o němž jsme se ostatně již zmínili minule. Připomeňme si, že s využitím org-mode je možné pracovat se strukturovanými dokumenty obsahujícími osnovy, poznámky, tabulky, ale i další typy objektů, například i s grafy atd. – a to vše přímo z prostředí textového editoru a se zachováním významu všech editačních příkazů, možnosti ukládání do Gitu (historie, rozdíly) atd.

Obrázek 22: Dokument s poznámkami vytvořenými v Org-mode. Povšimněte si použití různých úrovní nadpisů, použití číslovaných seznamů i seznamů s odrážkami a použití textových značek určených pro změnu stylu zobrazení písma.

Výsledkem je přitom běžný textový soubor, který může přečíst jakýkoli uživatel, i ten, který Org nepoužívá. Pro Vim sice existuje podobně koncipovaný projekt nazvaný vim-orgmode, ovšem ten prozatím kvality ani počtu funkcí původního org-mode nedosahuje.

Obrázek 23: Nápověda k režimu Org.

11. Instalace Org-mode do Spacemacsu

Poznámka: tato kapitola pouze opakuje informace, s nimiž jsme se seznámili minule, ovšem možná nebude na škodu mít celý postup instalace sepsaný v jediném článku.

Instalace Org-mode je v případě Spacemacsu až triviálně jednoduchá, protože postačuje upravit soubor .spacemacs, o kterém jsme se zmínili v šesté kapitole při popisu vrstev užitečných při práci s Pythonem. Postačuje pouze odkomentovat jedinou položku org v sekci layers (vrstev), takže by tato položka mohla vypadat následovně:

;; List of configuration layers to load.
dotspacemacs-configuration-layers
'(python
  ;; ----------------------------------------------------------------
  ;; Example of useful layers you may want to use right away.
  ;; Uncomment some layer names and press `SPC f e R' (Vim style) or
  ;; `M-m f e R' (Emacs style) to install them.
  ;; ----------------------------------------------------------------
  ;; auto-completion
  ;; better-defaults
  emacs-lisp
  ;; git
  helm
  ;; lsp
  ;; markdown
  multiple-cursors
  org
  ;; (shell :variables
  ;;        shell-default-height 30
  ;;        shell-default-position 'bottom)
  ;; spell-checking
  ;; syntax-checking
  ;; version-control
  treemacs)

Po novém spuštění Spacemacsu dojde k automatickému stažení všech potřebných balíčků – toť vše, žádná další instalace ani konfigurace většinou není zapotřebí.

Obrázek 24: Org-mode prakticky bez problémů zkombinovaný se Spacemacsem.

12. Struktura dokumentů používaných v org-mode

Na rozdíl od specializovaných aplikací určených pro organizaci času a správu poznámek pracuje plugin org-mode s čistě textovými soubory, v nichž se rozeznává několik textových značek, které je možné se velmi snadno naučit. Ostatně se stejným nebo hodně podobným principem, tj. s použitím běžných textových souborů s několika značkami, se pravděpodobně setkalo velké množství čtenářů tohoto článku: jedná se zejména o dnes populární formáty AsciiDoc, Markdown, ReStructuredText a podmnožiny těchto jazyků, které jsou použity například na GitHubu, některých systémech s wiki apod. Ostatně i samotný formát používaný org modem je podporován přímo na GitHubu – soubory tohoto typu jsou automaticky zformátovány před jejich zobrazením uživateli (v případě potřeby se lze ovšem podívat i na „raw“ podobu takových dokumentů).

Obrázek 25: Režim org-mode samozřejmě dává uživatelům k dispozici rozsáhlou nápovědu integrovanou do Emacsu (zde bez Spacemacsu).

Všechny nové příkazy (je jich několik set, pokud spočítáme všechny možné varianty!), které plugin org-mode nabízí, tak pracují nad čistě textovými daty, přičemž je nutné zdůraznit, že plugin nemá k dispozici žádné další „skryté“ soubory. V praxi to znamená především fakt, že si můžete poznámky a diář jednoduše synchronizovat mezi různými počítači (přes Git, popř. dokonce i přes starý dobrý nástroj rsync) a prakticky nikdy nedojde k poškození dat (pokud si je samozřejmě sami nesmažete nebo „nerozházíte“ některou pokročilejší operací).

Obrázek 26: Tento dokument o Org mode je psán přímo v Org mode.

13. Nadpisy, seznamy, tabulky, odkazy

S využitím textových značek se v org-mode rozlišuje několik různých tříd objektů. Jedná se především o nadpisy, které začínají hvězdičkami na začátku řádku. Podle počtu hvězdiček se rozlišují různé úrovně nadpisů – nadpisy nejvyšší úrovně jsou označeny jedinou hvězdičkou, nadpisy druhé úrovně dvěma hvězdičkami atd. Nadpisy jsou od ostatního textu vizuálně rozlišeny, to ovšem není jejich hlavní funkce. Nadpisy především slouží ke strukturování dokumentu a existuje několik příkazů pro změnu pohledu na dokument (viz navazující kapitolu), změnu jeho struktury apod. Nesmíme zapomenout ani na možnost exportu dokumentů do jiných formátů (PDF, HTML, LaTeX, …), v nichž samozřejmě struktura dokumentů hraje velkou roli.

Obrázek 27: Pro org-mode existuje i spousta zajímavých rozšíření, například toto rozšíření pro kooperaci s Jirou.

Mezi další třídu textových objektů poskytovaných modulem org-mode patří seznamy, které mohou být číslované nebo se může jednat o seznamy s odrážkami. U obou typů seznamů je možné do jisté míry ovlivnit styl zobrazení značek a kdykoli tento styl změnit (pro celý seznam!) s využitím k tomu určených příkazů. Třetí třídou textových objektů jsou odkazy, které mohou vést jak do stejného textového dokumentu, tak i do dokumentu jiného, na URL apod. A důležitá je i podpora tabulek, které tvoří nejkomplexnější textové objekty.

Obrázek 28: Možnosti exportu diáře/poznámek do různých formátů.

14. Klávesové zkratky v režimu Org

V režimu Org, tj. například při editaci souboru s koncovkou .org, má uživatel k dispozici poměrně velkou sadu nových klávesových zkratek. Ty – pokud se bavíme o ovládání převzatém z Vimu – ovšem nejsou kompatibilní se zkratkami oficiálního Org mode. Klávesové zkratky začínají klávesou SPC a musí se (pochopitelně) spouštět z normálního režimu, tedy nikoli z režimu vkládacího nebo dokonce přepisovacího. Všechny dostupné zkratky jsou pochopitelně popsány v nápovědě, jejichž části jsou ukázány na screenshotech.

Základním příkazem dovolujícím orientaci v delších dokumentech je příkaz Tab, který dokáže skrýt či naopak ukázat text pod nadpisem (ve Vimu se jedná o takzvaný folding). Některé příkazy začínají sekvencí SPC a o (o znamená pochopitelně Org mode) a týkají se většinou celého dokumentu s poznámkami a agendou – vyhledávání schůzek, úkolů atd.:

Obrázek 29: Příkazy začínající sekvencí SPC a o.

Většina příkazů je však skryta v menu zobrazeném po stisku SPC m, kde m znamená (main) mode. Jedná se například o příkaz pro vytvoření nadpisu z aktuálního řádku SPC m *, výběr, resp. změna odrážek u seznamu SPC m -, přidání nálepky TODO či DONE (s časovým razítkem) SPC m Shift+l či přidání nálepky s prioritou SPC m Shift+j (snížení priority) a SPC m Shift+k (zvýšení priority). Mimochodem tyto poslední dva příkazy jsou odvozeny od zkratek j/k z Vimu. Příkazy pro přepínání mezi různými stavy začínají SPC m T.

Obrázek 30: Nápověda s příkazy režimu Org začínající zkratkou SPC m.

Pokud je určitá část textu vybrána (režim vizuálního výběru spuštěný příkazem v či V), lze vybranému textu určit styl příkazy začínajícími na SPC m x, za nímž následuje výběr stylu (tučné písmo b, kurzíva i, podtržené písmo s, kód c atd.). U nadpisů lze měnit jejich úroveň standardními Vimovskými zkratkami << a >>, které jsou mj. zmíněny v další nápovědě:

Obrázek 31: Klávesové zkratky odvozené (většinou) z Vimu.

Obrázek 32: Další klávesové zkratky související s různými dalšími objekty v textovém dokumentu (tabulky, seznamy, úkoly).

15. Seznamy

Při tvorbě poznámek a strukturovaných dokumentů je samozřejmě možné používat seznamy. Jak jsme se již dozvěděli v předchozích kapitolách, pracovat lze s číslovanými seznamy i se seznamy s odrážkami. Číslované seznamy typicky začínají celým číslem, za nímž následuje tečka nebo pravá kulatá závorka. Odrážky jsou reprezentovány znaky „-“, „+“ nebo „*“. Mezi těmito pěti možnostmi se můžete přepínat pomocí klávesové zkratky SPC m -. Tato zkratka je aplikována vždy na aktuální seznam, tj. na seznam, v němž se nachází textový kurzor.

Jakýkoli prvek seznamu je možné převést na nadpis s využitím zkratky SPC m *, nový prvek se přidává klávesovou zkratkou Alt+Enter (v GUI levý Alt) a poslední zajímavou volbou je C-c | pro převod seznamu na tabulku.

Obrázek 33: Číslované seznamy.

Zaškrtávací políčka jsou dalším specializovaným typem seznamů. Do dokumentu se zapisují velmi jednoduchým a snadno zapamatovatelným způsobem:

*** Checkboxy
    - [ ] první
    - [ ] druhý
    - [ ] třetí

V případě, že je zapotřebí políčko „odškrtnout“, postačuje kdekoli na řádku použít příkaz SPC m T c (tedy mnemotechnicky main mode, toggle, checkbox):

*** Checkboxy
    - [X] první
    - [X] druhý
    - [ ] třetí

Obrázek 34: Změna číslování seznamu klávesovou zkratkou SPC m -.

16. Tabulky

Jednou z velmi důležitých vlastností pluginu org-mode je podpora pro práci s tabulkami. Díky tomu může Emacs pro některé účely nahradit i nástroje určené pro mnohem složitější operace s tabulkami (LibreOffice, …). Samozřejmě je stále zachován základní princip, který se celým org-mode prolíná: všechna data jsou reprezentována čistým textem bez speciálních datových struktur a řídicích znaků. Pouze se (v čitelné podobě) za tabulku mohou přidávat informace o vzorcích.

Obrázek 35: Tabulka, v níž jsou po editaci rozházené buňky.

Poznámka: v případě, že se vám podaří tabulku rozházet, tj. jednotlivé sloupce nebudou umístěny přímo pod sebou, není nic ztraceno. Vše by se mělo opravit po stisku klávesy TAB, která kromě přeskoku na další buňku v tabulce provede i její opakované naformátování.

Obrázek 36: Po stisku klávesy TAB se tabulka automaticky znovu zformátuje.

Popisem práce s tabulkami se budeme věnovat v samostatném článku.

17. Tvorba delších dokumentů a článků v org-mode

„Org-Mode Is One of the Most Reasonable Markup Languages to Use for Text“

Režim org-mode je možné v případě potřeby použít i pro tvorbu delších dokumentů, které se následně mohou převést (exportovat) do jiných formátů, z nichž některé budou popsány v navazujícím textu (Markdown, AsciiDoc). Pro vytvoření základní struktury dokumentu se používají nám již známé řádky začínající hvězdičkami. Počet hvězdiček na začátku řádků přitom určuje úroveň jednotlivých kapitol a podkapitol. Při exportu jsou kapitoly a podkapitoly prakticky vždy převedeny korektně. Podobně je tomu i u seznamů, které mohou být číslované či nečíslované (s odrážkami). Pro zvýraznění textu v rámci jednotlivých odstavců slouží značky pro určení tučného písma, kurzivy, podtrženého textu, zdrojového kódu a konečně neformátovaného textu:

    1. *tučné písmo*
    2. /kurzíva/
    3. _podtržený text_
    4. +přeškrtnutý text+
    5. =úryvek zdrojového kódu=
    6. ~neformátovaný text~

Obrázek 37: Všechny nabízené možnosti formátování dokumentů ocení především uživatelé Emacsu spuštěného v grafickém režimu. V režimu textovém totiž nemusí být například zvýrazněno tučné písmo či kurzíva (v závislosti na konfiguraci terminálu).

Editace rozsáhlejších dokumentů v režimu org-mode je většinou naprosto bezproblémová, tj. málokdy se uživatelům „podaří“ nějakým omylem globálně změnit jejich strukturu. Samotné odstavce se vytváří zcela běžným způsobem. Pokud budete vyžadovat, aby se při psaní textu, popř. při jeho úpravách používalo automatické formátování do odstavců, můžete si příslušný režim nastavit v menu Text. Jedná se o následující položky:

  • Auto Fill
  • Paragraph Indent

Ve chvíli, kdy se pracuje s delšími dokumenty (například rozsah tohoto článku přesáhne 68kB, tj. přibližně 37 normostran, bakalářky či diplomky mohou být několikanásobně delší), je užitečné se naučit používat klávesové zkratky sloužící pro pohyb kurzoru na základě logické struktury dokumentu. V praxi to znamená, že se můžeme snadno přesouvat po jednotlivých kapitolách, sekcích, skočit na nadpis vyšší úrovně (začátek kapitoly) atd. – a to vše bez nutnosti měnit náhled na dokument pomocí klávesy TAB (což by bylo řešení, které by se zvolilo ve Vimu s využitím tzv.– foldingu – skládání). K dispozici jsou především následující klávesové zkratky:

Zkratka Význam klávesové zkratky
gl přesun kurzoru na další viditelný nadpis
gh přesun kurzoru na nadpis o úroveň výše, než je současný text
gj přesun kurzoru na další nadpis stejné úrovně
gk přesun kurzoru na předchozí nadpis stejné úrovně
Poznámka: opět se jedná o klávesové zkratky, které jsou částečně převzaty z Vimu.

18. Balíček určený pro nastavení vizuálního stylu Spacemacsu

Posledním balíčkem, se kterým se dnes alespoň ve stručnosti setkáme, je balíček nazvaný Themes Megapack. Tento Emacsovský balíček je pochopitelně dostupný i ve formě vrstvy (layer), takže pro jeho instalaci pouze dostačuje nepatrná úprava souboru .spacemacs:

;; List of configuration layers to load.
dotspacemacs-configuration-layers
'(;; ----------------------------------------------------------------
  ;; Example of useful layers you may want to use right away.
  ;; Uncomment some layer names and press `SPC f e R' (Vim style) or
  ;; `M-m f e R' (Emacs style) to install them.
  ;; ----------------------------------------------------------------
  ;; auto-completion
  ;; better-defaults
  emacs-lisp
  ;; git
  helm
  ;; lsp
  ;; markdown
  multiple-cursors
  ;; org
  ;; (shell :variables
  ;;        shell-default-height 30
  ;;        shell-default-position 'bottom)
  ;; spell-checking
  ;; syntax-checking
  ;; version-control
  themes-megapack
  treemacs)

Po instalaci balíčku (inicializace stiskem SPC f e R či restartu Spacemacsu) je možné klávesovou zkratkou SPC T s zobrazit menu s výběrem barvového schématu (těch existuje přibližně stovka):

Obrázek 38: Přepínání mezi barvovými režimy.

Root tip obecný

Obrázek 39: Přepínání mezi barvovými režimy – jeden z režimů se světlým pozadím.

19. Předchozí články o Emacsu

Textovým editorem Emacs jsme se již na stránkách Rootu několikrát zabývali, a to jak v samostatných článcích, tak i ve dvojici seriálů. Popsali jsme si zejména tři potenciálně zajímavé oblasti – režim Evil (jehož význam je patrný z výše uvedeného textu), slavný režim Org a taktéž jsme si popsali všechny důležité vlastnosti Emacs LISPu:

  1. 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/
  2. Ú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/
  3. Ú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/
  4. Úpravy Emacsu s Emacs Lisp: všemocné makro cl-loop a knihovna dash
    https://www.root.cz/clanky/upravy-emacsu-s-emacs-lisp-vsemocne-makro-cl-loop-a-knihovna-dash/
  5. Úpravy Emacsu s Emacs Lisp: možnosti nabízené knihovnou Dash
    https://www.root.cz/clanky/upravy-emacsu-s-emacs-lisp-moznosti-nabizene-knihovnou-dash/
  6. Úpravy Emacsu s Emacs Lisp: dokončení popisu Emacs Lispu
    https://www.root.cz/clanky/upravy-emacsu-s-emacs-lisp-dokonceni-popisu-emacs-lispu/
  7. Úpravy Emacsu s Emacs Lisp: základní interní datové struktury Emacsu
    https://www.root.cz/clanky/upravy-emacsu-s-emacs-lisp-manipulace-se-zakladnimi-datovymi-strukturami-emacsu/
  8. Základy použití režimu org-mode v Emacsu
    https://www.root.cz/clanky/zaklady-pouziti-rezimu-org-mode-v-emacsu/
  9. Pokročilejší možnosti nabízené režimem org-mode v Emacsu
    https://www.root.cz/clanky/po­krocilejsi-moznosti-nabizene-rezimem-org-mode-v-emacsu/
  10. Spacemacs: to nejlepší z editorů Emacs a Vim
    https://www.root.cz/clanky/spacemacs-to-nejlepsi-z-editoru-emacs-a-vim/

20. Odkazy na Internetu

  1. An Introduction to Spacemacs
    https://spin.atomicobject­.com/2016/08/30/introducti­on-to-spacemacs/
  2. Beginners tutorial (Spacemacs)
    https://github.com/syl20bnr/spa­cemacs/blob/master/doc/BE­GINNERS_TUTORIAL.org
  3. Spacemacs For Noobs (video)
    https://www.youtube.com/wat­ch?v=VBYsa3Kpkz8
  4. Langserver.org
    https://langserver.org/
  5. Language Server Protocol
    https://microsoft.github.io/language-server-protocol/
  6. Language Server Protocol Specification
    https://microsoft.github.io/language-server-protocol/specification
  7. Implementations Language Servers
    https://microsoft.github.io/language-server-protocol/implementors/servers
  8. JSON-RPC 2.0 Specification
    https://www.jsonrpc.org/specification
  9. Why You Should Know the Language Server Protocol
    https://tomassetti.me/what-is-the-language-server-protocol/
  10. Language Server Protocol: A Language Server For DOT With Visual Studio Code
    https://tomassetti.me/language-server-dot-visual-studio/
  11. Python Language Server
    https://github.com/palantir/python-language-server
  12. Jedi – an awesome autocompletion/static analysis library for Python
    https://github.com/davidhalter/jedi
  13. What is lsp
    https://www.reddit.com/r/vim/com­ments/7lnhrt/which_lsp_plu­gin_should_i_use/
  14. Vim-lsp
    https://github.com/prabirshrestha/vim-lsp
  15. Using LSP & clangd in Vim
    https://jonasdevlieghere.com/vim-lsp-clangd/
  16. Org tutorial
    https://gist.github.com/sa­fijari/d9b1ed8a3f4cd10e632e0­4353c6abdfe
  17. Org layer
    https://www.spacemacs.org/la­yers/+emacs/org/README.html
  18. Spacemacs layers list
    https://develop.spacemacs­.org/layers/LAYERS.html
  19. Themes Megapack layer
    https://develop.spacemacs­.org/layers/+themes/themes-megapack/README.html
  20. Spacemacs, Emacs, and Org-mode tips
    https://ontologicalblog.com/spacemacs-emacs-and-org-mode-tips/
  21. Python Development in Spacemacs (video)
    https://www.youtube.com/watch?v=r-BHx7VNX5s
  22. Použití Language Server Protocolu v textovém editoru Vim
    https://www.root.cz/clanky/pouziti-language-server-protocolu-v-textovem-editoru-vim/
  23. Microsoft Python Language Server
    https://github.com/Microsoft/python-language-server
  24. Language Server Protocol Support for Emacs
    https://emacs-lsp.github.io/lsp-mode/
  25. isort
    https://pycqa.github.io/isort/
  26. Python with Emacs: py(v)env and lsp-mode
    https://ddavis.io/posts/emacs-python-lsp/
  27. Evil (Emacs Wiki)
    https://www.emacswiki.org/emacs/Evil
  28. Evil (na GitHubu)
    https://github.com/emacs-evil/evil
  29. Evil (na stránkách repositáře MELPA)
    https://melpa.org/#/evil
  30. Evil Mode: How I Switched From VIM to Emacs
    https://blog.jakuba.net/2014/06/23/e­vil-mode-how-to-switch-from-vim-to-emacs.html
  31. GNU Emacs (home page)
    https://www.gnu.org/software/emacs/
  32. GNU Emacs (texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?GnuEmacs
  33. An Introduction To Using GDB Under Emacs
    http://tedlab.mit.edu/~dr/gdbin­tro.html
  34. An Introduction to Programming in Emacs Lisp
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­intr/index.html
  35. 27.6 Running Debuggers Under Emacs
    https://www.gnu.org/softwa­re/emacs/manual/html_node/e­macs/Debuggers.html
  36. GdbMode
    http://www.emacswiki.org/e­macs/GdbMode
  37. Emacs (Wikipedia)
    https://en.wikipedia.org/wiki/Emacs
  38. Emacs timeline
    http://www.jwz.org/doc/emacs-timeline.html
  39. Emacs Text Editors Family
    http://texteditors.org/cgi-bin/wiki.pl?EmacsFamily
  40. Vrapper aneb spojení možností Vimu a Eclipse
    https://mojefedora.cz/vrapper-aneb-spojeni-moznosti-vimu-a-eclipse/
  41. 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/
  42. Emacs/Evil-mode – A basic reference to using evil mode in Emacs
    http://www.aakarshnair.com/posts/emacs-evil-mode-cheatsheet
  43. From Vim to Emacs+Evil chaotic migration guide
    https://juanjoalvarez.net/es/de­tail/2014/sep/19/vim-emacsevil-chaotic-migration-guide/
  44. Introduction to evil-mode {video)
    https://www.youtube.com/wat­ch?v=PeVQwYUxYEg
  45. EINE (Emacs Wiki)
    http://www.emacswiki.org/emacs/EINE
  46. EINE (Texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?EINE
  47. ZWEI (Emacs Wiki)
    http://www.emacswiki.org/emacs/ZWEI
  48. ZWEI (Texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?ZWEI
  49. Zmacs (Wikipedia)
    https://en.wikipedia.org/wiki/Zmacs
  50. Zmacs (Texteditors.org)
    http://texteditors.org/cgi-bin/wiki.pl?Zmacs
  51. TecoEmacs (Emacs Wiki)
    http://www.emacswiki.org/e­macs/TecoEmacs
  52. Micro Emacs
    http://www.emacswiki.org/e­macs/MicroEmacs
  53. Micro Emacs (Wikipedia)
    https://en.wikipedia.org/wi­ki/MicroEMACS
  54. EmacsHistory
    http://www.emacswiki.org/e­macs/EmacsHistory
  55. Seznam editorů s ovládáním podobným Emacsu či kompatibilních s příkazy Emacsu
    http://www.finseth.com/emacs.html
  56. evil-numbers
    https://github.com/cofi/evil-numbers
  57. Debuggery a jejich nadstavby v Linuxu (1.část)
    http://fedora.cz/debuggery-a-jejich-nadstavby-v-linuxu/
  58. Debuggery a jejich nadstavby v Linuxu (2.část)
    http://fedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-2-cast/
  59. Debuggery a jejich nadstavby v Linuxu (3): Nemiver
    http://fedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-3-nemiver/
  60. Debuggery a jejich nadstavby v Linuxu (4): KDbg
    http://fedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-4-kdbg/
  61. Debuggery a jejich nadstavby v Linuxu (5): ladění aplikací v editorech Emacs a Vim
    https://mojefedora.cz/debuggery-a-jejich-nadstavby-v-linuxu-5-ladeni-aplikaci-v-editorech-emacs-a-vim/
  62. How to configure org-mode in spacemacs
    https://stackoverflow.com/qu­estions/51125978/how-to-configure-org-mode-in-spacemacs
  63. Org mode
    https://orgmode.org/
  64. The Org Manual
    https://orgmode.org/manual/index.html
  65. Org-Mode Reference Card
    https://orgmode.org/orgcard.pdf
  66. Org-mode Tutorial 1 – Introduction and basics
    https://www.youtube.com/wat­ch?v=vCyBu8Az254
  67. Getting Started With Org Mode
    https://www.youtube.com/wat­ch?v=SzA2YODtgK4
  68. Org as a spreadsheet system: a short introduction
    https://orgmode.org/worg/org-tutorials/org-spreadsheet-intro.html
  69. Kakoune (modální textový editor)
    http://kakoune.org/
  70. Vim-style keybinding in Emacs/Evil-mode
    https://gist.github.com/tro­yp/6b4c9e1c8670200c04c16036805773d8
  71. Emacs – jak začít
    http://www.abclinuxu.cz/clan­ky/navody/emacs-jak-zacit
  72. Programovací jazyk LISP a LISP machines
    https://www.root.cz/clanky/pro­gramovaci-jazyk-lisp-a-lisp-machines/
  73. Evil-surround
    https://github.com/emacs-evil/evil-surround
  74. Spacemacs
    http://spacemacs.org/
  75. Lisp: Common Lisp, Racket, Clojure, Emacs Lisp
    http://hyperpolyglot.org/lisp
  76. Common Lisp, Scheme, Clojure, And Elisp Compared
    http://irreal.org/blog/?p=725
  77. Does Elisp Suck?
    http://irreal.org/blog/?p=675
  78. Emacs pro mírně pokročilé (9): Elisp
    https://www.root.cz/clanky/emacs-elisp/
  79. If I want to learn lisp, are emacs and elisp a good choice?
    https://www.reddit.com/r/e­macs/comments/2m141y/if_i_wan­t_to_learn_lisp_are_emacs_an­d_elisp_a/
  80. Clojure(Script) Interactive Development Environment that Rocks!
    https://github.com/clojure-emacs/cider
  81. An Introduction to Emacs Lisp
    https://harryrschwartz.com/2014/04/08/an-introduction-to-emacs-lisp.html
  82. Emergency Elisp
    http://steve-yegge.blogspot.com/2008/01/emergency-elisp.html
  83. Racket
    https://racket-lang.org/
  84. The Racket Manifesto
    http://felleisen.org/matthi­as/manifesto/
  85. MIT replaces Scheme with Python
    https://www.johndcook.com/blog/2009/03/26/mit-replaces-scheme-with-python/
  86. Adventures in Advanced Symbolic Programming
    http://groups.csail.mit.e­du/mac/users/gjs/6.945/
  87. Why MIT Switched from Scheme to Python (2009)
    https://news.ycombinator.com/i­tem?id=14167453
  88. Starodávná stránka XLispu
    http://www.xlisp.org/
  89. AutoLISP
    https://en.wikipedia.org/wi­ki/AutoLISP
  90. Seriál PicoLisp: minimalistický a výkonný interpret Lispu
    https://www.root.cz/serialy/picolisp-minimalisticky-a-vykonny-interpret-lispu/
  91. Common Lisp
    https://common-lisp.net/
  92. Getting Going with Common Lisp
    https://cliki.net/Getting%20Started
  93. Online Tutorial (Common Lisp)
    https://cliki.net/online%20tutorial
  94. Guile Emacs
    https://www.emacswiki.org/e­macs/GuileEmacs
  95. Guile Emacs History
    https://www.emacswiki.org/e­macs/GuileEmacsHistory
  96. Guile is a programming language
    https://www.gnu.org/software/guile/
  97. MIT Scheme
    http://groups.csail.mit.e­du/mac/projects/scheme/
  98. SIOD: Scheme in One Defun
    http://people.delphiforum­s.com/gjc//siod.html
  99. CommonLispForEmacs
    https://www.emacswiki.org/e­macs/CommonLispForEmacs
  100. Elisp: print, princ, prin1, format, message
    http://ergoemacs.org/emac­s/elisp_printing.html
  101. Special Forms in Lisp
    http://www.nhplace.com/ken­t/Papers/Special-Forms.html
  102. Basic Building Blocks in LISP
    https://www.tutorialspoin­t.com/lisp/lisp_basic_syn­tax.htm
  103. Introduction to LISP – University of Pittsburgh
    https://people.cs.pitt.edu/~mi­los/courses/cs2740/Lectures/Lis­pTutorial.pdf
  104. Why don't people use LISP
    https://forums.freebsd.org/threads/why-dont-people-use-lisp.24572/

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.