使用 autoload 加速 emacs

Vim、Emacs配置和使用
回复
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

使用 autoload 加速 emacs

#1

帖子 kardinal » 2012-02-26 0:47

前面有个帖子里面贴了一段关于 autoload 的代码,是基于文件夹的(把自己定义的 autoload 放到一个文件夹里方便管理),失败的是,当时试图自己解决更新 loaddefs 的策略……这是纯爷们儿干的活,可想而之,一塌糊涂
后来我改了下,变的简单靠谱点,经过一段时间使用,效果还是不错的 :em09 ……绝大部分自己定义的函数,我都给弄成 autoload 了
其实 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
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 使用 autoload 加速 emacs

#2

帖子 tusooa » 2012-02-26 20:10

代码: 全选

generated-autoload-file is a variable defined in `autoload.el'.
Its value is "loaddefs.el"

  This variable is safe as a file local variable if its value
  satisfies the predicate `stringp'.
没明白是哪里的loaddefs.el

代码: 全选

] ls -ld //
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: 使用 autoload 加速 emacs

#3

帖子 kardinal » 2012-02-26 22:53

这个文件一般情况下为 /usr/share/emacs/lisp/loaddefs.el ……创建 autoload-file 时用到,加载时直接指定文件名
见同目录下的 loadup.el 文件
一些扩展也会创建和读取自有的 loaddefs,比如 cedet
因此给全局的 generated-autoload-file 设置一个值是不靠谱的
通常情况下,通过文件局部变量的方式设置这个值,比如
[lisp]
;; Local variables:
;; generated-autoload-file: "ldfs.el"
;; generated-autoload-load-name: "xxx"
;; End:
[/lisp]
但是需要添加到 loaddefs 里面包含 autoload 的每个文件后面都要有一段这样的话
……如果想节省存储空间,可以用我的办法
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: 使用 autoload 加速 emacs

#4

帖子 kardinal » 2012-02-26 23:02

你这个应该是 C-h v 出来的帮助吧?
全局的值应该是未定义的……
你这样的设置,在进行 update-directory-autoloads 之类操作的时候,会把 autoload 定义写到当前目录的 loaddefs.el 文件中
头像
老蒋
帖子: 52
注册时间: 2007-01-21 15:48
来自: 四川

Re: 使用 autoload 加速 emacs

#5

帖子 老蒋 » 2012-02-28 19:28

没看懂
回复