Совет автозагрузке требовать файл перед запуском функции

Почему, когда я загружаю некоторые советы по функциям, например.

;;;###autoload
(advice-add 'eclimd-start :before #'(lambda () (require 'some-library))

а затем позвоните eclimd-startбиблиотека, из которой загружается совет, не загружается? Я думал, что смогу просто использовать следующее, чтобы получить файл с настройками, загруженными перед вызовом функции,

;;;###autoload
(advice-add 'eclimd-start :before (lambda () nil)

В этом случае библиотека содержит настройки, которые будут использоваться функцией eclimd-start, Таким образом, в качестве воспроизводимого примера, это может быть

(setq eclimd-default-workspace "/hdd/workspace")

;;;###autoload
(defun my-java-hook () nil)

;;;###autoload
(advice-add 'eclimd-start :before 
   #'(lambda () (require 'some-library))

(provide 'some-library)

и автозагрузки создаются как обычно в файл, загружаемый при запуске.

1 ответ

Решение

Эффект от ;;;###autoload определяется специальным образом в зависимости от того, что он комментирует. Для определения функций это превращается в вызов autoload функция, которая будет вызывать загрузку файла при вызове аннотированной функции, но почти во всем остальном аннотированный sexp просто копируется в файл автозагрузки.

Так что в вашем случае ;;;###autoload на my-java-hook заставляет файл автозагрузки содержать что-то вроде (autoload 'my-java-hook "some-library"), но то же самое ;;;###autoload Вы поместили перед советом просто заставит файл автозагрузки содержать (advice-add 'eclimd-start ...),

Что вы можете сделать, это:

;;;###autoload
(advice-add 'eclimd-start :before #'my-eclimd-start-advice)
;;;###autoload
(defun my-eclimd-start-advice ()
  ...blablabla...)
Другие вопросы по тегам