Emacs/Elisp
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 programEdytuj
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-expressionEdytuj
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-eEdytuj
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-regionEdytuj
Zaznacz cały tekst.
Wprowadź polecenie
M+x eval-region
Zobaczysz rezultat :
3
NotacjaEdytuj
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.
FunkcjeEdytuj
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 klawiszoweEdytuj
Skróty klawiszowe Emacsa pozwalają wywołać funkcję za pomocą klawiszy , np.
`M-x'
DynamiczneEdytuj
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'
GlobalneEdytuj
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)
HakiEdytuj
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)))