use-package 的 :hook 和 :commands 有什么不同?

(use-package lsp-mode
  :init
  (setq lsp-keymap-prefix "C-c l")
  :config
  (lsp-enable-which-key-integration t)
  :hook (c++-mode . lsp))

请问这里的 hook 是不是表示我在开启 c++-mode 后,函数 lsp 会被调用呢。 如果我换种方式

(use-package lsp-mode
  :init
  (setq lsp-keymap-prefix "C-c l")
  :config
  (lsp-enable-which-key-integration t)
  :hook: (c++-mode . lsp-deferred)
  :commands (lsp lsp-deferred))

这是 lsp 官网抄来的,这里 hookcommands 是不是重复了啊

是的。相当于 (add-hook 'c++-mode-hook #'lsp-deferred)

你可以 C-h f use-package 去了解相关的关键字,或者去官方仓库看文档,上面有说明这个关键字的用法,以及例子。

:commands        Define autoloads for commands that will be defined by the
                 package.  This is useful if the package is being lazily
                 loaded, and you wish to conditionally call functions in your
                 ‘:init’ block that are defined in the package.
:hook            Specify hook(s) to attach this package to.
1 个赞

:commands 的用途是创建 autoload,不过 :hook 也会创建 autoload 就是了

推荐过一边 use-package 的文档,论坛里有人翻译了中文版

https://phenix3443.github.io/notebook/emacs/modes/use-package-manual.html

PS : 你第二个例子里 :hook 后面多了个冒号

直接把这个宏展开就好了,文档都不用看

emacs-lisp-macroexpand 看下就知道了

感觉leaf 要比 use-package 好用点。

两者都不用最简单。

两个差不多。use-package 更加流行,主流的第三方配置基本都是用 use-package 举例,很少看见用 leaf 举例的。

use-package 功能稳定,目前基本已经停止开发,作者工作忙,没时间维护。之前说的要在 Emacs 29 加入核心,也遥遥无期了。

是leaf想要内置进emacs吧?use-package不是因为协议有点麻烦嘛。

协议已经没问题了。只是作者没空,如果有人帮忙整理代码,以及文档等,应该就快了。看到也有人主动愿意帮忙,不知道目前进展怎么样了。

这里有 John Wiegley 最近的回复:

感谢大家的回复,我看了一遍 manual,基础部分已经理解了

use-package有个:defer加上数字延迟加载还是很不错,不用这个包的话只能自己写run-with-timer什么的实现了。

有个包叫 on ,可以根据需要设置包加载的时机。比如第一次按键,第一次打开文件什么的。

1 个赞