Emacs различает функции и команды - последние представляют собой особый тип функций, а именно те, которые пользователь может вызывать в интерактивном режиме.Сообщение об ошибке Wrong type argument: commandp, load-cenet-files
говорит вам, что какой-то пункт в коде ожидает команду, но получил что-то еще.commandp
- это функция предиката, которая проверяет, является ли ее аргумент командой;здесь он протестировал load-cenet-files
и обнаружил, что это не команда, поэтому сглазил.
Вы можете превратить функцию в команду, объявив ее интерактивной.Вы делаете это, добавляя объявление (interactive)
в качестве первой строки после (defun function-name (args)
.Обратите внимание, что (interactive)
- это специальная конструкция, на самом деле это не вызов функции, а объявление.
(defun load-cenet-files ()
(interactive)
(load-file "~/.emacs.d/cedet/common/cedet.elc")
(require 'semantic-gcc)
)
После того, как вы превратили функцию в команду, вы можете вызвать ее с помощью M-x function-name
,Также, если вы хотите привязать функцию к сочетанию клавиш, это должна быть команда.Именно поэтому вы видите это сообщение об ошибке: вы связали функцию load-cenet-files
с Cc p , но это функция, а не команда.После того, как вы вставите (interactive)
, все будет в порядке.
Наконец, несколько необычно то, что вы пытаетесь связать эту функцию с сочетанием клавиш.Не могли бы вы просто поместить load-file
и require
в файл ".emacs"?Или, если вы не хотите, чтобы файлы загружались глобально, прикрепите его к зависимому от режима хуку ?