如何为elpa包生成自动加载?

时间:2014-10-13 20:43:30

标签: emacs elisp

我已经使用elpa安装了多个软件包,并希望为它们适当地生成自动加载。为此,我添加到我的init文件中:

(apply 'update-directory-autoloads (directory-files package-user-dir t "[^\.].*"))

但是,我通过以下回溯得到了失败:

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  expand-file-name(nil "/build/buildd/emacs24-24.3+1/debian/build-x/lisp")
  autoload-generated-file()
  autoload-find-generated-file()
  update-directory-autoloads("/home/survivor/.emacs.d/elpa/ahg-20140818.130")
  eval((update-directory-autoloads "/home/survivor/.emacs.d/elpa/ahg-20140818.130") nil)
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp nil nil)

我试图做错的方式是什么?我应该为我的每个套餐添加require吗?

3 个答案:

答案 0 :(得分:3)

  1. 我认为安装软件包应该处理自动加载,至少是在软件包本身中声明的那些(即要生成的自动加载)。 (我可能错了。如果有的话,有人会纠正我。)

  2. 您的错误消息来自generated-autoload-file nil。您需要将其设置为指定要使用的输出文件。请参阅update-directory-autoloads

  3. 的文档字符串

答案 1 :(得分:3)

您可以使用package-generate-autoloads:

(package-generate-autoloads "async" "~/.emacs.d/elpa/async-1.9.3/")

它在内部调用update-directory-autoloads。我发现它有用,如果您手动将已安装的软件包替换为不同的版本,并希望以与安装时package.el相同的方式生成其自动加载。

另请参阅此问题:https://emacs.stackexchange.com/questions/33627/how-to-generate-and-activate-autoloads-for-local-packages/41274

答案 2 :(得分:2)

TL; DR:您可能需要将(package-initialize)添加到初始文件中。

您无需为包生成自动加载。包管理器在安装时自动执行此操作。您将在-autoloads.el目录的包目录中找到相应的~/.emacs.d/elpa/文件。

您也不需要每个包裹。但是,与其他所有Emacs Lisp文件一样,已安装软件包的自动加载文件需要加载(我知道这一点令人困惑),然后才能获得其中包含的自动加载声明。

当Emacs包管理器“激活”包时,它会自动加载包的自动加载文件。 Emacs还会自动初始化软件包管理器并激活所有已安装的软件包,但只有 后才能处理init.el

因此,在加载init.el时,软件包(以及它们的自动加载项)可用,因此您无法在init.el中使用软件包。< / p>

要解决此问题,您可以将所有设置推迟到after-init-hook,或者通过在初始文件的顶部添加(package-initialize)来强制Emacs初始化包管理器。