«неправильный тип аргумента: commandp, my/function» при настройке привязки клавиш в elisp

#debugging #emacs #key-bindings

#отладка #emacs #привязки клавиш

Вопрос:

Это может выглядеть как дубликат, но я безуспешно пробовал все другие решения.

У меня есть функция в моем инициализационном файле, начинающаяся следующим образом:

 (defun my/function ()
  "Comment or uncomment the current line or text selection."
  (interactive)
  (let (p1 p2)
    (if (use-region-p)
 

Когда я устанавливаю привязку ключа:

 (global-set-key (kbd "C-x C-.") 'my/function)
 

Я получаю следующую ошибку:

 wrong type of argument: commandp, my/function
 

Когда я поворачиваюсь debug-on-error , это то, что я получаю:

  call-interactively(my/function nil nil)
  command-execute(my/function)
 

Что я делаю не так?

Комментарии:

1. Ваше определение команды неполное — скобки не сбалансированы и т.д. Пока у вас есть interactive спецификация, если вы завершите свое определение (закройте скобки), у вас будет команда.

2. Я упомянул в своем описании, что функция запускается так (я не включил все это). Когда я вызываю его, используя его имя M-x function, он работает отлично, но не тогда, когда я привязываю его к ключу. В этом и заключается проблема.

3. Работает для меня. Я могу только догадываться, что каким-то образом в вашем init-файле оценка выполняется не так, как вы думаете. Может быть, из-за неправильных круглых скобок или около того?

4. Если вы не показываете весь соответствующий код, трудно догадаться. Вы видите ту же проблему, если запускаете Emacs с помощью emacs -Q (без файла инициализации)? Если нет, то разделите файл инициализации пополам, чтобы найти виновника.

5. Я попробую это. Однако, как я уже упоминал, это не проблема или неправильный синтаксис, потому что, когда я вызываю функцию, она использует свое имя «M-x function», она работает отлично. Сбой происходит только тогда, когда я вызываю его с помощью привязки клавиш.

Ответ №1:

Функция, которую вы привязываете, должна быть командой, то есть: она должна иметь (interactive) в ней. Запуск (commandp 'my/function) должен сообщить вам, так ли это.

(В вашем вопросе у вас действительно есть (interactive) в определении, но, должно быть, что-то пошло не так, возможно, переоценка определения функции исправит это)