给 ~/.emacs.d 增加 lock 文件

我的配置里一直以来都有个 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 看作二叉树,不规则的是不是就是多叉树?

关于包名诸位有没有更好的建议?

4 个赞

emacs -q

改了一个直白的名字发布了:

仍然欢迎更简短的包名建议。