我的config里先require了package包,然后配置如下,使用过程中发现my/packages里的很多包我自己并没有显式的require,但是emacs里却可以使用,想请教一下package.el里是否实现了自动require所有包,具体在我配置中的哪一句实现的?
因为有autoload机制
package.el
会为包生成autoload文件,然后package-initialize
会加载这些autoload文件. 你不需要require就可以直接使用包里的一部分函数, 当这些函数被实际调用的时候, emacs会去加载对应的package(所谓lazy loading)
最近准备写一篇文章讲解一下autoload机制
6 个赞
原来如此,感谢感谢🙏
追问一句,package.el如何确定给哪个package加autoload,是通过my/package这个list嘛,具体实现是在package-install的时候还是那个package-selected-packages?
通过autoload cookie, autoload是函数级别的, 通常是用户使用的函数, 包作者会选择autoload
你可以在package文件里搜索;;;###autoload
, package.el
为这个注释后面的定义生成autoload
细节的到时放在文章里说吧
也就是说那些自动require的包,是作者在里面做了autoload的配置,所以package.el会对它auto load,这样理解对吗?
是的, zsbd
不过,flymake / flycheck 会把没有 require 就使用的函数看成未定义函数 ,有没有什么方式不让它把 autoload 的函数给当成未定义的函数?
如果是自己的代码的话,可以写在 with-no-warnings
里:
(with-no-warnings
(defun xxx ()
))
感觉这个方法有点不方便呀,如果每一个函数都要这样写。请问有没有什么对于 flymake 或者 flycheck 本身的解决方法?
子龙山人教程里有讲
declare-function?
好的,谢谢各位!