Notatki o GNU Emacs

Uruchomienie edytora Emacs

Normalne uruchamianie to

emacs nazwa-pliku

Istnieje sposób uruchamiania edytora emacs ze specyfikacją kilku plików:

emacs plik1 +100 plik2
Jeżeli nie ma plików file1 i file2, to edytor utworzy je. Opcja +100 spowoduje ustawienie na setnym wierszu.

Wiele narzędzi wybiera edytor na podstawie wartości zmiennej powłoki EDITOR, można ją więc ustawić w shellu

EDITOR=emacs

Ustawienie tej zmiennej jako

EDITOR=emacsclient
powoduje, że program pocztowy mutt itp. narzędzia próbują otworzyć nowy bufor w istniejącej sesji (procesie) Emacsa.

Pracę z edytorem kończymy naciskając kolejno Ctrl-x Ctrl-c.

Klawisz pozwala korzystać z menu w trybie tekstowym.

Opcje

--unibyte
Wyłącza domyślny multibyte. Zamiast niej można ustawić zmienną enable-multibyte-characters na nil.

Nagłówek pliku

Pierwsza linia to nagłówek pliku. Tam umieszczamy informacje o wybranym trybie, na przykład

-*- C -*-  
powoduje przejście w tryb c-mode dla otwieranego bufora. Podstawowym trybem jest fundamental (nie trzeba wybierać). Zwykle tryby wiążą się z językiem, w którm jest napisany plik. Może to być język programowania, ale nie tylko, na przykład tryb LaTeX.

Jeśli nie podamy trybu w nagłówku to bufer otrzyma tryb na podstawie rozszerzenia nazwy pliku.

Oprócz wyboru trybu można w nagłówku umieszczać inne wskazówki, na przykład

-*- unibyte:t; -*-

Jednobajtowa interpretacja znaków.

To, co w systemie operacyjnym nazywamy oknem, w Emacsie jest nazywane ramką (\textit{frame}). Terminu okno używa się dla wewnętrznych okien w ramkach.

Konfiguracja

Głównym plikiem konfiguracyjnym jest default.el, z katalogu .../emacs/site-lisp/, np. /usr/share/emacs/site-lisp/.

Prywatne pliki konfiguracyjne użytkowników to .emacs.

Klawisz Meta

Polecenia w Emacsie wydaje się używając głównie klawiszy Control (etykietowanego Ctrl) oraz Meta (częściowo jego rolę na klawiaturze PC pełni klawisz Alt, najczęściej jednak przyciska się przed właściwym klawiszem klaswisz Escape).

Na starszych klawiaturach stacji Sun-SPARC klawisz Meta wyróżnia się kształtem karo, a jest umieszczony w pobliżu klawisza odstępu, nie jest to klawisz Alt. Na innych starszych klawiaturach stacji Sun występowały dwa klawisze pełniące funkcje klawisza Meta, oznaczono je Right i Left. W niektórych systemach Hewlett-Packard klawisz Meta występuje jako Extend Char. A na niektórych klawiaturach niewiadomego pochodzenia klawisz Meta jest oznaczany jako Meta.

Podstawowe polecenia

Ctrl-q (quoted-insert)

Wstawia do tekstu następujący po nim znak (klawisz) specjalny, zamiast wykonać jego funkcję.
Ctrl-x u (Ctrl-_)
Cofa ostatnie polecenie (,,undo'').
Ctrl-v (view-next-screen)
Służy do przechodzenia do następnej strony (zwykle to samo można osiągnąć używając klawisza PgDn lub Page Down na klawiaturze bocznej).
Meta-v (PgUp, PageUp).
Do cofania się do poprzedniej strony służy polecenie
Ctrl-p (previous-line, [strzałka w górę])
Ctrl-b (backward, [strzałka w lewo])
Ctrl-f (forward, [strzałka w prawo])
Ctrl-n (next-line, [strzałka w dół])
Służą do przesuwania kursora o jedną pozycję w odpowiednim kierunku.
Meta-f (Ctrl-[strzałka w prawo])
Przestawia kursor o jedno słowo do przodu.
Meta-b (Ctrl-[strzałka w lewo])
Przestawia kursor o jedno słowo do tyłu.
Ctrl-a
Powoduje przejście na początek wiersza
Ctrl-e
Powoduje przejście na koniec wiersza.

Powyższe polecenia (a także wiele innych) można poprzedzić argumentem, podającym liczbe powtórzeń. Argument taki podaje się naciskając Ctrl-u, następnie wpisując liczbę powtórzeń i podając właściwe polecenie, np. Ctrl-u 8 Ctrl-f przesuwa kursor o osiem znaków do przodu. Jeśli po Ctrl-u nie podamy żadnej liczby, to wartością domyślną jest 4.

