Org 支持在 Org 文档中使用 动态区块(dynamic blocks) 。它们和普通代码块一样使用起始和结束标记插入,但其内容会由用户自定义函数自动更新。
你可以使用 org-dynamic-block-insert-dblock 插入动态区块,该函数默认绑定到 C-c C-x x。例如,C-c C-x x c l o c k t a b l e RET 会插入一个自动更新工作时长的表格(见 Clocking Work Time)。
动态区块可以拥有名称和函数参数,语法与源代码块声明类似:
#+BEGIN: myblock :parameter1 value1 :parameter2 value2 ... ... #+END:
以下命令用于更新动态区块:
在更新动态区块前,Org 会先清除 ‘BEGIN’ 和 ‘END’ 标记之间的内容。随后 Org 读取 ‘BEGIN’ 行上的参数,并以属性列表形式传递给写入函数。动态区块原先的内容会从缓冲区中移除,并追加到属性列表的 :content 键下。
命名为 ‘myblock’ 的动态区块对应的写入函数命名规则为: org-dblock-write:myblock 。
下面是一个动态区块及其写入函数的示例,该函数会更新自身最后一次运行的时间:
#+BEGIN: block-update-time :format "on %m/%d/%Y at %H:%M" ... #+END:
该动态区块的写入函数:
(defun org-dblock-write:block-update-time (params)
(let ((fmt (or (plist-get params :format) "%d. %m. %Y")))
(insert "Last block update at: "
(format-time-string fmt))))
若要让 Org 文件中的动态区块始终保持最新,可将 org-update-all-dblocks 函数加入钩子,比如 before-save-hook 。如果文件未处于 Org 模式,该函数不会运行。
动态区块与其他区块一样,可通过 org-narrow-to-block 进行收缩显示。