我已经使用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
吗?
答案 0 :(得分:3)
我认为安装软件包应该处理自动加载,至少是在软件包本身中声明的那些(即要生成的自动加载)。 (我可能错了。如果有的话,有人会纠正我。)
您的错误消息来自generated-autoload-file
nil
。您需要将其设置为指定要使用的输出文件。请参阅update-directory-autoloads
。
答案 1 :(得分:3)
您可以使用package-generate-autoloads:
(package-generate-autoloads "async" "~/.emacs.d/elpa/async-1.9.3/")
它在内部调用update-directory-autoloads。我发现它有用,如果您手动将已安装的软件包替换为不同的版本,并希望以与安装时package.el相同的方式生成其自动加载。
答案 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初始化包管理器。