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-startupnil,避免加载包 处理完初始化文件后再次。或者,您可以选择 完全禁止在启动时加载包,并调用命令 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 它们(这反过来会缩短您的启动时间)。没有自动加载的包仍然需要required(或以某种方式加载,无论如何)。【参考方案2】:

您使用package.el 安装的软件包默认您的.emacs 加载后被激活。 为了能够在.emacs 结束之前使用它们,您需要使用以下命令激活它们:

(setq package-enable-at-startup nil)
(package-initialize)

【讨论】:

我认为phils的回答比这个更有价值,甚至更正确;他还解释了原因。 @ErikAllik,投反对票是为了报告信息不准确。您应该只支持另一个更准确的答案。要了解为什么接受此答案,只需查看日期即可。它比另一本早 15 个月写成。 这只是为了平衡分数——可能是不恰当的行为:)

以上是关于Emacs 24 包系统初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

在emacs中使用不同的包存储库

helm安装:包emacs '24 .4'不可用

如果我找不到我的 emacs 初始化文件怎么办?

由于缺少 deps:pkg-info 和破折号,Emacs 软件包安装失败

在 Emacs 中,如何在一系列初始化语句中排列等号?

Emacs和ESS的使用技巧。