Emacs 24 包系统初始化问题
Posted
技术标签:
【中文标题】Emacs 24 包系统初始化问题【英文标题】:Emacs 24 Package System Initialization Problems 【发布时间】:2012-06-23 00:51:04 【问题描述】:在我看来,Emacs 24 内置的新包系统在正确加载和初始化已安装的包时存在一些缺陷。
最近,我升级到了 2012 年 6 月 10 日发布的 Emacs 24.1.1,我一直在尝试使用内置的包系统并使用它安装了几个包,但它们都有类似的问题自动加载和初始化。
例如,我使用了一个名为smex
的包,它提供了使用M-x
和弦的增强功能。它要求您为M-x
定义一个密钥,因此我在我的init.el
文件中添加了(global-set-key (kbd "M-x") 'smex)
。但是在启动 emacs 之后,我按下 M-x
和弦,我得到消息 "Symbol's function definition is void: smex" ...如果我也将 (require 'smex)
放在我的 init.el 文件中,我得到错误消息“文件错误:无法打开加载文件,smex”
将 smex 的位置添加到 load-path 变量使其按预期工作,但是,这似乎违背了最初拥有包系统的全部目的......
有什么想法吗?有没有更好的方法,或者我们现在是否接受这个限制?
【问题讨论】:
【参考方案1】:值得注意的是为什么 Emacs 延迟了包初始化:
请参阅 C-hig (emacs) Package Installation
RET,尤其是:
加载init后自动加载包的原因 文件是用户选项仅在之后收到其自定义值 加载初始化文件,包括影响 包装系统。在某些情况下,您可能需要加载包 在您的 init 文件中显式地显示(通常是因为您的 init 文件取决于一个包)。在这种情况下,您的 init 文件应该 调用函数
package-initialize
。由您来确保 设置了相关的用户选项,例如package-load-list
(见下文) 在package-initialize
通话之前。您还应该设置package-enable-at-startup
到nil
,避免加载包 处理完初始化文件后再次。或者,您可以选择 完全禁止在启动时加载包,并调用命令M-x package-initialize
手动加载你的包。
因此,如果您在调用 package-initialize
之前确保您的 init 文件处理了您想要的 package
自定义组中变量的任何非默认值1 - 并且您维护每当自定义包库配置时都使用这种方法——这样做应该没问题。
另外,因为after-init-hook
在标准包初始化完成后运行,您可以使用它来评估任何依赖于包的初始化代码。因此,与其直接在 init.el 中调用package-initialize
,不如编写:
(add-hook 'after-init-hook 'my-after-init-hook)
(defun my-after-init-hook ()
;; do things after package initialization
)
将需要初始化包系统的代码放入该函数中。
YMMV.
(nb 我没有测试过初始化后的方法,因为我并没有真正使用 package.el;但我确实确认了启动代码中的事件顺序,所以我相信它会按照描述的那样工作.)
1M-x customize-group
RET package
RET
【讨论】:
我不知道为什么这个答案得到了这么少的选票并且没有被接受......根据你所解释的,接受的答案中提供的解决方案甚至开始看起来像一个黑客。 很好的答案!使用 package-initialize 加载我的包后,我还需要 require 吗? Veritas:因包而异。编写良好的包通常会包含重要命令的自动加载 cookie(由包管理器处理),在这种情况下,您不太可能需要require
它们(这反过来会缩短您的启动时间)。没有自动加载的包仍然需要require
d(或以某种方式加载,无论如何)。【参考方案2】:
您使用package.el
安装的软件包默认在您的.emacs
加载后被激活。
为了能够在.emacs
结束之前使用它们,您需要使用以下命令激活它们:
(setq package-enable-at-startup nil)
(package-initialize)
【讨论】:
我认为phils的回答比这个更有价值,甚至更正确;他还解释了原因。 @ErikAllik,投反对票是为了报告信息不准确。您应该只支持另一个更准确的答案。要了解为什么接受此答案,只需查看日期即可。它比另一本早 15 个月写成。 这只是为了平衡分数——可能是不恰当的行为:)以上是关于Emacs 24 包系统初始化问题的主要内容,如果未能解决你的问题,请参考以下文章