怎样在完成了一个TODO项目后,自动将该项目放置到一个另外的文件中?

最近尝试了capture+todo的gtd工作流,现在感觉有点笨笨的是,如果在一个todo.org文件中积攒了较多的任务后,完成的任务会占用绝大多数的篇幅,就会显得不那么优雅。能否通过配置切换TODO\DONE状态的方法,自动将完成了的任务丢进另一个文件中,让原本的todo.org更加清爽一点呢?

可以的 image

抱歉没找到对应的帖子 可以给一下链接吗?

直接搜索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标题下