部分任务需要反复执行。Org mode 可通过 ‘DEADLINE’ 、 ‘SCHEDULED’ 或普通时间戳中的重复规则 管理这类任务70。如下例:
** TODO Pay the rent DEADLINE: <2005-10-01 Sat +1m>
其中 ‘+1m’ 为重复规则,表示任务截止日期为 ‘<2005-10-01>’ , 并从该时间起每月重复一次。 可使用 ‘y’ 、 ‘m’ 、 ‘w’ 、 ‘d’ 、 ‘h’ 实现年、月、周、日、小时重复。 若截止日期需同时设置重复与特殊提醒周期, 重复规则应在前,提醒周期在后:
DEADLINE: <2005-10-01 Sat +1m -3d>
截止日期与排期条目逾期后会在日程中显示, 因此完成后需及时标记为已完成。 当你将带 ‘DEADLINE’ 或 ‘SCHEDULED’ 的任务 设为 TODO 状态 ‘DONE’ 时,它将不再出现在日程中。 但问题在于, 下一次 重复条目也会失效。 Org mode 处理方式如下:使用 C-c C-t 标记完成时,会按重复周期偏移时间戳基准日期, 并立即将条目状态恢复为 TODO71。 上例中标记为 ‘DONE’ 后日期会变为:
** TODO Pay the rent DEADLINE: <2005-11-01 Tue +1m>
若任务包含多个带重复周期的时间戳,所有时间戳都会偏移。
若要将带重复规则的任务永久标记为完成,
使用 C-- 1 C-c C-t,
即带数字前缀 ‘-1’ 的 org-todo 命令。
会在截止日期下方添加时间戳72,记录上一次任务的执行时间。
偏移基准日期后,该条目在查看历史日期时不再显示, 但所有未来重复项均可见。
使用 ‘+1m’ 时,日期偏移严格为一个月。 若三个月未交房租,标记完成后仍会处于逾期状态。 根据任务类型,这未必是最佳方式。 例如三周未给父亲打电话,没必要一天内补打三次。 还有像更换电池这类任务,应在 上次完成后 固定时间再重复。 对此类任务,Org mode 提供特殊重复符 ‘++’ 和 ‘.+’ 。 示例:
** TODO 给父亲打电话 DEADLINE: <2008-02-10 Sun ++1w> 将此项标记为已完成会将日期至少顺延一周, 并会继续顺延直到该日期变为未来日期。 但即使你在周六打电话并标记完成, 下次日期仍会保持在周日。 ** TODO 倒厨房垃圾 DEADLINE: <2008-02-08 Fri 20:00 ++1d> 将此项标记为已完成会将日期至少顺延一天, 并会继续顺延直到该时间戳变为未来日期。 由于时间戳中包含具体时间, 如果你在 20:00 前完成任务, 下一次截止日期会落在今天。 ** TODO 检查烟雾报警器电池 DEADLINE: <2005-11-01 Tue .+1m> 将此项标记为已完成会把日期设为从今天起一个月后。 ** TODO 洗手 DEADLINE: <2019-04-05 08:00 Fri .+1h> 将此项标记为已完成会把日期设为从现在起整一小时后。
同一任务可同时包含排期与截止日期信息。
若仅为排期设置重复规则,通常希望截止日期后忽略重复,
此时可将变量 org-agenda-skip-scheduled-repeats-after-deadline 设为 t 。
而无重复规则的排期信息在任务完成后不再相关,
重复时会被自动移除。若希望排期与截止日期按相同周期重复,
为两个时间戳设置相同重复规则即可。
除使用重复规则外,也可复制多个任务子树并分别偏移日期。 命令 C-c C-x c 用于该功能, 详见 Structure Editing。
但 Org 不会重复非活动时间戳,参见 Timestamps。
实际目标状态依次取自:
‘REPEAT_TO_STATE’ 属性、字符串类型的 org-todo-repeat-to-state 、
若变量为 t 则取前一个 TODO 状态,或 TODO 序列的第一个状态。
可通过选项 org-log-repeat 或 ‘STARTUP’ 选项 ‘logrepeat’ 、 ‘lognoterepeat’ 、 ‘nologrepeat’ 修改该行为。使用 ‘lognoterepeat’ 时会额外提示输入备注。