后来我改了下,变的简单靠谱点,经过一段时间使用,效果还是不错的

其实 elisp 里面有一个更新文件夹 autoload 的函数 update-directory-autoloads ,用起来也是比较靠谱的
但是它有一个很二的地方—— 不能指定输出文件,而是使用 generated-autoload-file 变量中保存的文件,而且正常情况下,这个变量值是 nil
[lisp]
(defun uatld (dir &optional loaddefs basedir)
(let* ((path
(expand-file-name dir basedir))
(ldfs
(or loaddefs "_loaddefs"))
(generated-autoload-file
(expand-file-name ldfs path)))
(update-directory-autoloads path)
(kill-buffer ldfs)
(load generated-autoload-file)))
[/lisp]
设置 generated-autoload-file 变量是可以的,但是那样比较二。像上面这段,使用同名局部变量覆盖就可以了
(uatld "path/file")这样使用就可以了 ,autoload-file 的名字默认为 "_loaddefs"
其实这些没有什么技术含量,值得注意的是 autolad 的工作方式
autoload 像数字、字符、列表、函数……一样,也是一种数据类型,使用 autoload 函数生成 autoload,性质和用 list 函数生成列表差不多
它包括函数名称、所在文件、文档、是否命令、实际类型,其中 function 和 file 必须的
(autoload FUNCTION FILE &optional DOCSTRING INTERACTIVE TYPE)
计算这个表达式后,function 的实际定义并不会被加载,file 也不会被读取。只有实际调用 function 这个函数时,才会加载 file
后面的可选参数存在的目的在于,即便你没有调用函数,仍可以查看它的说明,或者你能够以什么样的方式调用它,是否可以交互调用?
比如https://github.com/ran9er/init.emacs/bl ... /_loaddefs这个文件,里面就填满了 autoload 的定义
读取完这个文件,你就有了很多 autoload 函数了,但是却不用读取这些函数实际所在的文件
但是这些定义要是你自己写的话,就已经超越了纯爷们儿的范畴了,
https://github.com/ran9er/init.emacs/tr ... _autoload_打开一个除了 loaddefs 之外的其它文件,你可以看到
很多函数定义前面都有 ;;;###autoload,这表示后面的定义,会在 update-directory-autoloads 的时候自动添加到 generated-autoload-file 里面
需要注意的是 autoload 函数加载的时候,它所在的整个文件都会被读取
因此,你得合理的把函数们分到不同文件中去……如果你把所有的autoload 函数都写在一个文件里,那还不如直接 load 这个文件省事
也不需要在每个函数前面都写上 ;;;###autoload,只要在一些常用的函数前面写就可以了
你可能注意到了,我保存 autoload 的文件名,都以 “+” 作为前缀。
这不是必须的,只是为了避免潜在的文件名冲突,比如 “+dired.el” ,用 “dired.el” 做文件名是肯定不行的
因为这个文件已经存在于 loadpath 中了,调用这两个文件中存在的函数的时候,很可能会找到另一个文件,然后告诉你没有找到定义xxx