Emacs 24包系统初始化问题

在我看来,Emacs 24内置的新Package包在正确加载和初始化已安装的软件包时有一些缺陷。

最近,我升级到Emacs 24.1.1,这是在2012年6月10日发售,我一直在尝试使用内置的包系统,并已经安装了几个包使用它,但他们都有类似的问题有关自动加载和初始化。

例如,我使用了一个名为smex的包,它提供了使用Mx和弦的增强function。 它需要你为Mx定义一个密钥,所以我在init.el文件中添加了(global-set-key (kbd "Mx") 'smex) 。 但是,启动emacs后,我按Mx和弦,并得到消息“符号的函数定义是void:smex” …如果我也(require 'smex)(require 'smex)在我的init.el文件中,我得到错误消息“文件错误:无法打开加载文件,smex“

将smex的位置添加到加载pathvariables使得它可以像预期的那样工作,但是,似乎打败了首先有一个包系统的整个目的…

有什么想法吗? 现在有没有更好的办法,还是我们生活在这个限制之中?

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

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

值得注意的是为什么 Emacs推迟包初始化:

请参阅Ch e (emacs) Package Installation RET ,特别是:

加载初始化文件后自动加载包的原因是用户选项在加载初始化文件后才会收到自定义的值,包括影响包装系统的用户选项。 在某些情况下,你可能想在你的init文件中明确地加载包(通常是因为init文件中的其他代码依赖于包)。 在这种情况下,你的init文件应该调用函数package-initialize 。 确保在package-initialize调用之前设置相关用户选项(如package-load-list (请参见下文))取决于您。 您还应该将package-enable-at-startupnil ,以避免在处理init文件之后再次加载包。 或者,您可以select在启动时完全禁止软件包加载,并调用命令Mx package-initialize手动加载软件包。

因此,如果在调用package-initialize之前确保init文件处理package定制组1中的variables所需的任何非默认值,并且在定制包库configuration时保持此方法,则应该可以这样做。

或者,因为after-init-hook标准包初始化完成之后运行after-init-hook ,可以使用它来评估依赖于包的任何init代码。 所以不是直接在init.el中调用package-initialize ,而是写下:

 (add-hook 'after-init-hook 'my-after-init-hook) (defun my-after-init-hook () ;; do things after package initialization ) 

把需要初始化包系统的代码放入该函数中。

因人而异。

(我没有testing过后启动的方法,因为我没有真正使用package.el;但是我确认了启动代码中的事件序列,所以我相信它将按照描述的方式工作。

1 Mx customize-group RET package RET