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

Emacs 如何为elpa软件包生成自动加载?,emacs,elisp,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/buil

我已经使用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

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

  • 您的错误消息来自
    生成的自动加载文件
    nil
    。您需要将其设置为指定要使用的输出文件。请参阅
    更新目录自动加载的文档字符串


  • TL;DR:您可能需要将
    (包初始化)
    添加到您的init文件中

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

    您也不需要要求每个包。但是,与其他所有Emacs Lisp文件一样,在自动加载声明可用之前,需要加载已安装软件包的自动加载文件

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

    因此,在加载
    init.el
    时,包(以及它们的自动加载)不可用,因此不能在
    init.el
    中使用包


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

    您可以使用包生成自动加载:

    (package-generate-autoloads "async" "~/.emacs.d/elpa/async-1.9.3/")
    
    它在内部调用更新目录自动加载。我发现,如果您手动将已安装的软件包替换为其他版本,并且希望以package.el在安装时的相同方式自动加载软件包,那么它将非常有用


    另请参见此问题:

    除非您正在做一些特殊的事情,否则您不需要为ELPA软件包生成自动加载。这是在包安装过程中自动完成的。您可能需要将
    (包初始化)
    添加到
    init.el
    ,以便实际加载包自动加载以在
    init.el
    中使用。Srv19:另请参见,在Emacs-27中,我们对其进行了更改,以便在加载
    ~/.Emacs
    之前调用
    包初始化