Erreur "Argument de type incorrect: commandp" lors de la liaison d'un lambda à une clé

87

J'obtiens un «argument de type incorrect: commandp, (lambda nil (forward-line 5))» ici.

(global-set-key [?\M-n] (lambda () (forward-line 5)))

Quelle est l'erreur? Je suis assez sûr que c'est simple et qu'il me manque quelque chose d'évident.

Paul Nathan
la source
Il vous manque une parenthèse fermante. Probablement pas dans votre code, seulement dans la question.
Helder S Ribeiro
En remarque: lorsque vous citez la fonction anonyme comme ça, elle ne sera pas compilée. J'imagine que ce n'est pas grave dans votre cas, cependant.
Phil Jackson

Réponses:

129

global-set-keyattend une commande interactive. (lambda () (interactive) (forward-line 5))devrait fonctionner.

Au fait, C-h f commandpc'est un très bon point de départ pour des erreurs comme celle-là.

Brendan
la source
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?
peterhil
35

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.

Baishampayan Ghose
la source
2

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

Paul Bissex
la source