请教怎么查询过去一个月内标记DONE了的TODO事件

写月报,发现过去一个月的事情几乎记不起来 手工查吧,也实在乱,一般只能翻照片,知道过去一个月都干了点啥 要是能用org-mode直接带出来就善莫大焉

找到这篇帖子,试了下没解决,可以改成R,最后一句没看懂

Org-mode agenda: Show list of tasks done in the past, and not those clocked - Emacs Stack Exchange

(with-eval-after-load 'org-agenda
  (add-to-list 'org-agenda-custom-commands
               '("R"  "Month Report"
                 agenda ""
                 ((org-agenda-start-day "-40d")
                  (org-agenda-span 40)
                  (org-agenda-start-on-weekday 1)
                  (org-agenda-start-with-log-mode '(closed))
                  (org-agenda-skip-function
                   '(org-agenda-skip-entry-if 'notregexp "^\\*\\* DONE "))))))

安装 org-ql

然后执行查询命令:

(org-ql-search (org-agenda-files) "todo:DONE ts:from=2024-07-01,to=2024-07-31" :narrow nil :super-groups '((:auto-tags)) :sort nil)

查不到呢

我希望查询这种,比如状态变成了todo:Done CLOSED的时间在7月

** Done 冷藏柜验收货物并报销
CLOSED: [2024-07-15 Mon 11:17]

  • State “Done” from “TODO” [2024-07-15 Mon 11:17]

你的这个文件应该不在 org-agenda-files 列表里面。

可以试试手动执行 M-x org-ql-search,搜索条件就是 todo:DONE ts:from=2024-07-01,to=2024-07-31,其它排序分组什么的随意。

大概率你是查不到了, 因为你之前没有保存下来 , 如果后续想要保存下来可以这样设置:
(setq org-log-state-notes-into-drawer t) ;; 记录任务状态变化,可能会记录对任务状态的更改,尤其是对于重复例程。如果是这样,请将它们记录在抽屉中,而不是笔记的内容。

我之前是这么用的(doom emacs的快捷键): 检查某天、某周完成的工作,可以用org-agenda的daily/weekly view mode (SPC n a a), 然后用"-“包含inactive-time-stamp,用”[“和”]"切换前/后一天/周。

核心是这里:用"-"包含inactive-time-stamp

有习惯 clock-in、 clock-out 的,可用 org-analyzer

用 org-archive 呀。

(with-eval-after-load 'org-archive
	;; use `org-archive-subtree' to archive done todos.
	(setq org-archive-location
		  (concat
		   (expand-file-name
			(format-time-string "gtd_archive_%Y") org-gtd-directory) ;;自己修改这个org-gtd-directory
		   "::datetree/")))

对于标记为 DONE 的任务可以手动或者自动 archive,用上面的配置,archive 后的项目会根据标记为 DONE 的时间保存。看下面的图,这样查最近一个月完成或者关闭了哪些项目就很容易查看,也不需要装其他啥包。

另外提一嘴,我使用 org-gtd 进行任务管理,它有一个org-gtd-archive-completed-items 命令,可以很方便的archive所有标记为完成的项目,不过我一般都还是使用 org-archive-subtree手动archive项目。

在任意org文件里加入:

  #+BEGIN: clocktable :maxlevel 2 :emphasize nil :scope (lambda () (get-archive-files-by-year 2024)) :block 2024-6

  #+END: clocktable

然后光标放在 begin 和 end 之间执行 org-dblock-update

:scope 里的函数 get-archive-files-by-year 是自己定义的,也可以用其他参数,具体见:

1 个赞

以前有几个文件还family,后来改成了只有gtd.org这一个文件了;

用 c-h v检查了这个变量,就这个文件,没问题

感觉这是一条正确的道路,我用org-ql-find可以过滤看到todo的项目,但是没尝试出来上面的这个条件

是不是用了 Done 来表示完成而不是 DONE? 可以先试试只用时间过滤 ts:from=2024-07-01,to=2024-07-31,确定显示内容之后再加上 todo:Done 看看