use-package的init与config分别应该在什么时候使用?

自己在整理东拼西凑的配置文件时产生的疑问,对于一个mode,究竟应该在package load之前:init就唤起,还是应该在package load之后:config再唤起?我个人的理解是,毕竟要等package加载完毕之后,才能使用相应的函数。

但是看到ivy和counsel的use-package片段之后,我又迷茫了:

(use-package ivy
  :ensure t
  :diminish ivy-mode
  :config (ivy-mode 1)
  :custom (ivy-use-selectable-prompt 1))
(use-package counsel
  :ensure t
  :init (counsel-mode 1))

为什么ivy要在加载之后使用,而counsel要在加载之前使用?

跪求解惑

实际上这 2 者都可以写在 :init 里,因为 ivy-modecounsel-mode 这 2 个函数都是 autoload 过的,可以看一下 ivy-autoloads.el 和 counsel-autoloads.el 这 2 个文件。

1 个赞

总体来说

  • :init总是会执行,不管你有没有安装这个库
  • :config在库被require之后执行

具体也看其他选项怎么组合,如:if use-package-keywords这些都会有影响。

要想明确一点,还是得展开宏看看:

  1. 把光标置于(use-package ...)括号之后

  2. M-x执行pp-macroexpand-last-sexp

把配置换到init和config分别看看它在做啥

2 个赞