Помилка "Неправильний аргумент типу: commandp" під час прив'язки лямбда-ключа до ключа


87

Я отримую тут "Неправильний аргумент типу: commandp, (лямбда-нуль (прямий рядок 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файл, але не встановив свої пакунки, і команда, яку потрібно виконати, знаходиться в одному з цих пакетів. (Оскільки команда, яку неможливо виконати, точно не є інтерактивною!)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.