【存档】Org ID Remap


更新

表项覆盖 (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
1 个赞