Emacs 24封装系统初始化问题

λ J*_*kas 45 emacs dot-emacs emacs24

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

最近,我升级到Emacs 24.1.1,它于2012年10月6日发布,我一直在尝试使用内置的软件包系统,并使用它安装了几个软件包,但它们都有类似的问题,与自动加载和初始化.

例如,我使用一个名为的包smex,它提供了使用M-x和弦的增强功能.它需要你定义一个键M-x,所以我添加(global-set-key (kbd "M-x") 'smex)到我的init.el文件中.但是在启动emacs之后我按下M-x和弦,我收到消息"符号的函数定义是无效的:smex" ...如果我也放入(require 'smex)我的init.el文件,我收到错误消息"文件错误:无法打开加载文件,smex "

将smex的位置添加到load-path变量使得它按预期工作,但是,这似乎打破了首先拥有包系统的整个目的......

有什么想法吗?有没有更好的方法,或者我们现在忍受这个限制?

phi*_*ils 79

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

C-hig (emacs) Package Installation RET,特别是:

加载init文件后自动程序包加载的原因是用户选项仅在加载init文件后接收其自定义值,包括影响打包系统的用户选项.在某些情况下,您可能希望在init文件中显式加载包(通常是因为init文件中的某些其他代码依赖于包).在这种情况下,您的init文件应该调用该函数package-initialize.您需要确保package-load-listpackage-initialize呼叫之前设置相关的用户选项,例如(见下文).您还应该设置 package-enable-at-startupnil,以避免在处理init文件后再次加载包.或者,您可以选择在启动时完全禁止程序包加载,并调用该命令 M-x package-initialize 手动加载包.

因此,如果你确保你的init文件在调用之前处理你想要的package自定义组1中的变量的任何非默认值package-initialize- 并且你在自定义包库配置时保持这种方法 - 它应该是可以做的这个.

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

(add-hook 'after-init-hook 'my-after-init-hook)
(defun my-after-init-hook ()
  ;; do things after package initialization
  )
Run Code Online (Sandbox Code Playgroud)

将需要初始化包系统的代码放在该函数中.

因人而异.

(nb我没有测试过post-init方法,因为我没有真正使用package.el;但我确实在启动代码中确认了事件的顺序,所以我相信它会按照描述工作.)

1 M-x customize-group RET package RET

  • 我不知道为什么这个答案收到的票数如此之少而且还没有被接受......根据你所解释的内容,在接受的答案中提供的解决方案甚至看起来像是一个黑客. (5认同)

Nic*_*out 42

你有安装包package.el默认激活后,.emacs被加载.为了能够在.emacs你结束之前使用它们,你需要使用命令激活它们:

(setq package-enable-at-startup nil)
(package-initialize)
Run Code Online (Sandbox Code Playgroud)

  • @ErikAllik,downvoting是报告信息不准确.你应该只提出另一个更准确的答案.要理解为什么接受这个答案,只需看看日期.它是在另一个之前15个月写的. (5认同)