Org节点自动化


Org 节点自动化


背景

在笔记系统的自动化方面常常有这样的需求:如果某些节点不存在,创建这些节点,如存在,视情况更新它们的内容。

Org mode 提供的 org-capture 特性一定程度上处理了节点创建相关的方面,但我们还需要某种检测及更新机制:检测目标节点在笔记系统中是否存在,并提供一个更新已存在节点的机制。

概述

org-autogen-defentry, 一个Org节点自动化工具。

注:本文中的 Org节点 特指 Org entry.

org-autogen-defentry 的核心逻辑很简单:目标节点存在则视情况更新,不存在则创建(并写入节点内容)。

为实现上述逻辑, org-autogen-defentry 定义了一些接口,比如判断当前位置是否是目标节点类型的 here?; 又比如提供节点信息的 info 以及根据节点信息寻找目标节点位置的 find; 还有用于判断目标节点是否需要写入节点内容的 dirty?; 用于更新目标节点内容的 update; 用于生成目标节点元数据和内容的 meta-datacontent; 用于插入目标节点内容的 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))

其创建的节点:

待续…

3 个赞