Ошибка «Аргумент неверного типа: командаp» при привязке лямбда-выражения к ключу

87

Я получаю здесь «Аргумент неправильного типа: commandp, (lambda nil (forward-line 5))».

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

В чем ошибка? Я почти уверен, что это просто, и мне не хватает чего-то очевидного.

Пол Натан
источник
Вам не хватает закрывающих скобок. Вероятно, не в вашем коде, а только в вопросе.
Helder S Ribeiro,
В качестве побочного примечания: когда вы цитируете анонимную функцию таким образом, она не будет скомпилирована. Я полагаю, что в вашем случае это не проблема.
Фил Джексон,

Ответы:

129

global-set-keyожидает интерактивной команды. (lambda () (interactive) (forward-line 5))должно работать.

Кстати, C-h f commandpэто неплохая отправная точка для подобных ошибок.

Брендан
источник
Думаю, минусов нет. Из документации: >> «Вызов» к «интерактивному» на самом деле является объявлением, а не функцией; он сообщает «интерактивно по вызову», как читать аргументы для передачи функции. При фактическом вызове «интерактивный» просто возвращает ноль.
Дангелов
Итак, согласно (commandp)документации, лямбда-функции с вызовом верхнего уровня (interactive)работают, но как я могу определить функцию, (defun)которая будет работать?
Петерхил
35

Правильная форма должна быть такой -

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

Проблема заключалась в том, что вы забыли поставить (interactive)(как упомянул Брендан).

Кстати, вы заметите, что я использовал (kbd)функцию для указания привязки клавиш. Эта функция очень полезна, так как привязки клавиш можно разместить практически буквально.

Байшампаян Гхош
источник
2

Я также видел эту ошибку на новом компьютере, где я использую свой обычный .emacsфайл, но не установил свои пакеты, и команда, которую нужно выполнить, находится в одном из этих пакетов. (Потому что команда, которую невозможно выполнить, определенно не интерактивна!)

Пол Биссекс
источник