原文地址:https://www.lujun9972.win/blog/2020/05/09/如何自定義org-mode中的動態塊/index.html
org-mode的動態塊看起來跟代碼塊很類似,也是有一個開始和結束的標籤,只不過動態塊中的內容是通過特定函數自動生成的。
其中最常見的動態塊就是 clocktable
和 columnview
了。我常常用在進行季度總結和跟蹤任務列表時用到它們。
一個動態塊大概長這個樣子的:
其中 動態塊類型
決定了org-mode會調用哪個函數來生成動態塊的內容,調用的函數名稱爲規範 org-dblock-write:動態塊類型
.
這意味着,其實你完全可以自定義自己的動態塊,比如下面這段代碼摘自org的manual
(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-dblock-write:block-update-time
它定義了一名爲 block-update-time
的動態塊,然後我們就可以插入該動態塊了
Last block update at: on 05/08/2020 at 21:03
之後的 :參數1 參數值 :參數N h參數值
參數則會組裝成一個plist傳遞給函數作爲唯一的參數,並將函數的返回值作爲動態塊的內容
不過光是定義了生成動態塊還不夠,你無法通過命令 org-dynamic-block-insert-dblock
來幫你插入動態塊,而只能手工編寫動態塊。
這時我們就需要使用函數 org-dynamic-block-define
來註冊自己的動態塊類型。
(org-dynamic-block-define TYPE FUNC) Define dynamic block TYPE with FUNC. TYPE is a string. FUNC is the function creating the dynamic block of such type.
也就是說,我們還需要定義一個命令來生成自定義的動態塊,在這個命令中我們可以通過 org-create-dblock
和 org-update-dblock
來插入和更新動態塊.
(defun org-update-time-dblock () "Create a dynamic block capturing a column view table." (interactive) (org-create-dblock (list :name "block-update-time")) (org-update-dblock)) (org-dynamic-block-define "update-time" #'org-update-time-dblock)
org-update-time-dblock
之後我們就能使用 org-dynamic-block-insert-dblock
和 org-update-time-dblock
這兩個命令來插入自定義動態塊了。