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

4

我使用elpa安装了许多包,并希望为它们适当地生成autoloads。 为此,我在我的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语句?


1
除非你在做一些特殊的事情,否则你不需要为ELPA包生成autoloads。这在安装包时会自动完成。 - legoscia
你可能需要在你的 init.el 文件中添加 (package-initialize),以便实际加载包自动加载并在 init.el 中使用。 - user355252
3个回答

7

3

简而言之: 你可能需要在你的init文件中添加(package-initialize)

你不需要为你的包生成autoloads。安装包时,包管理器会自动完成这个过程。你可以在~/.emacs.d/elpa/目录下找到相应的-autoloads.el文件。

你也不需要要求每个包。然而,像其他Emacs Lisp文件一样,已安装包的autoload文件需要在其中包含的autoload声明可用之前被加载(令人困惑,我知道)。

当“激活”一个包时,Emacs包管理器会自动加载该包的autoload文件。Emacs还会自动初始化包管理器并激活所有已安装的包,但只有在处理完你的init.el后才会这样做。

因此,在加载你的init.el时,包(以及其中的autoloads)是不可用的,所以你不能在init.el中使用包。

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


Srv19:另请参阅https://dev59.com/uWgu5IYBdhLWcg3wt5Pt。 - phils
顺便提一下,在Emacs-27中,我们已经更改了这个设置,以便在加载“~/.emacs”之前调用“package-initialize”。 - Stefan

2
  1. 我认为安装一个软件包应该会处理autoloads,至少是那些在软件包本身中声明的(也就是生成的autoloads)。如果我错了,有人会纠正我的。

  2. 你的错误消息来自于 generated-autoload-filenil。你需要设置它来指定要使用的输出文件。请查看 update-directory-autoloads 的文档字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接