5.3.2 Tracking TODO state changes

你可能希望自动记录状态变更时间,并可为此变更添加备注。 可以只记录时间戳,也可记录带时间戳的备注。 这些记录会以列表形式插入标题下方,最新记录排在最前44。 当备注数量较多时,你可能希望将其收纳到抽屉中以避免干扰(参见 Drawers)。 自定义变量 org-log-into-drawer 即可启用该行为—推荐使用的抽屉名为 ‘LOGBOOK45。 你也可以通过设置 ‘LOG_INTO_DRAWER’ 属性,为某一子树覆盖该变量的设置。

由于通常无需为每个状态变更都记录备注,Org mode 支持按关键字单独配置此项。 实现方式是在每个关键字后的括号中添加特殊标记 ‘!’ (表示记录时间戳)或 ‘@’ (表示记录带时间戳的备注)。 例如,使用如下配置:

(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)")))

你不仅定义了全局待办关键字和快速访问键, 还指定了条目设为 ‘DONE’ 时记录时间, 切换至 ‘WAIT’ 或 ‘CANCELED’ 时记录备注46。 ‘WAIT’ 的设置更为特殊:斜杠后的 ‘!’ 表示, 除进入该状态时记录备注外, 离开(leaving)WAIT’ 状态时也应记录时间戳, 且仅当 目标(target) 状态未配置进入记录时才生效。 因此从 ‘WAIT’ 切换至 ‘DONE’ 时不会触发, 因为 ‘DONE’ 已配置仅记录时间戳。 但从 ‘WAIT’ 切回 ‘TODO’ 时, ‘WAIT’ 设置中的 ‘/!’ 会触发时间戳记录, 即便 ‘TODO’ 未配置任何日志。

你可以使用完全相同的语法为缓冲区设置本地记录偏好:

#+TODO: TODO(t) WAIT(w@/!) | DONE(d!) CANCELED(c@)

若要为配置了 ‘@’ 的待办关键字仅记录时间戳而不写备注, 在提示输入时直接按下 C-c C-c 提交空备注即可。

若要为子树或单个条目定义本地记录设置, 可在该条目中设置 ‘LOGGING’ 属性。 任何非空的 ‘LOGGING’ 属性都会将所有记录设置重置为 nil 。 随后你可以使用 ‘lognotedone’ 或 ‘logrepeat’ 等 ‘启动STARTUP’ 关键字, 以及 ‘TODO(!)’ 等状态特定设置,为该子树启用记录功能。示例:

* TODO Log each state with only a time
  :PROPERTIES:
  :LOGGING: TODO(!) WAIT(!) DONE(!) CANCELED(!)
  :END:
* TODO Only log when switching to WAIT, and when repeating
  :PROPERTIES:
  :LOGGING: WAIT(@) logrepeat
  :END:
* TODO No logging at all
  :PROPERTIES:
  :LOGGING: nil
  :END:

Footnotes

(44)

参见变量 org-log-states-order-reversed

(45)

注意在议程框架中按下 SPC 显示条目时, ‘LOGBOOK’ 抽屉会自动展开;可使用 C-u SPC 使其保持折叠。

(46)

若同时启用 org-log-done 与状态变更记录,Org 模式可能会记录两个时间戳,但不会两次提示输入备注:若两者均配置,状态变更备注优先,取消任务完成备注。