自动加载建议以在运行功能之前需要文件

时间:2018-09-29 23:05:43

标签: emacs autoload advising-functions

当我自动加载一些功能建议时,怎么会这样?

;;;###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 :(得分:1)

;;;###autoload的效果是根据其注释内容以临时方式定义的。对于函数 definitions ,它将变成对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...)