如何自定義org-mode中的動態塊

原文地址:https://www.lujun9972.win/blog/2020/05/09/如何自定義org-mode中的動態塊/index.html

org-mode的動態塊看起來跟代碼塊很類似,也是有一個開始和結束的標籤,只不過動態塊中的內容是通過特定函數自動生成的。 其中最常見的動態塊就是 clocktablecolumnview 了。我常常用在進行季度總結和跟蹤任務列表時用到它們。

一個動態塊大概長這個樣子的:

#+BEGIN: 動態塊類型 :參數1 參數值 :參數N h參數值

#+END:

其中 動態塊類型 決定了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 的動態塊,然後我們就可以插入該動態塊了

#+BEGIN: block-update-time :format "on %m/%d/%Y at %H:%M"
Last block update at: on 05/08/2020 at 21:03
#+END:

之後的 :參數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-dblockorg-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-dblockorg-update-time-dblock 這兩個命令來插入自定義動態塊了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章