我的配置里一直以来都有个 dont-panic.el
文件,故名思议就是:别慌,任何时候都一个最小配置的 Emacs 可用,即使加载出错,也不存在「用 vi 编辑 emacs 配置文件」的尴尬。
对于包的管理,我也同样有一个 DON’T PANIC 机制:lock 文件。每当更新之后出错,就在 lock 文件中锁定旧版本;或者要体验抢先版的时候,就在 lock 文件中指定获取路径。
由于最近打算把配置迁移到 use-package
,所以先行测试一下这部分。
假设我的配置用到了 foo 包:
(use-package foo
:init
...
:config
....)
但是更新之后这个包出错了,这时就可以通过 lock 文件来锁定旧版本,或者安装还未合并的 pr 分支:
(load (expand-file-name "locked-packages.el") t)
;; $ cat locked-packages.el
;; (setq locked-packages
;; '((foo :straight (:host github
;; :repo "bar/foo"
;; :branch fix-issue-XXX))))
(define-advice use-package (:around (fn name &rest args) prepare-lock-params)
(let ((locked (alist-get name locked-packages)))
(apply fn name (if locked
(sparse-plist-merge args locked)
args))))
修改 lock 文件即可以达到对 (use-package ...)
进行覆盖/追加的目的,所以如果在 lock 文件中没有设置 :config
,那么原来的 :config
是会保留袭来的。
另,
这里的 sparse-plist-merge
函数出自我的一个还未发布的包。用来合并不规则 plist:
(sparse-plist-merge
'(:foo (1) 2 :bar 3)
'(:foo 4 5 6))
;; => (:foo 4 5 6 :bar 3)
这个包还有 sparse-plist-{ member, get, put, mapc }
等接口,没发布的原因是对包名不太满意。
目前暂定 sparse-
,意指把 plist 按 keyword 对齐排列想象成矩阵,再抽掉一些 keyword,就变成不规则 plist —— 也就是稀疏矩阵。这个想象会不会太牵强?
还考虑过其它名字:
-
flat-
表示 value 是扁平的::foo (1 2 3)
=>:foo 1 2 3
-
nary-
如果把常规的 plist 看作二叉树,不规则的是不是就是多叉树?
关于包名诸位有没有更好的建议?