Emacs的org-mode實現自動的internal archive

原因

org-mode是一個Emacs內置的major mode,當打開一個後綴爲.org的文件時就會被啓用。在官網的介紹中提到,它能夠用於管理待辦事項,而這也正是我目前使用org-mode最多的場合。好比,我用它來記錄漫畫的閱讀進度,每一話或每一章就是一個標記了TODO關鍵字的條目,讀完那一話或那一章後就會將對應的條目標記爲DONE。通常我會一週一次地歸檔本身標記爲DONE的條目,但因爲一次要處理的條目可能不少,逐一將它們歸檔比較繁瑣,所以,便打算二次開發實現一個自動歸檔的功能。html

須要事先聲明的是,本文不是org-mode的入門教程,也不會講解如何配置org-mode。對這方面有興趣的讀者,能夠本身搜索一番,資料仍是至關豐富的。git

菜譜

對於每個被完成的單獨的閱讀任務,個人作法是將其internal archive。等到一整本漫畫都讀完以後,再將整個以漫畫名命名的條目歸檔到別的文件中去。要實現自動的internal archive,最簡單直接的辦法是藉助於org-mode提供的各類hook。github

org-mode提供了許多的hook,在官方的文檔中有一一列舉 。其中,名爲org-after-todo-state-change-hook的即是我所須要的鉤子。只需往這個變量所綁定的列表中添加一個函數,那麼這個函數便會在條目切換狀態時(好比從TODO切換到DONE)被org-mode調用。函數

最終的ELisp代碼以下code

(defun lt-archive-if-manga ()
  (let ((state org-state))
    (when (string= state "DONE")
      (let ((tags (org-get-tags-at)))
        (when (member "漫畫" tags)
          (org-toggle-archive-tag))))))

(add-to-list 'org-after-todo-state-change-hook 'lt-archive-if-manga t)

稍微解釋一下。從C-h v org-after-todo-state-change-hook RET的文檔能夠得知,條目的新狀態能夠經過變量org-state獲取。取得新狀態(是個字符串)後,首先檢查其是否爲"DONE"。若是是,再檢查這個條目是否爲一個閱讀漫畫的任務。htm

在個人用法中,凡是漫畫條目,都打上了名爲"漫畫"的標籤。所以,使用函數org-get-tags-at取得一個條目的全部標籤(包括從父級條目繼承下來的),再用member函數判斷這些標籤中是否包含字符串"漫畫"。若是有,就調用org-toggle-archive-tag將該條目internal archive。繼承

傳給函數add-to-list的第三個參數t的做用,是讓這個新加入鉤子的函數最後被調用。教程

全文完開發

閱讀原文文檔

相關文章
相關標籤/搜索