背景
由于个人喜好的因素,选择了用Emacs的org-mode来实践GTD,管理自己的任务和安排日程。但也因为个人喜好的因素,导致在安排第二天的计划,从积累的TODO列表中挑选要做的事情时,总会下意识地跳过一些一看就很麻烦的任务。久而久之,在列表的顶部,便堆积着一些好久前就创建的TODO。而因为总是从上往下挑选任务,列表的底部则是堆积着好久没有露脸的TODO。有不见者,三十六年。
迫切需要一个办法来解决这个难题,但若真的一丝不苟地从上往下处理每一条TODO又觉得没意思,该怎么办?不如从中随机地挑选TODO来安排到第二天的日程中?Sounds good。
如何实现
一开始,我是打算找找现成的类似功能的,不过放狗搜了一番后并没有什么收获。之后的某天我忽然意识到,.org文件不过就是普通的文本文件而已,直接用命令行工具处理就好了呀。摸索一番之后才知道并不难,成果就是下面这段简单的shell命令
1 | find . -name '*.org' ! -name 'trash.org' ! -name 'work.org' -exec grep -Hn '\*\* TODO' {} \; | sort -R | head -3 |
稍微解释一下。首先登场的是find
,它用来遍历目录下的所有.org文件——因为我把TODO按照不同的领域放到了不同的.org文件下。传递给find
的参数的意思,是“匹配所有文件名以.org结尾、但既不叫trash.org、也不叫work.org的文件”
1 | -name '*.org' ! -name 'trash.org' ! -name 'work.org' |
trash.org是垃圾箱,work.org存放的是工作相关的任务——我可不喜欢把工作安排到自己的闲暇时光里。
通过-exec
让find
调用grep
从.org文件中过滤出符合条件的带有TODO关键字的行——在我的.org文件中,有很多行是没有TODO关键字的非任务型的内容,它们可能是一个目标、一个分类,甚至可以是某个TODO条目下的“笔记”。用下面的正则即可筛选出想要的内容
1 | '\*\* TODO' |
总和运用find
和grep
后,便到了从中挑选的环节了。虽然开始的时候提到的是“随机地挑选”,但可以参考音乐播放器的“随机播放”功能的做法,即先将所有的TODO条目随机排序,然后从头开始按顺序取出前几个。sort
命令的-R
选项已经实现了随机排序,再用head
选取前3个即可。
全文完