Org 节点自动化
背景
在笔记系统的自动化方面常常有这样的需求:如果某些节点不存在,创建这些节点,如存在,视情况更新它们的内容。
Org mode 提供的 org-capture 特性一定程度上处理了节点创建相关的方面,但我们还需要某种检测及更新机制:检测目标节点在笔记系统中是否存在,并提供一个更新已存在节点的机制。
概述
org-autogen-defentry, 一个Org节点自动化工具。
注:本文中的 Org节点 特指 Org entry.
org-autogen-defentry 的核心逻辑很简单:目标节点存在则视情况更新,不存在则创建(并写入节点内容)。
为实现上述逻辑, org-autogen-defentry 定义了一些接口,比如判断当前位置是否是目标节点类型的 here?; 又比如提供节点信息的 info 以及根据节点信息寻找目标节点位置的 find; 还有用于判断目标节点是否需要写入节点内容的 dirty?; 用于更新目标节点内容的 update; 用于生成目标节点元数据和内容的 meta-data 及 content; 用于插入目标节点内容的 insert 等。
这些接口的实现都需要由调用方提供给 org-autogen-defentry. org-autogen-defentry 通过这些接口将 节点的具体定义细节 与 节点的自动创建及更新逻辑 隔离开。
用例
以下的用例展示了通过 org-autogen-defentry 定义一个用于自动收集某日时间戳日志的节点类型。
(org-autogen-defentry
;; 定义名为 day-log 的节点类型。
;; 可通过 M-x org-entry:day-log 创建或
;; 更新现存节点。
day-log
;; 通过“意识流”标签及是否具备 CUSTOM_ID
;; 判断当前位置是否目标节点。
"+意识流+CUSTOM_ID={.}"
;; 寻找、创建目标节点所需的信息。
:info (org-read-date nil t)
;; 通过 match 寻找目标节点。
:find-match
(format
"+ITEM={%s}+意识流+CUSTOM_ID={.}"
(format-time-string "%y.%-m.%-d" info))
;; match 寻找的范围。
:find-match-scope '("~/org/stream.org")
;; 创建目标节点时,节点的元数据。
:meta-data
(list
:ITEM (format-time-string
"%y/%-m/%-d" info)
:TAGS "意识流"
:CUSTOM_ID
(format-time-string "%Y-%m-%d" info)
:CREATE_TIME
(format-time-string
(org-time-stamp-format t t) info))
;; 目标节点的内容
:content
(concat "#+begin: ts-text :scope all\n"
"#+end:")
;; 目标节点将存于何处?
:target
'(id "a867203a-ab58-40b9-becb-1443f700a391")
;; 目标节点将如何更新?
:update (org-map-dblocks))
其创建的节点:
待续…
