只要在 setq 之前 defvar 就行。当然,实际上 defvar 只要在 closure variable capture 之前出现就没有问题,不能动态绑定本质上是代码不规范没有在使用动态作用域变量之前 require 其对应的 defvar 所在的文件或另外声明 defvar 导致的。
额外附一条说明,在变量本身 unbound 的情況下,用不带 initvalue 的 defvar 不会给变量赋值,见 为啥一个无关的局部绑定会引起编译警告?
如果没有对应的 setter,在动态绑定行为上 setopt 的行为和 setq 和 setq-default 都是一样的,并不会自动让变量变 special,所以你的说法是不准确的。
需要包加载完以后改 custotm 变量,或包的加载状态不固定如 pdumper 和 lazy 都在用的情况还是有的。