Ctrl-g

Powoduje porzucenie przetwarzania bieżącego polecenia.
Ctrl-d (a także klawisz [Delete] lub [Del])
Usuwa bieżący znak.

Przy większych operacjach usuwania Emacs pamięta usuwane znaki. Ctrl-K (kill) usuwa wszystkie znaki od bieżącego do końca linii, zapamiętując usunięty materiał w specjalnym buforze cyklicznym (jeśli linia jest pusta, to usuwa znak końca linii). Kilka takich poleceń wydanych bezpośrednio po sobie zachowuje usunięty materiał jako pojedynczą jednostkę.

Aby wstawić ostatnio usunięty materiał z bufora w bieżącej pozycji kursora należy użyć polecenia Ctrl-y (yank). Polecenie Meta-y użyte natychmiast po nim powoduje zastępowanie go wcześniejszym materiałem.

Ctrl-x Ctrl-f

Pobiera nazwę pliku i otwiera bufor z jego zawartością. Do zachowania bieżacego bufora w jego pliku służy polecenie Ctrl-X Ctrl-S.
Meta-x find-file-literally
Otwierając bufor nie dokonuje konwersji formatu, kodów znaków ani automatycznej dekompresji
Ctrl-x i
Wstawia podany plik w bieżące miejsce w buforze i czyni go regionem.
Meta-x write-region
wypisuje region do podanego pliku
Meta-x append-to-file
dołącza region na koniec podanego pliku.

Szukanie i zastępowanie

Meta-Ctrl-s
Przeszukiwanie przy użyciu wyrażeń regularnych.
Meta-Ctrl-% (query-replace-regexp)
Zamiana (zastępowanie) napisów określonych przez wyrażenia regularne.

Prostokąty (bloki)

Ctrl-x r k
Usuwa prostokąt do kill ringu
Ctrl-x r d
Usuwa prostokąt na zawsze.
Ctrl-x r c
Wypełnia prostokąt spacjami (clear).
Ctrl-x r o
Wypełnia prostokąt spacjami, przesuwając resztę w prawo.
Ctrl-x r y
Wstawia prostokąt z kill bufora.

Mniej znane polecenia

Meta-x recover-session podobno przywraca po awarii sesję Emacsa.

Ctrl-l

Wyświetla na nowo zawartość bufora, umieszczając bieżącą linię w środku bieżącego okna. Przydaje się też ono czasem do odświeżenia zawartości okna.

Z opcją 0 (czyli Ctrl-u 0 Ctrl-l) przenosi bieżącą linię do góry okna.

Ctrl-t (transpose)
Zamienia miejscami poprzedni znak z bieżącym.
Meta-t
Zamienia miejscami słowa otaczające kursor
Ctrl-x Ctrl-t
Przestawia wiersz zawierający kursor i poprzedni wiersz. Argument podaje, z iloma liniami do przodu.
Ctrl-j (newline-and-indent)
Wstawia znak nowej linii, po czym wcina nową linię używając spacji.
Meta-^ (delete-indentation)
Dołącza bieżącą linię do poprzedniej, usuwając jednocześnie spacje z początkowego wcięcia.
Ctrl-x Ctrl-i (Ctrl-x Tab)
Zwiększ wcięcie regionu (o podany argument).

Aby usunąć znaki tabulacji (w żargonie edytora mówi się untabify) trzeba użyć polecenia Meta-X untabify.

Trzy polecenia służą do zamiany pocztu liter. Meta-c zmienia bieżącą małą literę na dużą, zaś wszystkie kolejne litery w słowie na małe. Meta-u zmienia na duże wszystkie litery w słowie poczynając od bieżącej, zaś Meta-l na małe litery.

Polecenie Ctrl-@ ustawia znacznik w bieżącym położeniu kursora. Obszar między znacznikiem a aktualnym położeniem kursora nazywa się regionem i wiele pleceń odnosi się właśnie do niego.

Region można usunąć poleceniem Ctrl-W, natomiast polecenie Meta-W powoduje skopiowanie regionu do bufora usuwania, nie usuwając go jednak. Kopię z bufora można teraz wstawić w inne miejsce poleceniem Ctrl-Y.

Zaznaczony fragment tekstu może zostać wcięty poprzez wykonanie polecenia Meta-C\.

Można cały zaznaczony fragment zamienić na wielkie (Ctrl-X Ctrl-U) lub małe (Ctrl-X Ctrl-L) litery.

Polecenie Meta-; (indent-for-comment) służy do formatowania komentarzy. Jeśli bieżący wiersz nie zawiera komentarza, kursor jest przenoszony do kolumny komentarza (z ewentualnym wstawianiem spacji) i zapisuje się tam znak średnika. Jeśli wiersz zawiera już komentarz, jest on ewentualnie wcinany spacjami do właściwego położenia, zaś kursor ustawiany za jego średnikiem.

