首先,我承认我是Emacs和Elisp的完整新手(总的来说,我已经偶然发现了一个错误我在尝试编写.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")
,但正如我期望的那样起作用。如果我用"M-j"
替换define-esc-key
功能主体中的keybind
实例。
(顺便说一句,对不起,标题不好,但我只是想不出任何描述性。)
来自NEWS
文件:
* Lisp Changes in Emacs 24.3
...
*** `kbd' is now a function rather than a macro.
这意味着,在较早的emacs版本中,与示例中使用变量相反,对kbd
的论点必须在呼叫中实际上存在。
另外,您可以使用 eval
和backquotes插入值:
(eval `(kbd ,keybind))