package.el是否是自动require

我的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?

好的,谢谢各位!