Błąd „Nieprawidłowy argument typu: poleceniep” podczas wiązania wyrażenia lambda z kluczem

89

W tym miejscu jest wyświetlany komunikat „Wrong type argument: commandp, (lambda nil (forward-line 5))”.

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

Jaki jest błąd? Jestem prawie pewien, że to proste i brakuje mi czegoś oczywistego.

Paul Nathan
źródło
Brakuje zamykającego nawiasu. Prawdopodobnie nie w twoim kodzie, tylko w pytaniu.
Helder S Ribeiro
Na marginesie: kiedy zacytujesz anonimową funkcję w ten sposób, nie zostanie ona skompilowana. Wyobrażam sobie jednak, że w twoim przypadku to nic wielkiego.
Phil Jackson

Odpowiedzi:

131

global-set-keyoczekuje interaktywnego polecenia. (lambda () (interactive) (forward-line 5))powinien działać.

Nawiasem mówiąc, C-h f commandpjest to całkiem dobry punkt wyjścia dla takich błędów.

brendan
źródło
Myślę, że nie ma wad. Z dokumentacji: >> „Wywołanie” „interaktywnego” jest w rzeczywistości deklaracją, a nie funkcją; mówi „call-interactively”, jak czytać argumenty przekazywane do funkcji. Właściwie wywołany „interaktywny” zwraca po prostu zero.
Dangelov
Więc zgodnie z (commandp)dokumentacją, funkcje lambda z wywołaniem najwyższego poziomu do (interactive)działania, ale jak mogę zdefiniować funkcję z (defun)tym, aby działała?
peterhil
36

Prawidłowa forma powinna wyglądać następująco -

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

Problem polegał na tym, że zapomniałeś (interactive)podać (jak wspomniał Brendan).

Nawiasem mówiąc, zauważysz, że użyłem (kbd)funkcji do określenia powiązania klawiszy. Ta funkcja jest niezmiernie użyteczna, ponieważ możesz umieścić skróty klawiszowe prawie dosłownie.

Baishampayan Ghose
źródło
2

Widziałem również ten błąd na nowej maszynie, na której używam zwykłego .emacspliku, ale nie zainstalowałem moich pakietów, a polecenie do wykonania znajduje się w jednym z tych pakietów. (Ponieważ polecenie, którego nie można wykonać, zdecydowanie nie jest interaktywne!)

Paul Bissex
źródło