Osnova, podle které jsem jel na dnešním workshopu na Installfestu.
Obsah
- 1. Co je Emacs?
- 2. Terminologie
- 3. Základní klávesové zkratky
- 4. Příkazová řádka
- 5. Velké (major) a malé (minor) módy
- 6. Přístup k nápovědě
- 7. Bloky (region, rectangle)
- 8. Správa oken a bufferů
- 9. Užitečné příkazy/klávesové zkratky
- 10. Konfigurace, “Customization”
- 11. File/directory-local variables
- 12. Programování
- 13. Užitečné módy
- 14. emacsclient
- 15. Úvod do Emacs Lispu
- 16. Příklad použití elispu
- 17. In-line elisp
1. 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
2. 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)
3. 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
3.1. 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
3.2. Mazání
- C-d = znak, M-d = slovo
- C-k = do konce řádky
3.3. 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)
3.4. Hledání
- C-s = interactive search, C-M-s = interactive regexp search
- C-r = reverse search
3.5. 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”)
4. 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 ...)
.
5. 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.
6. 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
7. 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ě
8. 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
9. 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)
- V příkazové řádce hledání:
- 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 occur
M-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
10. Konfigurace, “Customization”
- Možnosti konfigurace jsou nekonečné
- Předkonfigurovaný Emacs: Emacs Prelude
- Standardní konfigurační soubor
~/.emacs
nebo~/.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 customize
M-x
customize-{variable,face,group}- Není potřeba ručně editovat
~/.emacs
11. 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.el
a pak bude platit pro všechny soubory v daném adresáři a jeho podadresářích. M-x add-file-local-variable
M-x add-dir-local-variable
/* Local Variables: */ /* compile-command: "make CFLAGS='-g -O0 -Wall" */ /* End: */
12. 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
13. 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ů
14. 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).
15. Ú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))
16. 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)))
17. 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}