Installfest: Úvod do Emacsu
Osnova, podle které jsem jel na dnešním workshopu na Installfestu.
Co je Emacs?
- Všestranný textový editor
-
Interpret Lispu (v jazyce C) + spousta Lispového kódu
- C: 280 kLoC (20%), Lisp: 1 MLoC (80%)
- Srovnání – Firefox: 6 MLoC C/C++, 3.6 MLoC JavaScript+HTML
- Emacs = Editor MACroS nebo Esc-Meta-Alt-Ctrl-Shift :)
- Plnohodnotný operační systém :) (
M-x tetris,M-x doctor) - Začal vznikat v 70. letech

Terminologie
- Poplatná době vzniku
- Buffer = otevřený soubor
-
Okno (window) = část obrazovky editoru zobrazující buffer
- Jedno okno zobrazuje právě jeden buffer
- Jeden buffer může být zobrazován nula až N okny
-
Frame = to čemu dneska říkáme okno
- Může být grafický nebo textový (terminál)
Základní klávesové zkratky
- Mnoho jich je stejných jako v bashi
- Dobře se používají i na exotických klávesnicích (kámošův notebook, BT klávesnice k mobilu/tabletu, …)
- Notace: C = Control, M = Meta = Alt = Esc, S = Shift
Kurzor
- C-b = backward char, C-f = forward char, C-p = prev line, C-n = next line
- M-b = backward word, M-f = forward word, M-p = prev ???, M-n = next ???
- C-a = home, C-e = end
- M-a = backward sentence, M-e = forward sentence
Mazání
- C-d = znak, M-d = slovo
- C-k = do konce řádky
Příkazy
- C-x C-f = find (open) file
- C-x C-s = save file
- C-x C-c = "exit"
- C-x u, C-_, C-/ = undo
Pozn.: C-x je tzv. prefixová klávesa, podobně jako Esc
- C-l = redisplay, center, …
- C-g = přeruší právě vykonávanou operaci (mačkat, když Emacs nereaguj)
Hledání
- C-s = interactive search, C-M-s = interactive regexp search
- C-r = reverse search
Prefix/numeric argument
- Neplést s prefixovou klávesou
- Mnohým příkazům (klávesovým zkratkám) lze předat číselný parametr
- Většinou to znamená opakování
- C-u 8 C-f – posun o 8 znaků doprava
- M-8 C-f – to samé
- C-u samotné modifikuje některé příkazy i bez čísla (C-u C-x C-c = vše ulož a "exit")
Příkazová řádka
- M-x <příkaz>
- Mini-buffer – většina klávesových zkratek stejná jako při editaci normálních bufferů (souborů)
- tab-completion
-
completion "modes"
- Příkaz je lispovská funkce označená jako
(interactive). - Klávesové zkratky spouští příkazy – viz
(global-set-key ...).
Velké (major) a malé (minor) módy
- V Emacsu se vše motá kolem "módů"
-
Velký mód:
- definuje zvýrazňování syntaxe,
- definuje klávesové zkratky,
- implementuje (automatické) zarovnávání kódu,
- vybírá se automaticky podle přípony nebo obsahu souboru,
- lze ho vybrat i manuálně (spuštěním příkazu
*-mode; např.c-mode).
-
Malý mód:
- Implementuje dodatečnou funkcionalitu, kterou má smysl používat s vícero velkými módy.
-
Příklady:
- flyspell-mode
- auto-fill-mode
- hide-show-mode
- Jaké módy jsou momentálně aktivní naznačuje Mode line.
Přístup k nápovědě
- Emacs má poměrně dobrý systém nápovědy.
-
C-h prefix key
- C-h f – funkce
- C-h v – proměnné
- C-h k – klávesová zkratka
- C-h m – mód
-
C-h i – prohlížeč info stránek (C-h i m Emacs <RET>)
- Navigace: 'n', 'p', '[', ']'
- 'i' – hledání v rejstříku (pak ',')
M-x man
Bloky (region, rectangle)
- Nové verze Emacsu (konečně) podporují výběr pomocí S-<šipky>.
- Tradičně: blok je oblast od "značky" ke kurzoru (point).
- C-SPC = polož značku
-
Ctrl-C, Ctrl-V, Ctrl-X – standardně nefunguje, lze zapnout
M-x cua-mode.- Ctrl-C koliduje s mnoha standardními zkratkami; cua-mode to částečně řeší.
-
Tradičně:
- Smazaný text se ukládá do "kill ringu" (např. C-k, M-d)
- C-y (yank) vloží hodnotu z konce "kill ringu"
- M-y (následující po C-y) vkládá starší hodnoty z "kill ringu".
- C-w = kill region
- M-w = "copy" region
-
Obdélníkové bloky
- C-x r * – neintuitivní (aspoň pro mne)
-
C-x SPC = rectangle mark mode
M-x string-insert-rectangle– vloží stejný text na každou řádku bloku
-
CUA mode: C-RET = cua-set-rectangle-mark
- string-insert-rectangle není potřeba; stačí začít psát
- ve výjimečných případech se chová podivně
Správa oken a bufferů
-
Správa oken
- není ideální
- C-x 2, C-x 3 = rozděl okno vertikálně/horizontálně
- C-x o = přesun na následující okno
- Windmove package – pohyb mezi okny podle směru (např. S-<šipky>)
- C-x 0 = smaž aktuální okno (ale ne buffer)
- C-x 1 = smaž ostatní okna
-
Přepínání bufferů
- C-x <left>/<right>
- C-x b = zadat název bufferu (použitelné s completion módy)
- C-x C-b (polo) interaktivní výběr bufferu
- M-x ibuffer = interaktivní výběr bufferu
- M-x helm-buffer-list = dtto
Užitečné příkazy/klávesové zkratky
- M-q = přeformátování odstavce (v mnoha módech inteligentní)
-
C-s = interactive search, C-M-s = interactive regexp search
-
V příkazové řádce hledání:
- C-s – minulé hledání
- C-w – doplní slovo pod kurzorem
- M-c – přepne rozlišování malých a velkých písmen
- M-e – editace (např. minulého hledání po C-s C-s)
-
- M-% = nahrazení řetězce
- C-M-S-% = nahrazení regulárního výrazu
- M-/ = doplň rozepsané slovo podle předchozích slov
- Macros: F3 = začátek nahrávání, F4 = konec nahrávání/spuštění
- Nahrazení textu ve víc souborech najednou:
M-x dired-mode, mark (m),Q M-x occurM-x rgrep- M-; comment-dwim (do what I mean)
- C-M-a = beginning-of-defun, C-M-e = end-of-defun
- C-M-p, C-M-n, C-M-u = pohyb po závorkami ohraničených blocích (prev, next, up)
- C-u C-SPC – návrat na místa předchozí editace
Konfigurace, "Customization"
- Možnosti konfigurace jsou nekonečné
- Předkonfigurovaný Emacs: Emacs Prelude
-
Standardní konfigurační soubor
~/.emacsnebo~/.emacs.d/init.el.- Nastavování proměnných
- Konfigurace klávesových zkratek
(global-set-key (kbd "C-c w") 'toggle-truncate-lines) - Definice vlastních příkazů
- Zapínání minor módu
-
Customization
UserHacker-friendly konfigurace- +GUI+TUI pro konfiguraci skoro všeho
M-x customizeM-xcustomize-{variable,face,group}- Není potřeba ručně editovat
~/.emacs
File/directory-local variables
- Konfiguraci Emacsu lze ukládat i do editovaných souborů.
- Podobně je možné konfiguraci uložit do souboru
.dir-locals.ela pak bude platit pro všechny soubory v daném adresáři a jeho podadresářích. M-x add-file-local-variableM-x add-dir-local-variable
/* Local Variables: */
/* compile-command: "make CFLAGS='-g -O0 -Wall" */
/* End: */Programování
-
Odsazování
- většinou automatické, nebo po <TAB>
-
inteligentní zarovnávání všeho
- 'M-q' v komentáři zarovná komentář
-
Kompilace
- M-x compile, M-x recompile
- M-x next-error (skáče na chyby, detekce mnoha kompilátorů/formátů chybových hlášení)
-
Doplňování kódu
- auto-complete-mode
- company-mode (asi lepší)
- yasnippet (TextMate snippets in Emacs)
- Často možnost interakce s interpretrem skriptovacích jazyků (např. v
M-x python-shell-send-defun) -
Verzovací systémy
vc– stejné klávesové zkratky pro všechny VCS (např.C-x v =– diff aktuálního souboru)- magit – speciální mód pro práci s gitem
Užitečné módy
-
auctex – pokročilý editor na *TeXové dokumenty
- navigace po sekcích, promote/demote sekcí
- integrace s BibTeXem pro snadné hledání/vkládání citací
- náhledy rovnic a obrázků přímo v editovaném textu
-
org-mode – tvorba a organizování poznámek, TODO seznamů, plánování projektu, tvorba dokumentů atd.
- tato prezentace je v org módu
-
dired-mode – správa souborů
- C-x d, C-x C-f (adresář)
- mazání souborů: označit 'd', smazat 'x'
-
TRAMP
- vzdálená editace (kompilace, …) souborů
- SSH, sudo, …
- notmuch – lokální "gmail" (rychlé vyhledávání), GUI v Emacsu
- shell, eshell – práce s příkazovou řádkou bez opuštění Emacsu
Instalace balíků třetích stran:
M-x list-packages- MELPA repozitář balíků
emacsclient
- Emacs většinou dlouho startuje
-
Doba startu záleží na uživatelské konfiguraci
- Inicializace balíků při startu vs. autoload
-
Emacs lze pustit jako "server" (
emacs --daemon) a připojovat se k němu pomocí programuemacsclient.-
Nic se nemusí konfigurovat, emacsclient si spustí emacs sám:
#!/bin/sh exec emacsclient -a '' "$@"
-
- K jednomu serveru se lze připojit současně z různých terminálů (lokálně X-windows, vzdáleně přes SSH).
Úvod do Emacs Lispu
-
(Emacs) Lisp
- C-h i m Elisp <RET>
- Je jednodušší než např. Common Lisp
- Program i data vypadají stejně (S-výrazy/S-expressions/sexp)
-
Vyhodnocení výrazu:
- číslo je číslo, řetězec je řetězec
-
seznam: první prvek udává jméno funkce, ostatní prvky jsou parametry.
(message "Ahoj") (message (concat "Ahoj" "Installfest"))
-
Proměnné:
-
globální:
(defvar xyz 0) -
lokální:
(let (a b) <kód>)
-
-
Funkce:
(defun fs-czech () "Starts flyspell with czech dictionary" (interactive) ; Způsobí, že fs-czech se dá spustit pomocí M-x (flyspell-mode) (ispell-change-dictionary "czech") (flyspell-buffer))
Příklad použití elispu
-
Navigace po framech v LaTeX beameru
(defconst latex-beamer-frame-re ; Regulární výraz, který budeme hledat "\\\\\\(frametitle\\|section\\){") ; '\' se musí 2x escapovat (defun is-outside-of-comment () (null (nth 8 (syntax-ppss)))) (defun latex-beamer-previous-frame () (interactive) (while (progn (re-search-backward latex-beamer-frame-re) (not (is-outside-of-comment)))) (recenter 0)) (defun latex-beamer-next-frame () (interactive) (when (looking-at-p latex-beamer-frame-re) (forward-char)) (while (progn (re-search-forward latex-beamer-frame-re) (not (is-outside-of-comment)))) (goto-char (match-beginning 0)) (recenter 0)) (add-hook 'LaTeX-mode-hook (lambda () (local-set-key (kbd "M-p") 'latex-beamer-previous-frame) (local-set-key (kbd "M-n") 'latex-beamer-next-frame)))
In-line elisp
- C-x C-e = vyhodnoť výraz před kurzorem (point)
- Kusy elispu lze vkládat do komentářů programů v jiných jazycích a spouštět přímo tam.
\chapter*{List of Acronyms}
% Sort acronyms: (let ((sort-fold-case t)) (sort-regexp-fields nil "^[[:space:]]*\\\\acro\{\\([^}]*\\)\}.*$" "\\1" (search-forward "\\begin{acronym}") (search-forward "\\end{acronym}")))
\begin{acronym}[XXXXX]
\acro{AC}{Access Category}
\acro{ACK}{Acknowledge}
\acro{BFQ}{Budget Fair Queuing}
\end{acronym}