Org-mode, 用文本文件管理日常(二)

任务和状态

我使用一组TODO关键字来管理所有我的org文件。org-mode也可以为每个文件都定义一组 TODO关键字,但是我觉得定制一套全局的TODO关键字已经非常方便了,这样我就可以在不同文件中 用相同的设置。

但是本文是个特例:) 因为我不希望 org-mode 隐藏 TODO 关键字当它出现在标题中时。 我在文本开头处设置一个假的 #+SEQ_TODO: FIXME_FIXED 项,来保证在这个文档中 TODO 关键字不要隐藏。

1.1 TODO 关键字

我在emacs中使用的是亮色模式。因为亮色模式在阳光下更容易阅读。

下面是我的 TODO 状态关键字以及颜色设置elisp脚本:

(setq org-todo-keywords
      (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
              (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))

(setq org-todo-keyword-faces
      (quote (("TODO" :foreground "red" :weight bold)
              ("NEXT" :foreground "blue" :weight bold)
              ("DONE" :foreground "forest green" :weight bold)
              ("WAITING" :foreground "orange" :weight bold)
              ("HOLD" :foreground "magenta" :weight bold)
              ("CANCELLED" :foreground "forest green" :weight bold)
              ("MEETING" :foreground "forest green" :weight bold)
              ("PHONE" :foreground "forest green" :weight bold))))

1.1.1 任务状态转换

任务状态开始于 TODO 结束于 DONE.

下图显示了可能的状态转换关系:

#+begin_src plantuml :file normal_task_states.png :cache yes
title Task States
[*] -> TODO
TODO -> NEXT
TODO -> DONE
NEXT -> DONE
DONE -> [*]
TODO --> WAITING
WAITING --> TODO
NEXT --> WAITING
WAITING --> NEXT
HOLD --> CANCELLED
WAITING --> CANCELLED
CANCELLED --> [*]
TODO --> HOLD
HOLD --> TODO
TODO --> CANCELLED
TODO: t
NEXT: n
DONE: d
WAITING:w
note right of WAITING: Note records\nwhat it is waiting for
HOLD:h
note right of CANCELLED: Note records\nwhy it was cancelled
CANCELLED:c
WAITING --> DONE
#+end_src

Org-mode, 用文本文件管理日常(二)

 

1.1.2 项目任务状态

我的项目任务状态定义非常简单。我不想人为的明确的定义'这是一个项目' 以及 '这不是个项目'. 我对项目定义就是如果任务下有TODO关键字定义的子任务,那么它就是个项目。

项目可以定义在任何层级-只要定义一个带有TODO关键字的任务并且在下面定义一个带TODO关键字的子 任务那么这个任务就可以视为项目。项目和任务使用同一套关键字。如果一个子任务被标记 NEXT 那么这个项目就不会出现在阻塞任务列表中。

1.1.3 回电

回电比较特别。回电任务在capture中创建时状态时为DONE状态。回电计时当任务创建时开始计时。如果我 需要看一些其他详细资料,需要关闭刚刚捕获的任务,直接使用快捷键 C-c C-c 先关闭捕获的任务 (停止计时) 然后通过 f9 SPC 重新恢复之前计时。

#+begin_src plantuml :file phone_states.png :cache yes

title Phone Call Task State
[*] -> PHONE
PHONE -> [*]
#+end_src

Org-mode, 用文本文件管理日常(二)

1.1.4 会议

会议也是特殊的一个任务流程。会议事件在capture中创建时初始状态为done。当我需要中 断手上工作去提个问题或者需要开个会讨论问题,我会创建会议任务。会议任务处理和回电 任务非常相似,我会记录下我花了多少时间在开会上,并且会记录下讨论内容 (无论会议中还是会议后),长度以及复杂度。

会议计时从capture中创建该会议任务开始,如果需要转向查看其他任务,想提前关闭这个捕获 任务。我会先通过快捷键 C-c C-c 完成捕获,先关闭并保存这个捕获的任务(停止计时) 之后,通过 f9 SPC 来恢复会议计时。

#+begin_src plantuml :file meeting_states.png :cache yes
title Meeting Task State
[*] -> MEETING
MEETING -> [*]
#+end_src

Org-mode, 用文本文件管理日常(二)

1.2 快速TODO状态选择

快速TODO状态选择允许将任务TODO状态直接切换到其他状态通过按键菜单选择相应的快捷键。 这是个很棒的功能。

(setq org-use-fast-todo-selection t)

通过快捷键 C-c C-t KEY 来快速切换任务状态。

其中的 KEY 是定义在 org-todo-keywords 中的快速状态选择键。

如下设置:

(setq org-treat-S-cursor-todo-selection-as-state-change nil)

允许通过 S-left 以及 S-right 跳过一些常规操作,而直接循环切换任务状态而不会设置时间戳,当需要调整 任务状态时候,这个功能特别好用。

1.3 TODO 状态触发

我定义了一些触发器,当一个任务状态切换时候,就会自动为该任务添加一个tag。举个例子, 当一个任务被设置到 CANCELLED 状态,那么触发器就会为该任务添加一个 CANCELLED 标签, 当又将该任务设置回 TODO=状态,相应的 =CANCELLED 标签也会自动移除。为任务自动添加标签, 会对后续在agenda视图中过滤任务有帮助,后续我也会详细介绍。

这些触发器可以分为如下几条规则:

  • 将一个任务设置 CANCELLED 状态,会自动添加 CANCELLED 标签
  • 将一个任务设置 WAITING 状态,会自动添加 WAITING 标签
  • 将一个任务设置 HOLD 状态,会自动添加 WAITING 和 HOLD 标签
  • 当任务设置为完成状态,将会移除 WAITING 以及 HOLD 标签
  • 将一个任务设置 TODO 状态,会自动删除 WAITING , CANCELLED 以及 HOLD 标签
  • 将一个任务设置 NEXT 状态,会自动删除 WAITING , CANCELLED 以及 HOLD 标签
  • 将一个任务设置 DONE 状态,会自动删除 WAITING , CANCELLED 以及 HOLD 标签

这些自动生成的标签将对在agenda中过滤任务带来极大便利。

(setq org-todo-state-tags-triggers
      (quote (("CANCELLED" ("CANCELLED" . t))
              ("WAITING" ("WAITING" . t))
              ("HOLD" ("WAITING" .t) ("HOLD" . t))
              (done ("WAITING") ("HOLD"))
              ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
              ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
              ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))

上一篇:阿里云ECS弹性计算-弹性裸金属服务器 商业化 发布


下一篇:《Hadoop与大数据挖掘》一2.1.4 Hadoop资源管理—YARN