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.


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.