Errore "Tipo di argomento errato: comandop" durante l'associazione di un lambda a una chiave


88

Ricevo "un argomento di tipo errato: commandp, (lambda nil (forward-line 5))" qui.

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

Qual è l'errore? Sono abbastanza sicuro che sia semplice e mi manca qualcosa di ovvio.


Ti manca una parentesi di chiusura. Probabilmente non nel tuo codice, ma solo nella domanda.
— Helder S Ribeiro

Come nota a margine: quando si cita la funzione anonima in questo modo, non verrà compilata. Immagino che non sia un grosso problema nel tuo caso, però.
— Phil Jackson

Risposte:


130

global-set-keysi aspetta un comando interattivo. (lambda () (interactive) (forward-line 5))dovrebbe funzionare.

A proposito, C-h f commandpè un buon punto di partenza per errori del genere.


Penso che non ci siano lati negativi. Dalla documentazione: >> La "chiamata" a 'interattivo' è in realtà una dichiarazione piuttosto che una funzione; dice alla "chiamata interattiva" come leggere gli argomenti da passare alla funzione. Quando viene effettivamente chiamato, "interattivo" restituisce solo zero.
— Dangelov

Quindi, secondo la (commandp)documentazione, le funzioni lambda con chiamata di primo livello (interactive)funzionano, ma come posso definire una funzione con (defun)quella funzionerebbe?
— Peterhil

36

La forma corretta dovrebbe essere questa:

(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))

Il problema era che ti sei dimenticato di mettere (interactive)(come ha detto Brendan).

A proposito, noterai che ho usato la (kbd)funzione per specificare l'associazione dei tasti. Questa funzione è immensamente utile poiché puoi inserire le associazioni di tasti quasi letteralmente.


2

Ho anche visto questo errore su una nuova macchina in cui sto usando il mio solito .emacsfile ma non ho installato i miei pacchetti e il comando da eseguire è in uno di quei pacchetti. (Perché un comando che non può essere eseguito sicuramente non è interattivo!)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.