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
的做用,是让这个新加入钩子的函数最后被调用。教程
全文完开发
【阅读原文】文档