передача функций в качестве аргументов в emacs lisp - PullRequest
3 голосов
/ 06 марта 2012

Я не уверен, как точно emacs lisp обрабатывает функциональные объекты, есть ли скрытый аргумент, который я не вижу, когда у меня есть это, то когда я нажимаю C-c p, это выдает ошибку Wrong type argument: commandp, load-cenet-files

IЛис не знаю вообще.

(defun load-cenet-files ()
  (load-file "~/.emacs.d/cedet/common/cedet.elc")
  (require 'semantic-gcc)
)

(global-set-key (kbd "C-c p") '(load-cenet-files)) 

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

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"?Или, если вы не хотите, чтобы файлы загружались глобально, прикрепите его к зависимому от режима хуку ?

3 голосов
/ 06 марта 2012

Требуется интерактивная функция http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Interactive.html#Interactive, которая потенциально позволяет пользователю вводить параметры для вашей функции. Если вы не хотите ничего, может сработать что-то вроде этого:

(defun load-cenet-files ()
  (interactive)
  (load-file "~/.emacs.d/cedet/common/cedet.elc")
  (require 'semantic-gcc)
)

(global-set-key (kbd "C-c p") 'load-cenet-files) 
...