我正在为一个提供了几个全局模式无关命令的包添加自定义支持。由于我不想在用户通过按键绑定显式调用命令之前加载该包,但我希望允许用户在安装包后立即进行自定义,因此我尝试使用以下代码:
;;;###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会抱怨该值在customize之外被更改。据我所知,这是因为Emacs为defcustom放入autoloads文件的代码假定它将在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
定义复制到 autoloads 中,并防止在真正加载包时第二次运行它。这样可以有效地保存选项并恢复设置。但我想知道为什么 defcustom
的 ###autoload
不能自动完成正确的操作。
:group
的一个参数,这在任何情况下都是有意义的(包括对于“这个特定情况”),尤其是当前面的defcustom
中存在多个:group
时。此外,如果您没有明确提供:group
,字节编译器会发出警告。而且,:group
继承的“特性”甚至没有记录在文档中。据我所知,您反对自动加载的defcustoms早于:group
“继承”功能。 - DrewM-C-x
不能正确地将变量重置为其默认值。 - Stefan