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 fonction interactive
, 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 teste my-function
pour voir s'il s'agit d'une commande utilisant le test commandp
. 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:
(defun my-function ()
(interactive)
(message "This is a great function"))
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:
(global-set-key (kbd "C-c l") "λ")
"λ"
est une macro de clavier, nous pouvons donc la lier C-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 comme interactive
:
(global-set-key (kbd "C-c k")
(lambda () (insert "λ"))
;; C-c k is undefined! We tried to bind it to a function
(global-set-key (kbd "C-c m")
(lambda () (interactive) (insert "λ"))
;; C-c m is bound to a command that inserts λ