Emacs/Elisp

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

Emacs Lisp (w skrócie elisp) jest to dialekt języka Lisp bardzo podobny do Common Lispa.

Lisp jest drugim, po Fortranie, najstarszym językiem programowania w użyciu. Chociaż społeczność Lispa jest aktywna, to obecnie jest bardzo mała.

Pierwszy program[edytuj]

Jest na to kilka sposobów :


M-:[edytuj]

Wprowadź skrót :

M-:

za pomocą 3 klawiszy. Naciśnij i trzymaj :

  • 'Alt'
  • 'Shift'
  • ':'

Otwiera to w minibuforze miejsce na wprowadzenie jednego wyrażenia :

Eval : 

Teraz możesz wprowadzić wyrażenie Lispa :

(+ 1 2)

i nacisnąć enter. Wynik otrzymasz w minibuforze :

3 (#o3, #x3)

*scratch*[edytuj]

Otwórz bufor *scratch*.

Wpisz komendę :

(+ 1 2 )

Umieść kursor wyrażeniem i wprowadź skrót :

C-j

Wynik będzie poniżej :

3

eval-expression[edytuj]

Wprowadź skrót Emacsa

M-x

Wpisz polecenie elispa

eval-expression

i naciśnij enter

W tym samym buforze wpisz wyrażenie lispa, które chcesz wykonać :

(+ 1 2)

i naciśnij enter . Otrzymasz wynik

3 

w tym samym buforze ( i w *messeges*)

C-x C-e[edytuj]

W dowolnym buforze wprowadź wyrażenie Lispa ( oznaczające dodanie 1 i 2 ) [1]

(+ 1 2)

Umieść kursor za zamykającym nawiasem i wprowadź polecenie Emacsa : eval-last-sexp za pomocą skrótu :

C-x C-e 

(naciśnij klawisz "Ctrl" i nie puszczaj, naciśnij drugi klawisz "x", następnie Ctrl i e).

Wynik zobaczysz w minibuforze  :

3

Gratulacje ! Wykonałeś pierwszy program w Lispie !

eval-region[edytuj]

Zaznacz cały tekst.

Wprowadź polecenie

M+x eval-region

Zobaczysz rezultat :

3

Notacja[edytuj]

Kod Elisp-a (tak jak innych Lisp-ów) składa się z S-Wyrażeń (które składają się z list elementów oddzielonych spacją ujętych w nawiasy) np:

(+ 1 2 3 (* 8 91 (/ 2 10)))

Lisp używa notacji prefiksowej tzn. powyższe wyrażenie obliczy 1 + 2 + 3 + (8 * 91 * (2 / 10)) W lisp-ie pierwszy element listy jest to funkcja lu makro które zostanie wywołane z pozostałymi elementami listy jako parametrami. Jeśli jakiś element tej listy jest także listą to to wyrażenie zostanie najpierw obliczone. Wyjątkiem są makra. Jeśli pierwszym elementem wyrażenia jest makro, wyrażenia nie są obliczane tylko przekazane do makra jako dane, które zostaną przez nie przetworzone. Obliczony zostanie wynikowy kod zwrócony przez makro.

Funkcje[edytuj]

Za pomocą elisp-a możemy łatwo rozszerzyć Emacs-a o nowe funkcje. Jeśli chcemy aby dana funkcja była dostępna w Emacs-sie należy otworzyć bufor w trybie emacs-lisp-mode, który możemy uruchomić za pomocą klawiszy `M-x emacs-lisp-mode'. Bufor *scrach*, początkowy bufor jest uruchomiony w tym trybie. Komenda `M-:' oblicza wyrażenie w buforze.

Jeśli chcemy aby dane funkcje były uruchamiane przy starcie Emacs-a należy umieścieć je w pliku .emacs.

Aby zdefiniować funkcje należy użyć wyrażenia defun.

(defun add-20 (x)
  (+ x 20))

(defun square (x)
  (* x x))

W powyższym przykładzie zdefiniowano dwie funkcje add-20 i square.

Skróty klawiszowe[edytuj]

Skróty klawiszowe Emacsa pozwalają wywołać funkcję za pomocą klawiszy , np.

`M-x' 

Dynamiczne[edytuj]

W definicji funkcji należy jako pierwsze wyrażenie wywołać funkcję interactive.

(defun hello ()
  (interactive)
  (message "hello world!"))

Po obliczeniu powyższego wyrażenia możemy wywołać funkcję za pomocą `M-x hello'

Globalne[edytuj]

Jeśli chcemy aby jakaś funkcja była wywoływana za pomocą jakiejś kombinacji klawiszy należy użyć poniższego wyrażenia.

(global-set-key (kdb "C-c C-h") 'hello)

Haki[edytuj]

Jeśli chcemy aby dany skrót klawiszowy był uruchamiany tylko w danym trybie emacs-a należy się posłużyć tzw. hakami (jest to kod który zostanie wywołany kiedy uruchamiany jest jakiś tryb emacs-a).

(add-hook 'text-mode-hook
    (lambda ()
        (define-key text-mode-map (kbd "<F5>") 'nazwa-funkcji)))

Bibliografia[edytuj]

  1. xahlee emacs_fun