前言

Emacs的包加载机制应该是Emacs学习的必修课 因为Emacs之所以被成为「操作系统」就是因为有大量的包 可因为从Emacs 24开始有了自带的包管理机制和各种「仓库」(Archive) 理解加载机制变的不那么重要了 这是好事也是坏事 因为没有需求所以学习的动力就不强了 我对这个加载机制一直稀里糊涂 我在23.x版本的时候还为安装那些第三方的包折腾过 后来升级到24后就没有再动过 直到最近要把之前写的一些东西分离出来(成果见这个) 所以折腾了一下 写一写心得

加载机制

Emacs加载一个函数有下面几种机制

  • load
  • providerequire
  • autoload

load

load是比较底层的函数(这个之前我也误解了) 还有一个封装的可供交互调用的load-file 都是加载一个el或者编译的elc文件

provide和require的组合

这个比上面的高级一点 如果一个文件以(provide 'helloworld)结尾 就表明这个文件定义了一个名为helloworldfeature 可以用(require 'helloworld)加载 Emacs会自动加载相关的文件而且不会重复加载 比load更智能高效

但有一个问题:相关的el文件必须放在Emacs能「找到」的地方 就是说需要在load-path

另外 文件放在load-path不表示Emacs会自动加载这个文件 这也是我之前的一个误解

autoload

autoload比上面的两个更高级更智能:它不会加载文件 而是在调用某些函数的时候加载相关的文件 具体有两种实现方式:显示调用autoload或者在你想设为autoload的函数前面加;;;###autoload

又一个误解:对于自己写的mode 在函数前面加;;;###autoload无效

因为这个东西只有调用generate-file-autoloads将这些autoload生成到一个文件里才管用 说白了 直接把这个东西(名字叫cookie 定义在generate-autoload-cookie里)写进去是无效的

关于这个autoload我还没有完全搞明白 所以不详细展开了

总结

越发感觉「不学无术」了 希望能不断提高不断进步 也希望各位读者能批评指正 谢谢