最近尝试了capture+todo的gtd工作流,现在感觉有点笨笨的是,如果在一个todo.org文件中积攒了较多的任务后,完成的任务会占用绝大多数的篇幅,就会显得不那么优雅。能否通过配置切换TODO\DONE状态的方法,自动将完成了的任务丢进另一个文件中,让原本的todo.org更加清爽一点呢?
可以的
抱歉没找到对应的帖子 可以给一下链接吗?
直接搜索org-archive就可以
感谢 但我想的是,既然org-mode有像是org-log-done
这样在把任务设置为DONE状态下立刻添加Time Stamp的功能,那有没有类似的hook,可以实现在设置任务为DONE时,直接将其archive呢?
另,这个帖子的代码确实有效,但由于我设置的org-archive-location
是::* Archive
,这会导致递归的死循环,不知道有没有更好的解决方法?
看起来下面这个链接可以,没测试过。
我一般任务完成之后还会要求保留一段时间,因为这样才能在agenda view里展示. 移动到另一个文件我一般也是移动到archive文件中, 使用 org-archive-subtree
默认快捷键为 C-c $
. 定期移动一波就能保持 work.org 很清爽。
其实只要移动到的archive文件也是org并且在agenda的目录内的话,仍然可以显示的。但如果按照默认的,变成了tasks.org_archive
那就不行了。
分享我目前的解决方案:
使用的是doom emacs,因此在config.el的after! org
代码块添加
(add-to-list 'safe-local-variable-values '(after-save-hook . (archive-done-tasks)))
然后定义
(defun archive-done-tasks ()
(interactive)
(save-excursion
(goto-char (point-min))
(while (re-search-forward
(concat "\\* " (regexp-opt org-done-keywords) " ") nil t)
(goto-char (line-beginning-position))
(org-archive-subtree))))
最后在需要生成archive的org文件开头添加(以Tasks.org为例)
-*- mode: org; after-save-hook: (archive-done-tasks) -*-
#+ARCHIVE: Tasks_Archive.org::* Archive
这样的效果是:Tasks.org中将一个TODO设为DONE后,保存文件,会自动将对应的条目移至Tasks_archive.org的* Archive
标题下