我理解所有标有一行“;;; ### Autoload”的函数都是一个自动加载的函数,但问题是执行这个'自动加载函数?'的机制是什么?还有为什么当一个人从elpa安装一个包时,有一个名为XXX-autoload.elc的编译文件?
答案 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评论的那样,您可以在手册中找到详细信息:
(elisp) Autoload
RET (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的函数提供自动加载的最简单方法。