На първо място, ще призная, че съм пъленначинаещ в Emacs и ELisp (и общо взето Lisp) и аз се натъкнах на грешка, която ме накара да се счупя от доста време, докато се опитвах да напиша моя файл .emacs.
Ето минимум пример за код, необходим за възпроизвеждане на проблема (т.е. имащи .emacs, съдържащи само следното):
(defun define-esc-key (keybind)
(define-key key-translation-map (kbd keybind) "my-esc))
(define-esc-key "M-j")
Това ще доведе до следната грешка с Emacs23:
Lisp error: (wrong-type-argument integer-or-marker-p keybind)
read-kbd-macro(keybind)
#[(keys) "301!207" [keys read-kbd-macro] 2 2186954](keybind)
(kbd keybind)
(define-key key-translation-map (kbd keybind) (quote my-esc))
define-esc-key("M-j")
но работи както очаквам в Emacs24. Тя също работи в Emacs23, ако заменя инстанцията на keybind
в define-esc-key
функционален орган от "M-j"
.
(Между другото, съжалявам за лошата титла, но не можех да мисля за нищо по-описателно.)
Отговори:
1 за отговор № 1От NEWS
файл:
* Lisp Changes in Emacs 24.3
...
*** `kbd" is now a function rather than a macro.
Това означава, че в по-ранните версии на Emacs аргументът към kbd
трябва буквално да присъства в поканата, за разлика от използването на променлива във вашия пример.
Друга възможност е да използвате eval
и допълнителни котировки за вмъкване на стойността:
(eval `(kbd ,keybind))