Ctrl-H i (Meta-X info)

Uruchamia okno z trybem info.
Meta-x emacs-version
podaje numer wersji.
Ctrl-X Ctrl-Q
zmienia status bufora z read-only na read-write i odwrotnie.
Meta-o Meta-s
centruje bieżącą linię.
Meta-o Meta-S
centruje bieżący akapit.
Meta-q
Formatuje (wyrównuje) bieżący akapit.

Okna

Ctrl-X 2 (split-window-vertically)

Dzieli ramkę edycji na dwa okna o tej samej zawartości. Górne okno staje się oknem bieżącym.
Ctrl-X 4 c
tworzy i wyświetla bufor pośredni --- kopię bieżącego bufora.
Meta-x rename-uniquely
Zmienia nazwę bieżącego bufora dodając do niej liczbę. Przydaje się, by mieć kilka buforów typu shell: zmienić nazwę bieżącego na *Shell1*, po czym wykonać Meta-x shell. Podobnie dla buforów poczty, kompilacji itp.

Ramki

Z każdą ramką są związane jej własności. Zmiany własności dla ramek dokonuje się wyrażeniami

(add-to-list 'default-frame-alist '(font . "10x20"))
(add-to-list 'default-frame-alist '(background-color . "blue"))

Polecenie Meta-X speedbar tworzy dla bieżącej ramki dodatkową ramkę nawigacyjną. W ramce tej pokazane są pliki z wybranego katalogu, początkowo bieżącego. Na [+] należy klikać drugim przyciskiem myszy.

Jeśli istnieje plik TAGS, to klikając na plik powinniśmy zobaczyć jego tagi --- definiowane w nim symbole.

Tryby (modes)

Ctrl-h m (Meta-X describe-mode)

Opisuje podany tryb edycji.
Aby tekst był wyrównywany trzeba skorzystać z polecenia Meta-x automatic-fill-mode.

Lisp

Polecenie Meta-Ctrl-A (beginning-of-defun, beginning-of-definition) przestawia kursor na początek bieżącej definicji funkcji Lispu.

Polecenie Meta-Ctrl-E (end-of-defun, end-of-definition) przenosi kursor na koniec bieżącej definicji funkcji Lispu.

M-x run-lisp

Uruchamia interpreter Lispu, input i output będą w buforze *lisp*. Zmienna inferior-lisp-program podaje nazwę programu. Podobnie działa run-scheme.

Lokalizacja

Ctrl-h L
Ctrl-h Ctrl-l

Opisuje środowisko językowe.
Meta-x set-language-environment
Ustawia skrypt środowiska; można to też zrobić opcją current-language-environment albo umieszczając w pliku .emacs:
(set-language-environment "UTF-8")
Meta-x list-input-methods
Podaje wszystkie metody wprowadzania.

Kodowanie można podać w nagłówku pisząc np.

-*- coding:latin-2; -*-

Specjalne systemy kodowania: n-conversion, raw-text, emacs-mule.

Meta-x list-coding-systems

Podaje wszystkie systemy kodowania.
Ctrl-h C []
Opisuje system kodowania.

Korekty:

Ctrl-X f

Użyj tego kodowania dla aktualnego bufora.
Ctrl-X k
Użyj tego kodowania dla klawiatury.
Ctrl-X t
Użyj tego kodowania dla wyjścia na terminal.
Znaki: Ctrl-X =
Podaje informacje o bieżącym znaku, zwłaszcza jego kod.
Ctrl-U Ctrl-X =
Podaje rozszerzone informacje o bieżącym znaku.

Client-Server

Aby używać przetwarzania klient-serwer trzeba po pierwsze wykonać w oknie Emacsa mającego być serwerem

M-x server-start
a następnie wyołąć, na przykład w shellu, klienta Emacsa
emacsclient plik ...

Zwykle listę plików generujemy dynamicznie, np.

grep -l wzorzec `find -name "*.vala"` | xargs emacsclient
po czym w oknie serwera używamy Ctrl-X # do przechodzenia do następnego pliku (pamiętajmy o zachowaniu ewentualnych zmian).

Emacs Lisp

Obliczenia przeprowadza się zwykle w buforze *scratch*, podając wyrazenie do obliczenia i naciskając Ctrl-J. Wyrażenia do obliczenia w trakcie inicjowania edytora umieszcza się w pliku ~/.emacs.

W buforach Emacs Lispu (emacs-lisp-mode):

Ctrl-x Ctrl-e

