Аргумент неправильного типа: ошибка commandp при привязке лямбды к ключу

Я получаю здесь «Аргумент неправильного типа: commandp, (лямбда ноль (прямая строка 5))».

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

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


person Paul Nathan    schedule 09.08.2009    source источник
comment
Вам не хватает закрывающих скобок. Вероятно, не в вашем коде, а только в вопросе.   -  person agentofuser    schedule 09.08.2009
comment
В качестве примечания: когда вы цитируете анонимную функцию, она не будет скомпилирована. Хотя, думаю, в вашем случае это не имеет большого значения.   -  person Phil Jackson    schedule 10.08.2009


Ответы (3)


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

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

person brendan    schedule 09.08.2009
comment
Я думаю минусов нет. Из документации: ›› Вызов «interactive» на самом деле является объявлением, а не функцией; он сообщает call-interactively, как читать аргументы для передачи функции. При фактическом вызове «интерактив» просто возвращает ноль. - person Dangelov; 18.03.2019
comment
Итак, согласно документации (commandp), лямбда-функции с вызовом верхнего уровня (interactive) работают, но как я могу определить функцию с (defun), которая будет работать? - person peterhil; 26.08.2020

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

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

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

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

person Baishampayan Ghose    schedule 09.08.2009

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

person Paul Bissex    schedule 18.06.2018