Ich habe eine Funktion geschrieben und möchte sie über Mx aufrufen und an eine Taste binden. Das ist meine Funktion:
(defun my-function ()
(message "This is a great function"))
Wenn ich versuche, es mit aufzurufen M-x my-function
, erhalte ich den Fehler: [no match]
im Minipuffer.
Wenn ich versuche, es an eine Taste (oder einen Mausklick) zu binden:
(global-set-key (kbd "C-c a") 'my-function)
Es scheint zu funktionieren, aber wenn ich versuche, es mit aufzurufen C-c a
, erhalte ich den Fehler
Falsches Typargument: commandp, my-function
Warum kann ich meine Funktion nicht nutzen?
functions
commands
interactive
Tyler
quelle
quelle
interactive
- z. B. verschwindet manchmal ein Befehl aus einer neuen Version einer Bibliothek. Der Fehler kann in jedem Kontext ausgelöst werden, in dem Emacs einen Befehl erwartet.commandp
, um zu versuchen, andere Qs zu finden, die als Duplikate von diesem geschlossen werden können. Lesen Sie jedoch die Fragen und Antworten sorgfältig durch, da sich einige davon unterscheiden. In einigen Fällen lohnt es sich, die Antwort (und den Q-Kontext) hier zu wiederholen. In anderen Fällen hat die Frage keinen Bezug und sollte so belassen werden, wie sie ist (nicht geschlossen).Antworten:
Der Kernpunkt ist, dass es einen Unterschied zwischen einer Funktion und einem Befehl gibt .
In Emacs lisp können Funktionen standardmäßig nicht interaktiv aufgerufen werden. Das bedeutet, dass Sie nicht über
M-x
einen Schlüssel oder Mausklick darauf zugreifen oder sie daran binden können. Wenn Sie das tun möchten, müssen Sie die Funktion explizit deklariereninteractive
, indem Sie ein(interactive)
Formular als erste Zeile im Hauptteil hinzufügen (nach der Dokumentationszeichenfolge). Eine interaktive Funktion wird als Befehl bezeichnet. Dies wird im Handbuch erklärt:(info "(elisp) Using Interactive")
(Online-Version) .Die angezeigte Fehlermeldung
Wrong type argument: commandp, my-function
zeigt an, dass Sie versuchen, eine Funktion interaktiv aufzurufen, diese Funktion jedoch kein Befehl ist .Um den tatsächlichen Fehler zu erklären, wird der Buchstabe
p
häufig in Lispeln verwendet, um ein Prädikat oder einen Test anzugeben. In diesem Fall testet Emacs mit dem Testmy-function
, ob es sich um einen Befehl handeltcommandp
. Es ist nicht, was zu dem Fehler führt. Ähnliche Fehler treten auf, wenn Sie ein Objekt des falschen Typs verwenden: Wenn Emacs einen String erwartet und Sie ein Symbol übergeben, wird möglicherweise ein Verweis aufstringp
angezeigt.Um die gestellte Frage zu beantworten, müssen Sie die
(interactive)
Zeile zur Definition hinzufügen :Es gibt viele Optionen für das
interactive
Formular, die alle Arten der Weitergabe von Informationen an Ihre Funktion unterstützen. Überprüfen Sie das Handbuch für alle Details.Ein Sonderfall sind in diesem Zusammenhang Tastaturmakros. Ein Tastaturmakro ist eine Folge von Eingabeereignissen, die als Zeichenfolge dargestellt werden. Tastaturmakros verhalten sich wie Befehle, sodass Sie sie an Tasten binden können, ohne sich Gedanken über das Hinzufügen einer
interactive
Deklaration machen zu müssen. Zum Beispiel im Folgenden:"λ"
ist ein Tastaturmakro, an das wir esC-c l
problemlos binden können . Wenn wir versuchen, dasselbe mit einer Funktion zu tun, müssen wir die Funktion folgendermaßen definiereninteractive
:quelle
M-x my-function
in Ihrem Beispiel tun . Auch als Emacs-Anfänger bin ich mir wirklich noch nicht zu 100% klar, was genauC-x C-e
passiert oder wann man es ausführen muss, aber es scheint, dass ähm ... wenn man es ausführt, es den Puffer analysiert undmy-function
im Speicher überschreibt, wenn ich da bin Nicht rennenC-x C-e
M-x
führt die Funktion aus dem letzten Mal, als ich rannteC-x C-e
C-x C-e
der Puffer ausgewertet. Das Ergebnis der Auswertung eines Puffers, der a enthält, scheint, dass diedefun
Funktion registriert wird. In diesem Artikel habe ich jedoch den Eindruck, dass die Funktion nur ausgeführt werden sollte. Der Minipuffer enthält jedoch nur Folgendesmy-function
(was bedeutet, dass es die Funktion zurückgibt?), nichtThis is a great function
. Ich muss hier etwas vermissen.