Emacs
Z Wikiverzity
Emacs (viz w:emacs) je textový editor. První kroky začátečníků může vést upovídaný Emacs-tutoriál. Zde uvedené heslo je pouze souhrnem základních příkazů a jiných How-to.
Obsah |
[editovat] Základní příkazy
| Klávesa 1 | Anebo1 | Popis2 | Poznámka |
|---|---|---|---|
| C-x C-s | save-buffer | 3) | |
| C-x C-c | save-buffers-kill-emacs | 4) | |
| C-b | left | backward-char | |
| C-f | right | forward-char | |
| C-p | up | previous-line | |
| C-n | down | next-line | |
| M-b | C-left | backward-word | |
| M-f | C-right | forward-word | |
| M-{ | C-up | backward-paragraph | |
| M-} | C-down | forward-paragraph | |
| M-v | prior | scroll-down | 5) |
| C-v | next | scroll-up | 5) |
| C-a | beginning-of-line | ||
| C-e | end-of-line | ||
| M-< | home | beginning-of-buffer | 3) |
| M-> | end | end-of-buffer | 3) |
| insert | overwrite-mode | 6) | |
| C-d | delete | delete-char | |
| DEL | delete-backward-char | 7) | |
| C-k | kill-line | ||
| C-w | kill-region | ||
| M-w | kill-ring-save | 8) | |
| C-y | yank | ||
| C-s | isearch-forward | 9) | |
| C-r | isearch-backward | 9) | |
| M-% | query-replace | ||
| C-_ | undo |
Poznámky:
1) V prvních dvou sloupečcích jsou uvedeny defaultní klávesy. V prvním sloupečku jsou "standardní" kombinace, které by měly fungovat na jakékoliv alfanumerické klávesnici. Druhý sloupeček ukazuje využití klávesnice PC, vybavené kursorovými a dalšími speciálními klávesami.
2) Ve třetím sloupečku jsou jména příkazů. Předpokládám, že budou srozumitelné i pro ty, kterým angličtina činí potíže.
3) Během editace je soubor z disku natažen do bufferu, tj. vyhrazené části paměti, ve které probíhají změny. Proto se nehovoří o uložení 'souboru', ale o uložení bufferu.
4) Před ukončením (dosl. 'zabitím') Emáče je zkontrolováno, jsou-li uloženy všechny změny z bufferů na disk.
5) 'prior' označuje na PC klávesnici klávesu PgUp, 'next' klávesu PgDn. Je zřejmé, že při povelu 'o stránku (obrazovku) výš' musí text rolovat dolů, při 'stránce níž' naopak nahoru.
6) Normálně se Emáč spustí v 'insert módu', kdy nový text je vpisován mezi starý. Klávesa 'insert' zapíná a vypíná 'overwrite' mód, ve kterém nově psaný textr přepisuje starý. Tento mód je signalizován na stavovém (předposledním) řádku návěštím 'Ovwrt'.
7) 'DEL' zde (z historických důvodů) označuje klávesu 'backspace'. Označení pro další speciální klávesy jsou např: RET, TAB, LFD, ESC, SPC
8) 'kill-ring' označuje kruhovou frontu, do které se ukládají všechny vymazané části textu. Viz dále.
9) 'isearch' označuje 'inkrementální (přírůstkové) vyhledávání': už během zadávání hledaného výrazu editor vyhledává odpovídající řetězce.
O stisku kláves, spojených symbolicky pomlčkami, např. C-a nebo M-%, budeme hovořit jako o 'klávese' (key). Pokud k vykonání nějakého příkazu stačí takováto 'klávesa', budeme ji nazývat 'kompletní' (complete key). V některých případech - např. uložení souboru nebo ukončení Emascu, viz první dva příklady - musíme napřed stisknout C-x a pak ještě další klávesu, neboť C-x samo o sobě nepředstavuje žádný příkaz, je to jen jakási "předložka" - proto takovou klávesu nazýváme prefixovou (prefix key).
[editovat] emacs a wiki
Často se stane, že chceme přesunout na wiki nějaký text, který je formátovaný do řádků určité délky a odstavce jsou od sebe odděleny prázdným řádkem. Wiki naproti tomu potřebuje takové formátování zdrojových textů, kde celý odstavec je napsaný na jednom řádku. Problematiku zalamování řádků do odstavců emacs nazývá slovem filling.
Emacs v textovém módu může pracovat v zásadě ve dvou minor módech. V jednom módu se vstupní text píše neustále do jedné řádky, dokuď nestiskneme Enter. Abychom takový dlouhý řádek na obrazovce viděli, je pokračování řádku opticky naznačeno znakem \ na koci, aniž by se ovšem tyto znaky \ staly součástí textu. Naproti tomu v tzv. auto-fill-mode dochází k zalomení řádky (tj. vložení znaku nový řádek do textu) automaticky po překročení nastavené šířky sloupce. auto-fill-mode se přepíná (tj. zapíná a opět vypíná) příkazem:
M-x auto-fill-mode
Obvyklá šířka sloupce, tj. délka maximální délka řádky v tomto módu, je nastavena na 70 znaků. Změnit ji můžeme příkazem C-x f, tj. Set the fill column (set-fill-column). Tomuto příkazu ovšem musí předcházet argument, kterým určíme požadovaný počat znaků (argument vkládáme příkazem C-u).
Odstavec, který máme naformátovaný na nějakou šířku, můžeme přeformátovat příkazem M-q Fill current paragraph (fill-paragraph), pokud si předtím nastavíme vhodnou šířku sloupce. Více odstavců můžeme přeformátovat příkazem M-x fill-region, tj. Fill each paragraph in the region (fill-region).
Pomocí výše uvedených příkazů jíž můžeme přeformátovat všechny odstavce v bufferu. Idea bude následující:
- nastavíme si šířku sloupce na dostatečně velkou hodnotu, dejme tomu 10000 znaků: C-u 10000 C-x f
- nastavíme pointer na začátek bufferu: M-<
- označíme si začátek regionu: C-space
- odjedeme na konec bufferu - tam tím pádem budeme mít konec regionu: M->
- přeformátujeme všechny odstavce: M-x fill-region
Celá sekvence příkazů v klávesových zkratkách pak bude následující:
C-u 10000 C-x f M-< C-space M-> M-x fill-region
[editovat] emacs a perl
K editování zdrojových souborů v různých jazycích existují různé mody. Pokud máme nainstalovanou distribuci debian anebo nějakou z ní odvozenou, např. ubuntu, Morphix či jinou, založenou na balíčkovacím systému dpkg (tj. balíky s příponou .deb), pak většinu takovýchto základních módů budemem mít v balíku emacs21-el (pro emacs verse 21.x). Které módy máme k disposici pro jazyk perl, zjistíme:
dpkg -L emacs21-el | grep perl
Já jsem dostal odpověď:
/usr/share/emacs/21.4/lisp/progmodes/perl-mode.el /usr/share/emacs/21.4/lisp/progmodes/cperl-mode.el
Po různých diskusních skupinách jsem vypátral všeobecně rozšířenou domněnku, že mód perl-mode bude nejspíš původní mód, zatímco cperl-mode nějaký novější a dokonalejší (jistě to neví asi nikdo, v originální dokumentaci to zřejmě nenajdete) a proto většina lidí používá cperl-mode.
Pokud se rozhodnete editovat např. soubor test.pl, pak emacs (ve své implicitní konfiguraci) podle přípony .pl usoudí, že hodláte editovat perlovský skript a podle toho nastaví i minor mode.
Zajímavé je například chování tabelátoru, tj. klávesy TAB. Co v našem módu provádí zjistíme:
C-h c TAB
– obdržíme např:
TAB runs the command perl-indent-command
Z toho zjistíme, že máme v konfiguraci perl-mode. Což jsme ostatně viděli už ze stavové řádky, kde se zobrazuje (Perl). V případě cperl-mode obdržíme např:
TAB runs `cperl-indent-command'
o kterém se můžeme dočíst:
`cperl-indent-command' is an interactive compiled Lisp function -- loaded from "cperl-mode" (cperl-indent-command &optional WHOLE-EXP) Documentation: Indent current line as Perl code, or in some cases insert a tab character. If `cperl-tab-always-indent' is non-nil (the default), always indent current line. Otherwise, indent the current line only if point is at the left margin or in the line's indentation; otherwise insert a tab. A numeric argument, regardless of its value, means indent rigidly all the lines of the expression starting after point so that this line becomes properly indented. The relative indentation among the lines of the expression are preserved.
[editovat] emacs a octave
[editovat] emacs a UTF-8
Emacs od verze tuším 21 je dobře vybaven pro editaci v UTF-8. Většinou postačí mít správně nastavené locale. Problém může nastat, když máme nastavené locale např. na ISO-8859-2 a potřebujeme editovat nějaký dokument v UTF-8 (či jiném kódování).
Emacs je vybaven MULE, (MUltiLanguage Emacs) a měl by se snažit automaticky rozpoznávat kódování editovaných dokumentů. Jenže ne vždy je to možné a tak mohou nastat problémy, které pak potřeba řešit použitím vhodných příkazů. Např:
C-x RET c runs the command universal-coding-system-argument which is an interactive compiled Lisp function in `international/mule-cmds'. (universal-coding-system-argument) Execute an I/O command using the specified coding system.
Znamená to, že použijeme sekvenci Ctrl-X, poté RETURN a poté ještě c. V minibufferu budeme dotázáni na kódování, které si přejeme. Odpovíme např. utf-8 (malými písmeny). Následující příkaz pak bude vykonán s tím, že emacs použije toto kódování. Pokud tedy otevřeme v bufferu nový soubor příkazem:
C-x C-f runs the command find-file which is an interactive compiled Lisp function in `files'. (find-file FILENAME &optional WILDCARDS) Edit file FILENAME. Switch to a buffer visiting file FILENAME, creating one if none already exists. Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files. Wildcard expansion can be suppressed by setting `find-file-wildcards'.
pak se soubor načte v kódování UTF-8 a je možno jej normálně editovat a pak normálně uložit.
Podrobněji se o práci z různým kódováním dočteme v manuálu, kapitola: 27 International Character Set Support http://www.gnu.org/software/emacs/manual/html_node/emacs/International.html#International, podkapitola 27.11 Specifying a Coding System for File Text http://www.gnu.org/software/emacs/manual/html_node/emacs/Text-Coding.html#Text-Coding
Pro změnu kódování souboru, již načteného v bufferu se zde uvádí příkaz C-x <RET> r (revert-buffer-with-coding-system), ten jsem ale ve své instalaci emacs 21 v Debianu neobjevil.
Měl by se dát také použít příkaz C-x <RET> f (set-buffer-file-coding-system):
C-x RET f runs the command set-buffer-file-coding-system which is an interactive compiled Lisp function in `international/mule'. (set-buffer-file-coding-system CODING-SYSTEM &optional FORCE) Set the file coding-system of the current buffer to CODING-SYSTEM. This means that when you save the buffer, it will be converted according to CODING-SYSTEM. For a list of possible values of CODING-SYSTEM, use M-x list-coding-systems. If the buffer's previous file coding-system value specifies end-of-line conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is merged with the already-specified end-of-line conversion. If the buffer's previous file coding-system value specifies text conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is merged with the already-specified text conversion. However, if the optional prefix argument FORCE is non-nil, then CODING-SYSTEM is used exactly as specified. This marks the buffer modified so that the succeeding C-x C-s surely saves the buffer with CODING-SYSTEM. From a program, if you don't want to mark the buffer modified, just set the variable `buffer-file-coding-system' directly.
ale tento příkaz mi pro špatně načtený soubor v bufferu nefunguje, proto používám kombinaci C-x RET c a poté C-x C-f, jak jsem uvedl výše.
Pro zrychlení práce ale většinou uvádíme jméno editovaného souboru již na příkazové řádce, např:
emacs muj_unicodovy_soubor
V tom případě by se mohlo dát uvést příslišnou lispovou funkci uvést rovněž na příkazovou řádku:
emacs -f ...
ale dosud se mi nepodařilo zjistit, co dál.
Jinou možností, namísto C-x RET c, je dát zvolený kódovýá systém do preferencí s nejvyšší prioritou, a to příkazem
M-x prefer-coding-system
Další možností, pokud chceme editovat více souborů v nějakém kódování, je nastavit proměnnou current-language-environment např. v konfiguračním souboru ~/.emacs:
(set current-language-environment 'utf-8)
ale to také může hodit chybu, pokud už máme nějak nastavené locale.
Takže nejlepší asi bude přenastavit si na tu chvíli locale:
$ export LANG=cs_CZ.utf8
s výsledkem:
a pak už Emacs načítá soubory v utf-8, i když při spuštění ohlásí varování:
Warning: locale not supported by C library, locale unchanged
Problém ale nastal v tom, že emacs přestal reagovat na české klávesy. Soubor se zobrazil dobře, ale nešel česky editovat. (Možná to ale bylo tím, že sem předtím chybně uvedl cz_CZ). Tak jsem to vzdal a překonfiguroval si locales v systému (v Debianu):
# dpkg-reconfigure locales
a jako defaultní uvedl cs_CZ.UTF8 a je to bez problémů.
[editovat] Konfigurační soubor .emacs
Co může občas pomoci (třeba při problémech s clipboardem):
(set-default-coding-systems 'utf-8) (set-keyboard-coding-system 'utf-8) (set-clipboard-coding-system 'utf-8)
[editovat] Externí reference
- Domácí stránka projektu emacs
- EmacsWiki
- Czech GNU Emacs Site – Dokumentace
- Seriály na rootu:
- Stanislav Kuchár (2000): Emacs: viac než len editor (7 dílů)
- Jan Kohout (2001): Emacs pro mírně pokročilé (11 dílů)
- XEmacs