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

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

我刚刚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

我使用 marmalade-repo 安装了 cmake-mode,并查看了 cmake-mode-autoloads.el。看来作者有意识地决定not在 autoloads 文件中包括设置所需的一切。但是,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... 目录并尝试重新安装(使用您自己的路径)。

答案2

鉴于 wiki 的本质是一半代码存储库,一半备忘录对于 Emacs 黑客来说,你很容易忽略了这一点:

将 package-initialize 移动到启动期间的另一个点可能会更容易,这样您就可以(需要)ELPA 包;这解决了许多描述的问题:

这是我所做的;我的自定义初始化脚本加载的第一个文件之一(据我所知,创建该脚本的是脑桥认真使用 Emacs 1

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

然后我只需要选择(require)我需要的 ELPA 包即可。这样做的好处还在于可以更好地控制 ELPA 安装包的行为;例如,如果我想暂时禁用某个包但不完全卸载它,只需注释掉相关调用即可(require),而默认行为需要将包完全移出我的 ELPA 目录。

(1. 尽管诱惑几乎压倒一切,我还是勇敢地拒绝为我的自定义初始化脚本命名lightsaber.el

答案3

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

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

答案4

我开始使用 ELPA 时也遇到过类似的问题。我有几个本地包,但 ELPA 中没有这些包。

因此我修改了 load-path。由于某种原因,package.el 无法正确更新 load-path。为了解决这个问题,我不得不(setq load-path (cons "~/.emacs.d" load-path)) 呼吁package-initialize

相关内容