совет автозагрузке требовать файл перед запуском функции - PullRequest
0 голосов
/ 30 сентября 2018

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

;;;###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 Ответ

0 голосов
/ 30 сентября 2018

Эффект ;;;###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...)
...