求教org中todo已完成纪录怎么自动归档到外部文件

  • TODO 读书计划 [0%] <2017-10-03 二 +1d>

    • State “DONE” from “TODO” [2017-10-01 日 17:19]
    • State “DONE” from “TODO” [2017-10-01 日 17:19]

    :PROPERTIES:

    :LAST_REPEAT: [2017-10-01 日 17:19]

    :end:

** TODO 红楼梦

** TODO 西游记

** TODO 水浒传

** TODO 三国演义

如上所示,怎么把state之后的这些完成纪录自动转移到外部文档如finish.org呢?也就是说在完成下面四个分项后成为done后,把state之后的这种纪录自动纪录到外部文件里。

2 个赞

在配置里定义一个新的方法

(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))))

如果只是想对特定的 org 文件起作用,在对应的文件开头加上

-*- mode: org; after-save-hook: (archive-done-tasks) -*-

如果想对所有 org 文件起作用,那么

(defun enable-auto-archive ()
  (add-hook 'after-save-hook 'archive-done-tasks))
(add-hook 'org-mode-hook 'enable-auto-archive)

示例如下,task.org 里有三个任务,保存后自动将状态为 DONE 的挪到 task.org_archive 文件中了

org-archive-done

6 个赞

多谢大神,理科生嘴笨,是我没说清楚。因为订立类似的读书计划时间太长了,结果类似这种state “DONE”……纪录项目就太多了,然后每次再改下面类似“红楼梦”了等小项,就会变得好慢,所以想把,这些State “DONE” from “TODO” 能自动移出去。但是下面的任务小项及上面一级任务项不移,不知有办法没?

那个叫 log,所以你要移走的是 log ?简单起见,你可以

(setq org-log-done nil)

或者在文件开头加入

#+STARTUP: nologdone

上述方法可以直接关闭任务的状态变化时的 log。

如果你只是觉得产生的 log 很多不想看见,那么可以让 log 记录在 drawer 里面

(setq org-log-into-drawer t)

效果如下图

org-log-into-drawer

如果你是因为一个文件里记录了太多东西,操作变得很慢,那么,可以

  • 使用 org-agenda,在独立的日程视图里查看和处理一段时间(天/周)内的任务

  • 使用 org-narrow-to-subtree ,只显示一个 subtree 的内容

2 个赞

多谢大神解惑。

C-c C-x C-s org-archive-subtree