【问题标题】:Emacs package customization and autoloadsEmacs 包自定义和自动加载
【发布时间】: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


    【解决方案1】:

    是的,你所做的是一种合理的方式来完成你想要的。如果您想自动加载 defcustom 并且您关心何时相对于其他代码对其进行评估,那么您需要以某种方式控制该时间。你选择的方式是合理的。

    用户的初始化文件可以在用户选择的任何时候加载custom-file。如果没有使用 custom-file,它仍然不确定在什么时候由 Customize 管理的初始化文件代码部分将相对于可能依赖于它设置的值的其他部分进行评估。

    【讨论】:

      【解决方案2】:

      一般来说,您不想自动加载变量。

      是的,这是一个已知问题,并且没有真正好的解决方案(我能想出的每个解决方案都有自己的一组错误/错误行为),这就是为什么我只能说“不要自动加载变量,请”。

      即使它碰巧做你想做的事,根据我的经验,它也是不可取的。它只是有太多的怪癖和极端情况。

      【讨论】:

      • 这更像是一个评论而不是一个答案。你提到存在未命名的问题而没有描述任何一个。做或不做某事的指导,没有解释为什么,充其量只是一个评论。
      • 您能否举一个问题中的代码示例可能出现的不当行为示例?到目前为止,我无法通过有限的测试找到一个。
      • @IgorBukanov:对于这种特殊情况,我想到的一件事是自动加载的代码副本被移出其上下文,因此它不会继承同样的方式。
      • 这只是一个使用 explicit :group 的参数,无论如何这都是有道理的(包括“这种特殊情况”),尤其是当有多个 @987654322 时@出现在上一个defcustom。另外,如果您没有明确提供:group,字节编译器会发出警告。另外,:group 继承的“特性”甚至没有记录。 AFAICT,您对自动加载的 defcustoms 的反对早于 :group“继承”功能。
      • @Drew:哦,是的,总的来说还有很多问题。我只是在回复请求以指出此特定用例中的问题。如果您想要更多问题,无论是一般问题还是具体问题,当然,我可以找到更多。例如。对于这种特定情况,其他问题包括“除非”测试很难看,它人为地将 var 链接到函数的名称和存在,以及 M-C-x 不会正确地将 var 重置为其默认值。
      猜你喜欢
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 2016-04-17
      相关资源
      最近更新 更多