在 org-agenda 中,支持设置重复的任务,示例如下:
|
|
日期最后的 +1m
表示每个月重复一次,其他的时间单位还有 y 年、w 周、d 天、h 时。
在将 TODO 任务转为 DONE 时,org 会自动开启新一轮的 deadline,比如上面任务完成一次后会变成:
|
|
但是这里有一个问题,即 org 月首时间循环是没问题的,但是不能正确支持按月末时间循环。如果上面示例中的日期变成 2005-01-31
,执行一次 DONE 后,日期则变成了 2005-03-03
,而不是 2005-02-28
。网上有类似提问:Schedule org task for last day of every month?,回答里介绍了两种方法:
- 增加
diary-last-day-of-month
函数, - 用
org-clone-subtree-with-time-shift
来把十二个月的代办全部生成出来
第一种方法我测试了下没有成功,于是转向第二种,第二种方法看上去挺笨的,但是其实更灵活,可以灵活调整每个月的时间。但是直接用 org-clone-subtree-with-time-shift
来生成不是很灵活,DEADLINE 倒是可以动态生成,但是标题都是一样的。比如:
|
|
用 1m 作为间隔,拷贝 4 份,效果如下:
|
|
如果生成标题时能传入变量就好了。这里突然想到之前用的 abo-abo/tiny 这个插件,它可以非常方便的生成有规律的序列。对于我这里的需求,可以输入以下模板:
|
|
然后光标移动到行末,然后 M-x tiny-expand
,就会得到如下的文本:
|
|
然后选中所有的 2022(可以用 multiple-cursors 的 mc/mark-all-like-this
),然后执行 C-c C-c
,这样日期就会修正,效果如下:
|
|
最后再手动调整下 2 月份的日期即可,其他有 31 天的月可以忽略,毕竟差一天也能接受。如果对 tiny-expand、multiple-cursors 等插件比较熟悉,不到一分钟就可以完整上面的配置。
这就是用基于纯文本的 org 来管理代办的好处,可以用自己熟悉的命令来实现自己的个性化需求。