为了账号安全,请及时绑定邮箱和手机立即绑定

Emacs 24软件包系统初始化问题

Emacs 24软件包系统初始化问题

慕少森 2019-10-17 15:42:52
在我看来,Emacs 24内置的新Package系统在正确加载和初始化已安装的软件包时存在一些缺陷。最近,我升级到了2012年6月10日实现的Emacs 24.1.1,我一直在尝试使用内置的软件包系统,并使用它安装了多个软件包,但是它们都具有与自动加载和初始化。例如,我使用一个名为的程序包,该程序包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变量可以使其按预期工作,但是,这似乎使首先拥有软件包系统的整个目标无法实现...有什么想法吗?有没有更好的方法,或者我们暂时还没有这种限制?
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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


请参阅C-hig (emacs) Package Installation RET,尤其是:


加载init文件后会自动加载软件包的原因是,用户选项仅在加载init文件后才收到其自定义值,包括影响打包系统的用户选项。在某些情况下,您可能希望在init文件中显式加载程序包(通常是因为init文件中的其他代码取决于程序包)。在这种情况下,您的初始化文件应调用函数package-initialize。您有责任确保package-load-list在package-initialize通话之前设置相关的用户选项,例如(请参见下文)。您还应该设置  package-enable-at-startup为nil,以避免在处理init文件之后再次加载软件包。或者,您可以选择在启动时完全禁止软件包加载,然后调用命令  M-x 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

  )

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


YMMV。


(nb我没有测试过初始化后的方法,因为我并未真正使用package.el;但是我确实确认了启动代码中的事件顺序,因此我相信它将按所述方式工作。)


1个 M-x customize-group RET package RET


查看完整回答
反对 回复 2019-10-17
  • 2 回答
  • 0 关注
  • 469 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信