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

在我看来,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变量可以使其按预期工作,但是,这似乎使首先拥有软件包系统的整个目标无法实现...

有什么想法吗?有没有更好的方法,或者我们暂时还没有这种限制?


慕少森
浏览 470回答 2
2回答

人到中年有点甜

值得注意的是为什么 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
打开App,查看更多内容
随时随地看视频慕课网APP