关于 use-package 的 :custom

背景:use-package 除了提供 :preface:init:config 外,还提供了 :bind:hook:config

:custom 是否可以与 :config + setq 混用?比如:在配置 SLIME 时,需要指定 LISP 程序的位置:

(setq inferior-lisp-program "/opt/sbcl/bin/sbcl")

如果写成:

(use-package slime
  :ensure t
  :custom (inferior-lisp-program "/opt/sbcl/bin/sbcl"))

是不行的,SLIME 启动的时候依旧无法找到 sbcl 的位置,这里必须写成:

(use-package slime
  :ensure t
  :config
  (setq inferior-lisp-program "/opt/sbcl/bin/sbcl"))

:custom 只能修改用 defcustom 声明的变量

1 个赞

我的建议是直接用 setopt ,不用管 use-package

(setopt inferior-lisp-program "/opt/sbcl/bin/sbcl")

只在配置中使用这个代码设定 LISP 程序位置,然后另外加载 slime

1 个赞

我又重新看了一下,这个变量的前缀是 inferior-lisp,对应 Emacs 内置的 Inferior Lisp mode(即注释里提到的 inf-lisp),SLIME 和 SLY 都利用了这个 mode。

这个 mode 在 Emacs 本体程序的 lisp/progmodes/inf-lisp.el 中,这个文件里 inferior-lisp-programdefcustom 了的。 :thinking:

https://cvs.savannah.gnu.org/viewvc/emacs/emacs/lisp/progmodes/inf-lisp.el?revision=1.31.4.19&view=markup#l144

(defcustom inferior-lisp-program ; ......

:config + setopt 么?

这样写也可以…

不过由于这个变量内置了,我更习惯单独写出来,不必放在 slime 里面

1 个赞

错了,它们都早就不用 inf-lisp 了。

区別就是 :custom 用的 custom-theme-set-variables 设的变量只会在对应的 defcustom 执行后才生效,slime 不加載 inf-lisp,只 defvar 了变量,就不会生效,setopt 则是檢查有没有对应的 custom-set property,没有就 fallback 到 set-default

4 个赞