Oblicza ostatnie wyrażenie przed kursorem, wynik w Echo Area.
Ctrl-Meta-x
Oblicza wyrażenie defun w okolicy kursora, także defvar.
Meta-x eval-region
Oblicza region
Meta-x eval-current-buffer
Oblicza cały bieżący bufor.
Meta-:
Czyta wyrażenie z minibufora i oblicza.

Zmienne

load-path

lista katalogów, z których są ładowane pliki, gdy nie podano pełnej nazwy. Jej wartość można zmieniać, np.
(setq load-path (cons "/home/nowy/katalog" load-path))
default-directory
podaje bieżący katalog.

Niektóre operacje w Emacsie wywołują jedną lub więcej funkcję-wtyczkę (hook). Wtyczka to zmienna ustawiana przez użytkownika, której wartością jest funkcja wtyczki. Pozwala to dopasowywać zachowanie Emacsa, , np. mapę klawiatury dla wybranego trybu. Wtyczki zwykle ustawiamy w pliku ~/.emacs file.

Wyrażenie (describe-variable nazwa) podaje dokumentację zmiennej.

Funkcje

(load "nazwa") ładuje podany plik. Szuka używając rozszerzeń .el, .elc i bez rozszerzenia. Zmiennaload-path podaje gdzie szukać.

(load-file "nazwa") ładuje podany plik.

(load-library "nazwa") ładuje podany plik.

Korekta ortograficzna

Edytor emacs dostarcza dwóch sposobów sprawdzania poprawności zapisu, jeden z nich korzysta z polecenia spell, drugi nie. Aby sprawdzić poprawność zapisu danego słowa należy wprowadzić kombinację Meta-$, która inicjalizuje polecenie spell. Polecenie to sprawdza zgodność pisowni słowa wskazywanego przez kursor i jeśli wyraz jest zapisany niezgodnie z wersją w słowniku, użytkownik jest proszony o wprowadzenie poprawnej wersji.

Inna metoda polega na skorzystaniu z polecenia ispell, które jest dostarczane z edytorem emacs. Nie jest ono jednak instalowane automatycznie i jego działanie zależy od konfiguracji.

Programowanie

Polecenie Meta-x compile uruchamia make w bieżącym katalogu, przechwytując wyniki. Tak naprawdę zwykle pyta o polecenie (shella) i wykonuje je, więc można wywoływać inne rzeczy. Wyniki w buforze *compilation*. Działa w tle.

Polecenie Ctrl-x ` próbuje analizować komunikaty o błędach i otwierać okna z plikami.

Ctrl-x 4 a dodaje nowe entry do ChangeLog.

Tagi

Plik TAGS tworzymy poleceniem shella

etags plik ...
Opcje
  • --language=nazwa auto none
  • --include=inny tagfile

Przykład użycia

find . -name "*.[chCH]" -print etags -

Polecenia Emacsa:

Meta-x visit-tags-table

Wybiera bieżące, domyślnie TAGS
Meta-. [tag>]
Znajduje definicję tag>, domyślnie bieżącego.
Ctrl-u Meta-.
Znajduje następną definicję.
Ctrl-x 4 .
To samo, ale w osobnym oknie.
Ctrl-x 5 .
To samo, ale w osobnej ramce.
Meta-x list-tags
Podaje wszystkie zdefiniowane w tym pliku.

Debugger

Zmienną debug-on-error ustawia się na t przy usuwaniu błędów.

Aby usunąć błędy w pliku inicjalnym należy wywołać edytor z pominięciem wczytywania tego pliku:

emacs -q
po czym obliczamy następujące wyrażenia
(setq debug-on-error t)
(load "~/.emacs")

Programy

Porównywanie

Ctrl-u Meta-x compare-windows

ignoruje różnice w whitespaces.
Meta-x diff
Porównuje pliki, otwierając bufor *diff* (ma tryb Compilation). Następnie Ctrl-X ' (albo backquote) wizytuje kolejne różnice w plikach, zaś Ctrl-c Ctrl-c idzie do plików źródłowych.
Meta-x diff-backup
porównuje plik z ostatnim backupem.
Meta-x diff-mode
włącza tryb diff do oglądania patchy. [??? Co to jest Ediff ???]

Poczta

Meta-X rmail lub Meta-X mail wywołuje mail-reader. Meta-X gnus wywołuje news reader.

Drukowanie

Plik ipp.el zawiera implementację Internet Printing Protocol. IPP, zdefiniowany przez Printer Working Group (\url{http://www.pwg.org/}, ma być następcą protokołu LPD do komunikacji z drukarkami sieciowymi. Plik ten to częściowa implementacja klienta protokołu, wystarczająca do wysłania zadania do drukarki, odpytywania drukarki oraz do oglądania kolejki wydruku. [Version 0.5 2001-04-25, under GNU GPL.]