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.


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.