/ / Emacs: falscher Typ-Argument-Fehler in Emacs23, aber nicht in Emacs24 - Emacs, Compiler-Fehler, elisp, emacs24, emacs23

Emacs: falscher Typ-Argument-Fehler in Emacs23, aber nicht in Emacs24 - Emacs, Compiler-Fehler, elisp, emacs24, emacs23

Zuallererst werde ich zugeben, dass ich komplett binNeuling bei Emacs und ELisp (und in der Regel Lisp im Allgemeinen), und ich bin auf einen Fehler gestoßen, der mich für eine ganze Weile ratlos macht, während ich versuche, meine .emacs-Datei zu schreiben.

Hier ist ein minimales Beispiel für Code, der zum Reproduzieren des Problems erforderlich ist (d. H., Dass .emacs nur Folgendes enthalten):

(defun define-esc-key (keybind)
(define-key key-translation-map (kbd keybind) "my-esc))
(define-esc-key "M-j")

Dies wird den folgenden Fehler mit Emacs23 erzeugen:

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")

funktioniert aber so, wie ich es von Emacs24 erwarte. Es funktioniert auch in Emacs23, wenn ich die Instanz von ersetzen keybind in dem define-esc-key Funktionskörper nach "M-j".

(Übrigens, Entschuldigung für den schlechten Titel, aber ich könnte einfach nichts beschreibender denken.)

Antworten:

1 für die Antwort № 1

Von dem NEWS Datei:

* Lisp Changes in Emacs 24.3
...
*** `kbd" is now a function rather than a macro.

Das bedeutet, dass in früheren Emacs-Versionen das Argument zu kbd muss im Aufruf buchstäblich vorhanden sein, im Gegensatz zur Verwendung einer Variablen in Ihrem Beispiel.

Alternativ können Sie verwenden eval und backquotes, um den Wert einzufügen:

(eval `(kbd ,keybind))