自动加载建议在 运行 函数之前需要文件

autoloaded advice to require file before running function

为什么我会自动加载一些功能建议,例如

;;;###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)

并且像往常一样将自动加载创建到启动时加载的文件中。

;;;###autoload 的效果是根据它注释的内容以特别的方式定义的。对于函数 definitions,它变成了对 autoload 函数的调用,这将导致在调用带注释的函数时加载文件,但对于几乎所有其他内容,带注释的 sexp 只是复制到自动加载文件。

因此,在您的情况下,my-java-hook 上的 ;;;###autoload 会导致自动加载文件包含类似 (autoload 'my-java-hook "some-library") 的内容,但与您放在建议只会导致自动加载文件包含 (advice-add 'eclimd-start ...).

你能做的是:

;;;###autoload
(advice-add 'eclimd-start :before #'my-eclimd-start-advice)
;;;###autoload
(defun my-eclimd-start-advice ()
  ...blablabla...)