自动加载建议在 运行 函数之前需要文件
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...)
为什么我会自动加载一些功能建议,例如
;;;###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...)