如何使用单个命令归档所有已完成的任务

64

为归档已完成的任务,我正在使用

C-c C-x a

命令。缺点是我必须手动逐一移动完成的任务,然后将其存档。

如何使用单个命令归档所有已完成的任务。


刚刚注意到运行 M-x org-archive-subtree C-x-z (一直按 z)接近于一个命令解决方案。不确定是否对任何人有所帮助 :) - bgs
8个回答

65
你可以在日程视图中批量归档(或重新归档/更改待办事项等)。 http://orgmode.org/manual/Agenda-commands.html#Agenda-commands 如果你从要归档的缓冲区中调用Org-Agenda,你可以暂时将其限制为仅查看该缓冲区,只查看待办事项并过滤已完成的。
C-c a < t
N r

其中N对应于您的“完成”状态的快捷方式(默认状态下为2)

然后,您只需要标记所有所需的标题并批量归档即可

m (mark for bulk action)
B a (or B $ for arch->sibling)

2
感谢您的回答。有一个小建议,请将org-agenda的快捷键缩写更正为“C-ca”,而不是“C-c C-a”,因为新手大多会遵循org-manual,其中“C-ca”被用作org-agenda的快捷键。 - Talespin_Kit
1
@Talespin_Kit 哎呀,我本来想打 C-c a I 的,只是打错了。谢谢你指出来。 - Jonathan Leech-Pepin
@I82Much 将光标移动到要标记的行上,然后按 m 键。 - Sven Koschnicke
2
在org-mode 8.2.3c版本中,B $表示存档,B A表示存档->同级。 - Sven Koschnicke
1
当您使用 N r(其中 N 是要列出的状态)时,它将拉取已完成的状态,因此它们将不再被忽略,并将被列出。 - Jonathan Leech-Pepin
显示剩余4条评论

57

这是 madalu 代码片段的纠正版本。注意,此版本也仅对当前子树进行操作(将 'tree 更改为 'file 可以在整个文件上运行)。

(defun org-archive-done-tasks ()
  (interactive)
  (org-map-entries
   (lambda ()
     (org-archive-subtree)
     (setq org-map-continue-from (org-element-property :begin (org-element-at-point))))
   "/DONE" 'tree))

9
这是正确答案。另外,如果您使用 'agenda 范围而不是 'file,那么它将应用于所有已注册的日程文件。完美! - Daniel Dinnyes
1
我已将 'tree 更改为 'agenda。但是,如果我将任务标记为完成,什么也不会发生。即使调用函数也无法归档它。您知道这可能是为什么吗? - math
1
这会删除所有内容,即使它不是“/DONE”。 - alper
这个怎么设置目的地?有人知道吗? - undefined
回答我自己的问题,通过设置org-archive-location - undefined
显示剩余8条评论

31

你可以使用org-map-entries函数编写一个函数:

(defun my-org-archive-done-tasks ()
  (interactive)
  (org-map-entries 'org-archive-subtree "/DONE" 'file))

1
这是在归档时跳过偶数子标题。看起来应该使用org-map-continue-from变量(我还没有弄清如何使用它们)。以下是帮助文本:“评估后,光标将移动到行末(可能是已处理条目的标题),搜索将从那里继续。”...“在这种情况下,您可以通过使FUNC设置变量`org-map-continue-from'到所需的缓冲区位置来指定搜索应该从哪个位置继续。” - Talespin_Kit
3
正如@Talespin_Kit所提到的,这个答案存在一个bug,跳过了每个第二个DONE条目。 Stefan在下面给出的答案修复了这个问题,并且对我来说那个答案是正确的。 - Daniel Dinnyes
2
如果这个答案有 bug,那么它不应该被标记为已接受的答案,而应该接受一个能够正常工作的答案。 - Adrian

7

另外还有来自http://orgmode.org/manual/Moving-subtrees.html#Moving-subtrees

C-u C-c C-x C-s

检查当前标题的任何直接子项是否可以移动到归档位置。为此,将检查每个子树以查找打开的TODO条目。如果没有找到,则该命令会提供将其移动到归档位置的选项。如果光标不在标题上时调用此命令,则将检查级别1的树。


看起来我每次都要做 C-x h 来选择所有文本,然后我还要做 C-u C-c C-x C-s - agent18

2
现在,org-mode 中有一个名为 org-archive-all-done 的命令,并且它被构建在 org-archive.el 中。

我想知道为什么这个没有标记为互动的?它很有用! - draxil

2

基于罗伯特的回答

(require 'org)
(require 'org-archive)
(add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook 'org-archive-all-done nil t)))

1
如果您想在源Org缓冲区中执行此操作(而不是在Org日程视图中),并且它们是相互跟随的,则可以在区域中选择它们所有,并应用命令(例如C-c C-t d)。
唯一需要设置的:
;; Some commands act upon headlines in the active region.
(setq org-loop-over-headlines-in-active-region 'start-level)

0

我发现在一些嵌套更多、多层级TODO的情况下,直接使用“org-map-entries”方法有点“脆弱”。

这种方法——生成一个列表,然后反向归档(以避免位置变化)——似乎涵盖了我所遇到的每种用例。在此分享给其他遇到问题的人。

请注意,最后一行上的“TODO”字符串匹配需要与您的TODO定义完全匹配(例如,在普通情况下,匹配可能是:"TODO=\"DONE\"")。

(defun org-archive-done-tasks ()
  "Archive all tasks marked DONE in the file."
  (interactive)
  (mapc (lambda(entry)
          (goto-char entry)
          (org-archive-subtree))
        (reverse (org-map-entries (lambda () (point)) "TODO=\"★ DONE\"" 'file))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接