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.