Je pense qu'il n'y a pas d'inconvénients. De la documentation: >> L '"appel" à' interactif 'est en fait une déclaration plutôt qu'une fonction; il indique «appel interactivement» comment lire les arguments à passer à la fonction. Lorsqu'il est réellement appelé, «interactive» renvoie simplement nil.
Dangelov
Donc, selon la (commandp)documentation, les fonctions lambda avec un appel au plus haut niveau (interactive)fonctionnent, mais comment puis-je définir une fonction avec (defun)qui fonctionnerait?
Le problème était que vous avez oublié de mettre (interactive) (comme Brendan l'a mentionné).
Au fait, vous remarquerez que j'ai utilisé la (kbd)fonction pour spécifier le raccourci clavier. Cette fonction est extrêmement utile car vous pouvez mettre les raccourcis clavier presque littéralement.
J'ai également vu cette erreur sur une nouvelle machine où j'utilise mon .emacsfichier habituel mais je n'ai pas installé mes packages, et la commande à exécuter se trouve dans l'un de ces packages. (Parce qu'une commande qui ne peut pas être exécutée n'est certainement pas interactive!)
Réponses:
global-set-key
attend une commande interactive.(lambda () (interactive) (forward-line 5))
devrait fonctionner.Au fait,
C-h f commandp
c'est un très bon point de départ pour des erreurs comme celle-là.la source
(commandp)
documentation, les fonctions lambda avec un appel au plus haut niveau(interactive)
fonctionnent, mais comment puis-je définir une fonction avec(defun)
qui fonctionnerait?La forme correcte devrait être celle-ci -
(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))
Le problème était que vous avez oublié de mettre
(interactive)
(comme Brendan l'a mentionné).Au fait, vous remarquerez que j'ai utilisé la
(kbd)
fonction pour spécifier le raccourci clavier. Cette fonction est extrêmement utile car vous pouvez mettre les raccourcis clavier presque littéralement.la source
J'ai également vu cette erreur sur une nouvelle machine où j'utilise mon
.emacs
fichier habituel mais je n'ai pas installé mes packages, et la commande à exécuter se trouve dans l'un de ces packages. (Parce qu'une commande qui ne peut pas être exécutée n'est certainement pas interactive!)la source