如何在Emacs Org-mode自定义议程视图查看过去一周的DONE项?
实现Org-mode过去一周完成DONE项的自定义议程视图
核心方案:基于LOGBOOK完成时间过滤
通过org-agenda-skip-function检查条目LOGBOOK中的完成时间戳,仅保留过去一周内标记为DONE的任务,配置如下:
(setq org-agenda-custom-commands '(("r" "Weekly Review" ((todo "DONE" ((org-agenda-overriding-header "Completed Tasks (Past Week):") (org-agenda-skip-function (lambda () (let* ((done-log (org-entry-get nil "LOGBOOK" t)) (done-time-str (when done-log (string-match "\\[\\([^]]+\\)\\]" done-log) (match-string 1 done-log))) (done-time (when done-time-str (org-time-string-to-time done-time-str)))) (when (or (not done-time) (time-less-p done-time (time-subtract (current-time) (days-to-time 7)))) 'skip))))))))
代码说明:
org-entry-get nil "LOGBOOK" t:提取当前任务的LOGBOOK内容- 正则匹配
\[([^]]+)\]抓取完成时间戳字符串,再通过org-time-string-to-time转为可计算的时间对象 time-subtract (current-time) (days-to-time 7):计算当前时间往前推7天的时间点- 若任务无完成时间,或完成时间早于一周前,则跳过该条目
退而求其次:基于计划日期(DEADLINE/SCHEDULED)过滤
如果LOGBOOK无完成时间,可改用任务的DEADLINE或SCHEDULED日期过滤,配置如下:
(setq org-agenda-custom-commands '(("r" "Weekly Review" ((todo "DONE" ((org-agenda-overriding-header "Completed Tasks (Past Week Scheduled/Deadline):") (org-agenda-skip-function (lambda () (let* ((deadline (org-entry-get nil "DEADLINE" t)) (scheduled (org-entry-get nil "SCHEDULED" t)) (plan-time (or (when deadline (org-time-string-to-time deadline)) (when scheduled (org-time-string-to-time scheduled))))) (when (or (not plan-time) (time-less-p plan-time (time-subtract (current-time) (days-to-time 7)))) 'skip))))))))
代码说明:
- 优先读取DEADLINE日期,无DEADLINE则取SCHEDULED日期
- 同样通过时间比较,过滤掉计划日期早于一周前的DONE任务
额外提示
- 确保LOGBOOK自动记录完成时间:可通过
(setq org-log-done 'time)开启,标记任务为DONE时会自动生成带时间戳的LOGBOOK记录 - 调整时间范围:修改
(days-to-time 7)中的数字即可,比如14代表过去两周
内容的提问来源于stack exchange,提问作者Steve Molitor
相关产品推荐
相关产品推荐

