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.


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à.


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.