关于use-package用法的一些疑问

最近在使用 use-package 组织自己的配置,但是使用过程中有一些疑问,请教一下大家:

1、文档中说 :init 是在 load package 之前加载的配置, :config 是在 load package 之后加载的配置,可是我在使用过程中并没有发现这两个选项明显的用法区别,比如有一些 hook 或者 enable mode 操作,甚至是变量赋值都是放到 :init 里, 难道 package 里的 mode 或变量在 load 对应 package 之前就可以进行操作吗?

2、use-package 的用法基本上是一个 package 加一条配置,那么 use-pacakge 对于没有特殊配置 packages 能否用类似 devar packagelist 的方法统一加载?

3、对于个人的次级配置文件,例如 init-org.el ,使用 use-package 导入比直接使用 require 导入是否具有优势?

  1. 可以这么理解,你用 setq 定义的,优先级是比 package 定义的高的

1:有些插件要求在插件加载之前进行配置 因为插件实现方法不一

2:可以 自己写个宏?

3:没有

你开了 autoload (:defer t)就会有区別。

直接 (mapcar #'load ... 就行了

简单来说,没有

找到了作者的回答,我理解在严格意义上 :init 的代码应该是在 package 还未加载情况下运行的,而有些 package 在 use-package 之前可能已经加载了,所以有的配置里 :init 用到了 package 中的内容也不会报错,但是这样实际是和 :config 是混淆的。

我也想请教一下,什么情况下才需要用 :preface ?感谢 :pray:

根据文档的解释: Code to be run before everything except ‘:disabled’; this can be used to define functions for use in ‘:if’, or that should be seen by the byte-compiler.

:preface的代码应该是在最开始执行的(比:init还早,:if判断也在其后),并且可以进行byte-compile,不过莫非有些 lisp 语句不会进行byte-compile吗?

1赞

eval 执行的自然不会被 byte compile

请教一下,是不是eval执行就是直接在 emacs 内部的编译环境里执行,不会生成 elc 文件,而byte-compile会生成 elc 文件?

byte compile 只会把结果保存在内存里以能够执行,生成 elc 文件以免再次启动仪式emacs 后需要重新编译是可选的

那么byte-compileeval有何区别,执行时在内存中的形式不一样吗?

Emacs 的 eval 可以解釋执行一个 list,也可以直接执行 byte code。显然 byte code 和用 list 表示的程序形式是不一样的