【发布时间】:2017-05-11 14:15:21
【问题描述】:
背景
Spacemacs documentation recommends,您在(with-eval-after-load 'org [...config...]) 中包装了额外的组织模式配置:
(defun dotspacemacs/user-config ()
(with-eval-after-load 'org
;; here goes your Org config
))
这是因为:
从 0.104 版开始,spacemacs 使用来自 org ELPA 的 org 版本 存储库而不是 emacs 附带的存储库。 [...] 由于自动加载,调用 org 函数将触发加载带有 emacs 的 org,这将引发冲突。
但是假设您想使用 some-package 以各种方式配置 org-mode。 some-package.el 文件中的组织相关函数不 包含在 with-eval-after-load 中。大多数与组织相关的包都是如此,它们的顶部只有一个require org 声明。
那么你如何加载 some-package 使其不与 spacemacs 的 org 实现冲突?我的第一个想法是这样做 [A]:
(defun dotspacemacs/user-config ()
(with-eval-after-load 'org
(require 'some-package)
;;configure 'some-package and 'org-mode
))
这是正确的方法吗?此外,如果您遵循 Melpa 软件包的这条路线,Spacemacs 将在您每次评估 dotfile 时删除并重新安装该软件包。为了避免这种情况,必须首先将 Melpa 包添加到 [B]
(defun dotspacemacs/layers ()
(setq-default
dotspacemacs-additional-packages '(some-package)
))
问题
一般来说,这段代码 ([A][B]) 能否确保我的 some-package(为 org 提供自定义)不会与 spacemacs 的 org 实现发生冲突?还是我实际上必须直接编辑some-package.el 文件并将其与组织相关的功能包装在with-eval-after-load 中(希望不是)?还是其他方式?
更新
我在 gitter 聊天中被告知,如上所述,dotspacemacs-additonal-packages 和 with-eval-after-load 是安全的。这就是解决方案。
注意
作为参考,那个 somepackage 是 here(它不是 Melpa 包,所以 [B] 不适用于这个部分案例),但我的问题更笼统。 p>
【问题讨论】:
-
供参考,这个问题也被提出here。
-
".... 大多数与 org 相关的软件包...假设您使用的是 Emacs 附带的 org 版本”:AFAIK,他们确实不假设:他们假设有一个他们可以使用的组织(这可能是真实的,也可能不是真实的)。如果没有加载 org-mode 并且您加载了这样的包并且它调用了自动加载的 org 函数,它将尝试加载 emacs 附带的默认 org(如果您随后以某种方式加载 ELPA-org,这可能会导致“混合安装” )。但是如果你已经加载了 ELPA-org 并且能够满足任何需求,那么应该没有问题:emacs 提供的 org 将永远不会被触及。