更新
表项覆盖 (2).
特性的上下文见表项覆盖。
现在我们提供另一种表项覆盖的方法:
(org-id-remap 'reset)
(org-id-remap
;; old version
"id1" "link1"
"id1" "link2"
"id2" "link3"
"id3" "link4"
nil nil
;; new version
"id2" "link6"
"id2" "link5")
当前映射表:id1->{link1,link2}, id2->{link5,link6}, id3->{link4}
.
实现:
#+name: 2025-08-03-15-43
#+begin_src emacs-lisp :eval no
(!def set-mapping
(lambda (mappings)
(let ((mappings
(seq-partition mappings 2))
kv k v)
;; 覆盖已有的映射表项,以用新表项变更文本版本。
(mapcar
(lambda (kv)
(setf (gethash (car kv) mapping) nil))
mappings)
;; 建立映射。
(catch 'break
(while (length> mappings 0)
(setq kv (car mappings))
(setq mappings (cdr mappings))
(setq k (car kv))
(setq v (cadr kv))
;; nil nil 分隔不同版本。
(when (and (null k) (null v))
(throw 'break t))
(unless
(member v (gethash k mapping))
(push v (gethash k mapping)))))
(when mappings
(apply #'org-id-remap
(flatten-list mappings))))))
#+end_src
映射表:
尽管前一版本提供了一个复用映射表的特性,但这里我们没使用该特性,而是依旧复制了一份完整的映射表,因为在使用的过程,org-id-remap
的构建存在自我指涉问题,现简单表述如下:
本贴中有一个无任何依赖的初版 A, 但是相比于最新版本, A 少了某些特性 (后称特性 b), 而最新版本的 org-id-remap
(后简称 remap
) 的构建中有使用到特性 b, 这意味着——我们光有 A 还不足以一步到位地将 remap
升级到最新版本,我们必须先从 A 开始,升级到具有 b 特性的版本,然后才能升级到最新版本。如果后续版本的 remap
不断有新特性,而构建 remap
最新版本时又不断地使用这些新特性,那意味着我们只能一步一步地升级到最新版本的 remap
.
由于 表项覆盖 (2) 这个特性与 org-id-remap
的构建相关,所以,我们这里完整拷贝一份映射表,以便从 A 直接更新到当前版本。
#+name: 2025-08-03-15-49
#+begin_src emacs-lisp :eval no
"org-id-remap::set-mapping"
"emacs-china/org-id-remap:29814::2025-08-03-15-43"
;; 未变更部分
"org-id-remap::cmd-impl"
"emacs-china/org-id-remap:29814::2025-07-25-21-30"
"org-id-remap::cmd-entry"
"emacs-china/org-id-remap:29814::2025-07-25-21-34"
"org-id-remap::cmd-doc"
"emacs-china/org-id-remap:29814::2025-07-25-21-33"
"org-id-remap::org-id-remap"
"emacs-china/org-id-remap:29814::2025-07-25-20-48"
"org-id-remap::link-verify"
"emacs-china/org-id-remap:29814::2025-07-25-20-49"
"org-id-remap::drawer-search"
"emacs-china/org-id-remap:29814::2025-07-25-20-50"
"org-id-remap::open-file-link"
"emacs-china/org-id-remap:29814::2025-07-25-20-51"
"org-id-remap::remap"
"emacs-china/org-id-remap:29814::2025-07-25-20-52"
"org-id-remap::remap-sort-links"
"emacs-china/org-id-remap:29814::2025-07-25-20-53"
"org-id-remap::cache-http-link"
"emacs-china/org-id-remap:29814::cache-http-link"
"org-id-remap::cmd-set"
"emacs-china/org-id-remap:29814::cmd-set"
"org-id-remap::log"
"emacs-china/org-id-remap:29814::log"
"org-id-remap::private"
"emacs-china/org-id-remap:29814::private"
#+end_src
构建入口:
#+name: 2025-08-03-15-53
#+header: :var tangle="no" load="no"
#+begin_src emacs-lisp :results silent :noweb yes :eval no
(org-id-remap 'reset)
(org-id-remap
"build-script"
"https://emacs-china.org/t/org-id-remap/29814::2025-08-03-11-27"
"build-target"
"https://emacs-china.org/t/org-id-remap/29814::2025-07-25-20-36"
"map-table"
"https://emacs-china.org/t/org-id-remap/29814::2025-08-03-15-49")
(org-id-remap t)
(org-exec "[[id:build-script]]" nil
:eval "yes"
'target "[[id:build-target]]"
'map-table ''("[[id:map-table]]")
'tangle (or tangle "~/org/org-id-remap.el")
'load (or load "yes"))
#+end_src