J'ai écrit une fonction, et je veux l'appeler via Mx, et la lier à une clé. C'est ma fonction:
(defun my-function ()
(message "This is a great function"))
Si j'essaye de l'appeler avec M-x my-function
, j'obtiens l'erreur: [no match]
dans le mini-tampon.
Si j'essaie de le lier à une clé (ou un clic de souris):
(global-set-key (kbd "C-c a") 'my-function)
Cela semble fonctionner, mais lorsque j'essaie de l'appeler avec C-c a
, j'obtiens l'erreur
Argument de type incorrect: commandp, ma-fonction
Pourquoi ne puis-je pas utiliser ma fonction?
interactive
- par exemple, parfois une commande disparaît d'une nouvelle version d'une bibliothèque. L'erreur peut être déclenchée dans n'importe quel contexte où Emacs attend une commande.commandp
pour essayer de trouver d'autres Q qui peuvent être fermés en tant que doublons de celui-ci. Attention cependant à lire les Q&R, car certains sont différents. Dans certains cas, la réponse (et le contexte Q) peut être utile de répéter ici. Dans d' autres cas, la question n'est pas liée et doit être laissée telle quelle (non fermée).Réponses:
L'essentiel est qu'il existe une différence entre une fonction et une commande .
Dans Emacs lisp, les fonctions ne sont pas interactivement appelables par défaut. Cela signifie que vous ne pouvez pas y accéder via
M-x
ou les lier à une touche ou un clic de souris. Si vous voulez le faire, vous devez déclarer explicitement la fonctioninteractive
, ce que vous faites en ajoutant un(interactive)
formulaire comme première ligne du corps (après la chaîne de documentation). Une fonction interactive est appelée une commande Ceci est expliqué dans le manuel:(info "(elisp) Using Interactive")
(version en ligne) .Le message d'erreur que vous voyez,
Wrong type argument: commandp, my-function
indique que vous essayez d'appeler une fonction de manière interactive, mais que cette fonction n'est pas une commande .Pour expliquer l'erreur réelle, la lettre
p
est souvent utilisée dans lisp pour indiquer un prédicat ou un test. Dans ce cas, Emacs testemy-function
pour voir s'il s'agit d'une commande utilisant le testcommandp
. Ce n'est pas le cas, ce qui conduit à l'erreur. Des erreurs similaires apparaissent chaque fois que vous utilisez un objet de type incorrect: si Emacs attend une chaîne et que vous passez un symbole, vous pouvez voir une référence àstringp
, par exemple.Pour répondre à la question posée, vous devez ajouter la
(interactive)
ligne à la définition:Il existe de nombreuses options pour le
interactive
formulaire, prenant en charge toutes sortes de façons de transmettre des informations à votre fonction. Consultez le manuel pour tous les détails.Les macros de clavier sont un cas particulier dans ce contexte. Une macro clavier est une séquence d'événements d'entrée, représentée sous forme de chaîne. Les macros de clavier se comportent comme des commandes, vous pouvez donc les lier à des touches sans vous soucier d'ajouter une
interactive
déclaration. Par exemple, dans ce qui suit:"λ"
est une macro de clavier, nous pouvons donc la lierC-c l
sans problème. Si nous essayons de faire la même chose avec une fonction, nous devons être sûrs de définir la fonction commeinteractive
:la source
M-x my-function
dans votre exemple. Aussi en tant que débutant emacs, je ne suis pas encore vraiment sûr à 100% de ce qui se passe exactementC-x C-e
ou quand vous devez l'exécuter, mais il semble que euh ... lorsque vous l'exécutez, il analyse le tampon et écrasemy-function
en mémoire parce que si je ne pas exécuterC-x C-e
M-x
exécute la fonction depuis la dernière fois que j'ai couruC-x C-e
C-x C-e
qu'évalue le tampon , il semble que le résultat de l'évaluation d'un tampon contenant undefun
enregistre la fonction, bien que cet article semble me faire penser qu'il devrait simplement exécuter la fonction, et pourtant la seule chose affichée dans le mini-tampon estmy-function
(ce qui implique qu'il renvoie la fonction?), nonThis is a great function
. Je dois manquer quelque chose ici.