Emacs的24包装系统初始化问题Emacs的24包装系统初始化问题(Emacs 24 Packag

2019-06-02 14:58发布

在我看来,这是内置在Emacs的24新的包装系统具有一定的缺陷,当谈到正确加载和初始化安装的软件包。

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

例如,我使用称为包smex其提供增强了使用Mx和弦。 它需要你定义为一个关键Mx ,所以我加了(global-set-key (kbd "Mx") 'smex)在我init.el文件。 但是,启动Emacs后,我按Mx弦和我得到的消息“符号的函数定义是无效:SMEX” ......如果我也把(require 'smex)在我init.el文件我收到错误消息“文件错误:无法打开加载文件,SMEX”

添加SMEX的位置到负载路径变量,使得它的工作如预期,不过,这似乎击败摆在首位该封装系统的整体目的...

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

Answer 1:

您安装与包package.el默认激活你的 .emacs被加载。 为了能够您在年底前使用它们.emacs您需要使用命令来激活它们:

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


Answer 2:

值得一提的,为什么 Emacs的推迟包初始化:

CH 1 g ^ (emacs) Package Installation RET,特别是:

其原因自动封装加载加载init文件之后发生的是用户选择仅加载init文件,其中包括影响包装系统的用户选项之后接收它们的定制值。 在某些情况下,你可能想在你的init文件明确加载包(通常是因为在你的init文件一些其他的代码依赖于一个封装)。 在这种情况下,你的init文件应调用函数package-initialize 。 它是由你来确保相关用户选项,如package-load-list (见下文),在之前建立package-initialize呼叫。 你也应该设置package-enable-at-startupnil ,以避免在处理init文件后重新装入包。 另外,您也可以选择在启动时完全抑制封装加载并调用命令Mx package-initialize手动加载你的包。

所以,只要你确保你的init文件需要照顾你想为变量的任何非默认值的package自定义组1调用之前package-initialize -而且你只要定制封装库配置保持这种方式-它应该没事做到这一点。

另外,由于after-init-hook标准包初始化后运行完成后,你可以用它来评估哪些取决于封装任何初始化代码。 因此,而不是调用package-initialize在init.el直接,你可以代替写:

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

将需要该函数内的初始化包系统的代码。

因人而异。

(注:我还没有测试后的init方法,因为我真的不使用package.el;但我没有证实在启动代码的事件顺序,所以我相信描述,但工作)。

1 的Mx customize-group RET package RET



文章来源: Emacs 24 Package System Initialization Problems