什么是确保自动加载emacs中的自动加载功能的机制

时间:2015-03-05 22:56:18

标签: emacs

我理解所有标有一行“;;; ### Autoload”的函数都是一个自动加载的函数,但问题是执行这个'自动加载函数?'的机制是什么?还有为什么当一个人从elpa安装一个包时,有一个名为XXX-autoload.elc的编译文件?

3 个答案:

答案 0 :(得分:4)

当您安装Elpa软件包时,Emacs会扫描软件包中的所有.el文件以获取自动加载令牌,并将这些函数/变量的存根添加到[package] -autoloads.el文件中。存根只是将信息附加到函数/变量符号,告诉Emacs在哪里找到实际定义,以及docstring所说的内容。然后它将所有.el文件编译为.elc文件,包括自动加载文件。

然后(每次启动Emacs时)它会加载并评估[package] -autoloads.elc文件,而不是主.elc文件。这样,加载包的速度要快得多,因为主要的.elc文件只会在调用其中一个自动加载的符号时加载。直到那时,Emacs才知道主.el文件中的其他函数/变量。

答案 1 :(得分:2)

您自己的(非ELPA)自动加载需要您做两件事:

  • 生成loaddefs.el文件
  • 在启动时加载loaddefs.el文件

要生成它,您可以使用类似于我的函数:

(defun update-all-autoloads ()
  (interactive)
  (cd emacs-d)
  (let ((generated-autoload-file
         (expand-file-name "loaddefs.el")))
    (when (not (file-exists-p generated-autoload-file))
      (with-current-buffer (find-file-noselect
                            generated-autoload-file)
        (insert ";;")
        (save-buffer)))
    (mapc #'update-directory-autoloads
            '("" "oleh" "oleh/modes"))))

要加载,只需:

(load (concat emacs-d "loaddefs.el") nil t)

工作原理:第一个函数从所需目录中收集所有自动加载的函数 仅使用名称和位置来定义它们,没有正文。

由于身体尚未被评估,因此它应该加快速度。当你打电话给这个"空" 身体,它知道在哪里加载实际的。

上面的代码来自我的blog post 如果你需要,可能会有更多的背景。

答案 2 :(得分:1)

正如Drew评论的那样,您可以在手册中找到详细信息:

  • C-h i g (elisp) Autoload RET
  • C-h i g (elisp) Packaging Basics RET

这可能是您最想了解的方面:

A magic autoload comment (often called an "autoload cookie")
consists of `;;;###autoload', on a line by itself, just before the real
definition of the function in its autoloadable source file.  The
command `M-x update-file-autoloads' writes a corresponding `autoload'
call into `loaddefs.el'.

换句话说,这些自动加载cookie仅在生成loaddefs.el文件和ELPA包*-autoload.el文件时使用,然后Emacs必须load这些文件才能注册autoload定义。

Emacs自动加载其中一些文件,elisp包管理器通常会确保加载包自动加载。

您还可以使用这些机制生成自己的自定义自动加载文件,并告诉Emacs通过init文件加载它们。更常见的是,人们通常直接在其初始文件中写入(autoload ...)表单 - 这是为源中没有自动加载cookie的函数提供自动加载的最简单方法。