elisp[1] je zkrácenina pro emacs lisp, tj. dialekt jazyka Lisp, který je použit v editoru emacs.

To, co následuje, by měl být časem jakýsi malý tutoriálek.

Doporučuji přečíst si nejdříve něco o emacsu. No dobrá. Když ne, tak si zkusíme vystačit alespoň s tím níže uvedeným málem základních poučení:

Soubor needitujeme přímo na disku, ale v bufferu. Zjednodušeně řečeno, obsah bufferu můžeme nahlížet skrzevá okénka na obrazovky, říká se jim rámy (angl. frames). Samozřejmě, bufferů i oken může být více; na jeden buffer můžeme nahlížet i více rámy.

Jako dobrý příklad nám poslouží, když si v emacsu otevřeme tento text, který právě čteme.

Pro komunikaci s emacsem slouží spodní řádka, které představuje minibuffer.

Rychlosti psaní na emasu je možno docílit např. používáním klávesových zkratek. Kdo se je nechce učit anebo si je nadefinovat, měl by si zapamatovat alespoň několik základních:

C-g

C znamená, že držíme klávesu Ctrl a přitom stiskneme klávesu g. Tento příkaz keyboard-quit neudělá nic. Lépe řečeno, když něco zvržeme (zamotáme se ve složitějším příkazu a nechceme ho dokončit), je to úniková cesta zpátky.

C-h

znamená help. Minibuffber napoví: (Type ? for further options). To, když nevíme, jak dál, protože příkaz ještě neskončil. Takže vlastně samotné C-h ještě nic neznamená, musíme pokračovat v upřesnění, co vlastně chceme. Tak třeba C-h k podá popis klávesové zkratky, neboli spustí příkaz describe-key

M-x

M znamená, že držíme klávesu Meta (na PC klávesnici je to zpravidla klávesa Alt) a přitom stiskneme klávesu x. (Pokud máme např. X-windows nakonfigurovány tak hloupě, že nám klávesu Meta žerou, tak existuje obezlička, že namísto toho zmáčkneme ESC a teprve potom klávesu x.)

C-h k M-x

nám vysvětlí, jaký příkaz tato klávesová zkratka spouští:

ESC x runs the command execute-extended-command
(execute-extended-command PREFIXARG)
   which is an interactive built-in function.

Read function name, then read its arguments and call it.

Z toho se poučíme:

  • tento příkaz se jmenuje execute-extended-command
  • tento příkaz není nic jiného, než nějaká funkce. A to funkce:
    • vestavěná = byla zakompilovaná přímo do editoru emacs
    • je interaktivní = no to je právě ta, která se dá spouštět pomocí příkazu execute-extended-command :-)
  • interaktivní znamená, že s námi komunikuje, a to zpravidla pomocí minibufferu (ale klidně i jinak, třeba si otevře další okno, jako např. různé helpy)
  • ta komunikace, co je v první řadě předávání nějakých parametrů. A právě funkce execute-extended-command od nás očekává v minibufferu jméno funkce, kterou má vykonat.

Z toho plyne: komu vadí klávesové zkratky, učit se je nemusí. Stačí umět spustit funkci execute-extended-command a jakožto argument jí říci, co vlastně chceme. Veškeré editační příkazy můžeme provádět tímto způsobem, např. pohyby kursoru (říká se mu point neboli bod). Není to asi nejrychlejší metoda, ale funguje jistě:

  • backward-char
  • forward-char
  • previous-line
  • next-line

Komu se to zalíbí, tak aspoň dvě rady na drobné urychlení – podobně jako přeba u zadávání příkazů v bashi:

  • jako argument není třeba vyklofat celý název backward-char. Stačí třeba jen backw a klávesa TAB a v dolním okně se nám nabídnou další možnosti pokračování.
  • pro znovuvyvolání stejného argumentu si vyvoláme historii klávesou <up>.

A pak máme ještě jedna úžasná možnost: V případě, že už máme příkaz napsaný jako funkci (tj. jako výraz v závorkách), stačí bezprostředně za uzavírací závorku umístit kursor a klávesovou zkratkou C-x C-e vyvolat příkaz eval-last-sexp. A už to funguje skoro jako nějaký program! Umístíme kursor bezprostředně za uzavírací závorku výrazu níže uvedeného výrazu (forward-sexp) a budeme neustále opakovat klávesy C-x C-e (tj. při stále stisknuté klávese Ctrl opakujeme klávesy x, e):


(forward-sexp) (forward-sexp) (end-of-line) (beginning-of-line) (backward-sexp) (backward-sexp)

Jak nám ten kursor pěkně poskakuje sem a tam! Nakonec, dříve či později, skončíme chybou, něco jako:

Debugger entered--Lisp error: (void-variable <pre>)
  eval(<pre>)
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
* call-interactively(eval-last-sexp)

To proto, že před kursorem už se nenachází nic, co by mohl vnitřní interpreter Lispu vyhodnotit jako nějaký výraz. Ale aspoň jsme pochopili, že při práci v emacsu nám nějaký interpret Lispu běží. Z hlášky debuggeru vyskočíme klávesou q a rovnýma nohama vskočíme do další kapitoly:

(pokračování-příště)


References

editovat
  1. O vhodnosti či nevhodnosti výrazu elisp se vedou/vedly spory, protože elisp kdysi dávno znamenalo něco jiného.