【发布时间】:2015-09-21 11:12:31
【问题描述】:
我正在为一个包添加自定义支持,该包提供了几个独立于全局模式的命令。由于我不想加载包,除非用户通过键绑定显式调用命令,但我想在用户安装包后立即允许自定义,我尝试使用如下代码:
;;;###autoload
(defcustom foo-bar nil
"bar setting for for"
:type boolean)
;;;###autoload
(defun foo-command-1 () ...)
安装包后,我可以调用foo-command-1。我也可以使用customize-variable 来设置和保存foo-bar。但是,当我再次启动 Emacs 时,foo-bar 的值被重置为默认值,并且 Emacs 抱怨该值在自定义之外更改。
AFAICS 这样做的原因是 Emacs 为 defcustom 放入自动加载文件的代码假定它将在 Emacs 调用 init.el 中的 custom-set-variables 之前运行。但是,对于在初始化文件之后运行自动加载的包,情况并非如此。
这是一个已知问题吗?要解决方法,我将上面的内容替换为:
;;;###autoload
(unless (fboundp 'foo-command-1)
(defcustom foo-bar nil
"bar setting for for"
:type boolean))
;;;###autoload
(defun foo-command-1 () ...)
这会将整个 defcustom 定义复制到自动加载中,并防止在真正加载包时第二次运行它。这有效,保存的选项已正确恢复。我仍然很困惑为什么 ###autoload for defcustom 不能自己做正确的事情。
【问题讨论】:
标签: emacs customization autoload