设定 user option 应该用 setq, setopt, custom-set-default, customize-set-value, 还是 customize-set-variable?

只要在 setq 之前 defvar 就行。当然,实际上 defvar 只要在 closure variable capture 之前出现就没有问题,不能动态绑定本质上是代码不规范没有在使用动态作用域变量之前 require 其对应的 defvar 所在的文件或另外声明 defvar 导致的。

额外附一条说明,在变量本身 unbound 的情況下,用不带 initvalue 的 defvar 不会给变量赋值,见 为啥一个无关的局部绑定会引起编译警告?

如果没有对应的 setter,在动态绑定行为上 setopt 的行为和 setqsetq-default 都是一样的,并不会自动让变量变 special,所以你的说法是不准确的。

需要包加载完以后改 custotm 变量,或包的加载状态不固定如 pdumper 和 lazy 都在用的情况还是有的。