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的做用,是让这个新加入钩子的函数最后被调用。教程

全文完开发

阅读原文文档

相关文章
相关标签/搜索