Fehler "Falsches Argument: Befehl" beim Binden eines Lambda an einen Schlüssel

85

Ich erhalte hier ein "Argument vom falschen Typ: commandp, (lambda nil (Vorwärtszeile 5))" ".

(global-set-key [?\M-n] (lambda () (forward-line 5)))

Was ist der Fehler? Ich bin mir ziemlich sicher, dass es einfach ist und mir fehlt etwas Offensichtliches.

Paul Nathan
quelle
Ihnen fehlt eine schließende Klammer. Wahrscheinlich nicht in Ihrem Code, nur in der Frage.
Helder S Ribeiro
Als Randnotiz: Wenn Sie die anonyme Funktion so zitieren, wird sie nicht kompiliert. Ich kann mir vorstellen, dass es in Ihrem Fall keine große Sache ist.
Phil Jackson

Antworten:

127

global-set-keyerwartet einen interaktiven Befehl. (lambda () (interactive) (forward-line 5))sollte funktionieren.

Ist übrigens C-h f commandpein ziemlich guter Ausgangspunkt für solche Fehler.

brendan
quelle
Ich denke, es gibt keine Nachteile. Aus der Dokumentation: >> Der "Aufruf" von "interaktiv" ist eigentlich eher eine Deklaration als eine Funktion; Es teilt 'call-interactive' mit, wie Argumente gelesen werden sollen, die an die Funktion übergeben werden sollen. Wenn 'interaktiv' tatsächlich aufgerufen wird, wird nur Null zurückgegeben.
Dangelov
Laut (commandp)Dokumentation funktionieren Lambda-Funktionen mit Top-Level-Aufruf zur (interactive)Arbeit, aber wie kann ich eine Funktion definieren, mit (defun)der dies funktionieren würde?
Peterhil
35

Die richtige Form sollte dies sein -

(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))

Das Problem war, dass Sie vergessen haben zu setzen (interactive)(wie brendan erwähnte).

Sie werden übrigens feststellen, dass ich die (kbd)Funktion zur Angabe der Schlüsselbindung verwendet habe. Diese Funktion ist immens nützlich, da Sie die Tastenkombinationen fast wörtlich setzen können.

Baishampayan Ghose
quelle
2

Ich habe diesen Fehler auch auf einem neuen Computer gesehen, auf dem ich meine übliche .emacsDatei verwende, aber meine Pakete nicht installiert habe, und der auszuführende Befehl befindet sich in einem dieser Pakete. (Weil ein Befehl, der definitiv nicht ausgeführt werden kann, definitiv nicht interaktiv ist!)

Paul Bissex
quelle