Emacs 24:加载通过ELPA安装的软件包


12

我刚刚cmake-mode使用以下命令在Emacs 24中安装了该软件包:

M-x package-install cmake-mode

我可以看到包:~/.emacs.d/elpa/cmake-mode-20110824,我可以使用指令在加载它Commentary:的部分~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el

;; Add this code to your .emacs file to use the mode:
;;
;;  (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path))
;;  (require 'cmake-mode)
;;  (setq auto-mode-alist
;;        (append '(("CMakeLists\\.txt\\'" . cmake-mode)
;;                  ("\\.cmake\\'" . cmake-mode))
;;                auto-mode-alist))

但这与ELPA的EmacsWiki页面上的用法说明矛盾:

...软件包在init.el加载后初始化。这意味着您不应该将特定于程序包的初始化放入您的init.el中。

我倾向于同意此说明,因为在~/.gnu-emacs文件中添加了以下行:

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

是很难看的,如果我何时升级软件包,它会损坏。但是,如果没有这一行,我将无法使用cmake-mode

我在这里想念什么吗?

笔记:

  • 我没什么奇怪的package-enable-at-startup,它的价值是t
  • 我正在使用序曲
  • user-emacs-directory值是"~/.emacs.d/" (感谢@lawlist的建议)
  • package-user-dir 值是 "~/.emacs.d/elpa"

1
您是否可能已经更改了default-directory或的位置user-emacs-directory,从而elpa未加载目录? package-install创建elpa目录,并且在安装过程中创建的自动加载文件将基于该位置。
法律列表

1
问题中的最后一行代码建议您将软件包移出elpa目录,即~/.emacs.d/cmake-mode-20110824/不在自动加载文件期望的位置。
法律列表

@lawlist:您非常观察。我在这个问题上犯了一个错误。现在已将其(问题)固定为的正确值~/.emacs.d/elpa/cmake-mode-20110824/。问题仍然存在。
陈征费

Answers:


2

我在果酱回购中安装了cmake-mode,并查看了cmake-mode-autoloads.el。看来作者做出了一个明智的决定not,将自动加载文件中设置所需的所有内容都包括在内。但是,在问题中引用的cmake-mode.el第25至30行上的说明是正确的。如果您使用的线25至30,并正确设置路径,那么你就不要需要一个额外的代码行等(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

显然,您不想使用/dir/with/cmake-mode-您想~/.emacs.d/elpa/cmake-mode-20110824在结尾处使用不带正斜杠的形式。

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path))
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

如果上面的代码不起作用,则可能需要删除c-make-mode ...目录,然后尝试重新安装(使用您自己的路径)。


可以,但是除非我丢失了某些内容,否则如果您以后通过ELPA更新cmake-mode,则目录将被重命名为init文件中未包含的内容,或者较新的版本最终位于不在您的加载路径中的目录中。在后一种情况下,您可能看不到更新,或者由于手动加载一个版本而(package-initialize)正在加载另一个版本而感到不适当。我错了吗?我的意思是,我使用ELPA的次数不多,还没有用它更新任何软件包,所以我可能是错的。而且,可以肯定的是,无论如何这都不是主要问题,但是为什么不完全避免呢?
亚伦·米勒

你是对的。但是,这些软件包不仅会在您不知道的情况下进行自身更新,而且如果您进行更新的时间以及何时进行更新,那将是您做家务的时候了。我经常花费大量时间来修改各种软件包的源文件,而在花了所有时间使它们正确之后,我并不一定要对其进行更新。Emacs远非人们认为的“免维护”。
法律列表

一个很好的观点。
亚伦·米勒

3

鉴于Wiki具有一半代码存储库,针对Emacs黑客的一半助手存储的性质,可以理解的是,您忽略了这一点:

仅在启动过程中将程序包初始化移至另一点可能会更容易,因此您可以(需要)ELPA程序包;这可以解决很多上述问题:

这就是我要做的;我的自定义init脚本加载的第一个文件之一(据我所知,创建的文件是Emacs严重使用1pons asinorum

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

从那里,我只需(require)我需要的ELPA软件包。这还具有允许对安装了ELPA的软件包的行为进行更好的控制的好处。例如,如果我暂时要禁用给定的软件包,但又不想完全卸载它,则只需注释掉相关的(require)调用即可,这是默认行为,这需要将软件包完全移出我的ELPA目录。

(1.尽管几乎受到了压倒性的诱惑,但我还是坚决拒绝命名自定义的初始化脚本lightsaber.el。)


只是提醒您检查user-emacs-directory是否已更改,因为默认情况下ELPA软件包位于其中。我将我的东西保存在Dropbox中,我惊讶地发现在我对setq进行设置之前,批处理脚本中的上述命令没有任何效果。
mlt

1

您可以使用加载程序包后进行所有初始化after-init-hook。从EmacsWiki

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))

0

我开始使用ELPA时遇到了类似的问题。就我而言,我有几个本地软件包,因为ELPA中不存在这些本地软件包。

因此,我改变了负载路径。由于某些原因,package.el无法正确更新加载路径。为了解决这个问题,我不得不在致电(setq load-path (cons "~/.emacs.d" load-path)) 之后package-initialize

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.