一、任务和子任务
Org-mode认为,每一个任务通常会需要附带一些文字说明。所以Org-mode将标题作为任务的载体。通过在标题上增加状态标记,来定义任务。 由于大纲是分级的,所以将标题定义为任务天然支持了子任务:可以在子标题上标记子任务。
使用C-c C-t
或者S-LEFT/RIGTH
可以为标题增加或改变任务标记。
二、定义任务状态
Org-mode内置的任务状态只有两种:TODO和DONE。如果需要更多的状态,需要自己定义。
可以在文件内部定义任务状态: 关键字应该各不相同,这样对于一个选项 Org 才知道该用哪个状态序列(集合)。例子中也给出了快速使用一个关键字的方法,就是在关键字后面括号中给出快捷字母——当用 C-c C-t时,会询问,让你输入一个字母。
要自定义任务状态,可以使用文档元数据“#+SEQTODO:”,可以在文档的任何地方定义,但是建议统一定义在文档头部:
#+SEQ_TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f)
#+SEQ_TODO: TODO(T!) | DONE(D@) CANCELED(C@/!)
要注意的是#
的后面不要有空格。
将光标放在这些内容上,输入 C-c C-c 可以直接生效。此时再用C-c C-t设定任务时,会打开一个新的缓冲区:
对照前面的定义不难发现:
- 可以定义多组状态序列,每个“#+SEQ_TODO”行定义一组
状态之间用空格分隔 - 可以在()中定义附加选项,包括:
- 字符:该状态的快捷键
- !:切换到该状态时会自动增加时间戳
- @ :切换到该状态时要求输入文字说明
- 如果同时设定@和!,使用“@/!”
- 用“|”分隔未完成状态和已完成状态。未完成状态在查询待办事项时会列出。
使用C-c C-t 或者 S-LEFT/RIGTH 切换一些状态后,任务会变成这个样子:
会自动生成时间戳,提示填写说明。从而留下完整的记录。
上面的任务状态设置只适用于当前文档。如果希望设定所有.org文档的默认任务状态,需要在.emacs配置文件中定义。 上面的任务状态在配置文件中的等效设置为:
(setq org-todo-keywords '((sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)") (sequence "TODO(T!)" "|" "DONE(D@)" "CANCELED(C@/!)") ))
除了状态序列外,还可以定义type,来标记任务的分类。可以参考这里 。
三、设置任务优先级
在Org-mode中,还针对任务设定了A,B,C三种优先级,在安排日程的时候可以按照优先级进行排序。为任务设定优先级是通过 快捷键 S-UP/DOWN。
四、跟踪子任务完成情况
对于有多个子任务的上级任务,很常见的一个需求是随时跟踪子任务的完成情况。 Org-mode支持在上级任务上增加标记,当子任务的状态发生改变时自动更新上级任务的完成情况。 支持百分比和分数两种形式,类似[66%] 或者 [2/3]。
可以在上级任务标题中的任意位置插入[%] 或者 [/], 当子任务的状态发生变化时,会自动更新该位置的值。 比如:
* Organize Party [%]
** Call people [/]
*** Peter
*** Sarah
** Buy food
** Talk to neighbor
注意:
当改变子任务状态时,只更新上一级任务的完成情况,不可级联。
即使所有的子任务都完成,也只是标记上一级任务的完成情况为100%,而不能自动更新上级任务的完成状态。如果需要自动设定为完成,可以在.emacs中增加如下配置:
(defun org-summary-todo (n-done n-not-done) "Switch entry to DONE when all subentries are done, to TODO otherwise." (let (org-log-done org-log-states) ; turn off logging (org-todo (if (= n-not-done 0) "DONE" "TODO"))))
(add-hook 'org-after-todo-statistics-hook 'org-summary-todo)
五、用复选框标记非标题类型的子任务
前面的任务和子任务都是标题形式。Org-mode还支持非标题形式的子任务。对于以”[ ]“开头的列表, 会被当作复选框。这样就形成了局部的子任务, 适用于将一个任务划分成几个简单的步骤。 下面是一个例子:
*** 一个任务 [0/2]
该任务包含几个步骤:
- [-] 步骤1 [1/2] - [X] 步骤1.1 - [ ] 步骤1.2 - [-] 步骤2 [1/2] - [X] 步骤2.1 - [ ] 步骤2.2
与子任务类似,步骤的状态变化会改变上级步骤/任务的完成情况。 下面是复选框相关的命令:
快捷键 | 功能 |
---|---|
C-c C-c | 改变复选框状态 |
M-S-RET | 增加一个子项 |
六、查询任务
在Org-mode的编辑功能 中介绍过大纲的检索功能:
前面 C-c /
只列出包含搜索结果的大纲,并高亮,支持多种搜索方式。
该功能可以按照多种方式检索,其中针对任务有两种方式: todo 和 TODO key words。 分别实现高亮所有TODO和具有特定关键字的TODO。
七、任务的时间计划
Org-mode中的任务还可以设置计划时间(SCHEDULED)和截止时间(DEADLINE),方便任务的管理和排程。
1、时间戳
在Org-mode中,将带有日期和时间信息的特定格式的字符串称为时间戳。时间戳使用”< >“进行标记,比如:
<2005-10-01 Tue>
<2003-09-16 Tue 09:39>
<2003-09-16 Tue 12:00-12:30>
时间戳分为两种,上面的例子中的时间戳都标记了一个”时间点“,另外一种时间戳标记重复出现的多个时间点。 使用时间点+ 间隔( 天(d)、周(w)、月(m)或者年(y))来表示。比如:
<2007-05-16 Wed 12:30 +1w>
表示从2007-05-16 12:30开始,每周重复一次。
时间戳可以放在标题或正文的任何部分。
输入时间戳时,可以手工输入符合格式的标记,也可以使用快捷键 C-c .
来创建。
如果要快速输入日期无需选择,可以直接用C-cC-c > 看日历。
如果仅仅想输入一个日期/时间,与任务没有任何关系,可以用C-c !。
S-left|S-right
以天为单位调整时间戳时间 S-up|S-down
调整光标所在时间单位;如果光标在时间戳之外,调整时间戳类型(是否在日程表中 S-LEFT/标处理的时间戳改变一天。 RIGHT S-UP/
改变时间戳中光标下的项。光标可以处在年、月、日、时或者分之上。当时间戳包含一个时间段时,如 “15:30-16:30”,修改第一个时间,会自动同时修改第 DOWN 二个时间,以保持时间段长度不变。想修改时间段长度,可以修改第二个时间。
时间/日期段
两个时间戳用‘–’连接起来就定义了一个时间段:
<2004-08-23 Mon>--<2004-08-26 Thu>
连续使用C-c .
可以创建时间段。
C-c C-y
计算时间段的间隔。
2、计划时间和截止时间
Org-mode可以为任务设定一个计划时间(SCHEDULED), 输入 C-c C-s
,就可以设定光标所在位置所属的任务的计划时间。 而 C-c C-d
是输入截止时间(DEADLINE)。
八、全局任务文件清单
前面的内容都是关于单个.org文件的任务管理。Org-mode还支持将多个.org文件组合起来进行管理。这带来很多好处:
你可以按照不同的用途将任务放在不同的文件中进行组织,比如项目,个人事务,家庭等等。
要让Org-mode知道需要把哪些文件视为全局任务的组成部分,需要设定一个清单,可以在.emacs中这样设置:
(setq org-agenda-files (list "~/.todos/work.org" "~/.todos/projects.org" "~/.todos/home.org" "~/Documents/todo/" ))
清单中可以加入文件或目录。如果是目录,该目录下的所有.org文件都会被加入清单。
除了预定义的清单文件,还可以在编辑任务文件(.org)时随时使用C-c [
将文件加入清单,或C-c ]
将文件移出清单。
可以随时通过C-c ‘/, 循环打开所有的清单文件。
九、全局 TODO 列表
全局TODO列表列出所有全局任务文件中的未完成任务。通过快捷键 C-c a t 进入全局 TODO 列表。
在全局TODO列表中,用 t
键改变任务状态,按 RET
跳到该条目所在的源文件。
如果提示C-c a
快捷键未定义,是因为Org-mode的快捷键没有启用,需要在.emacs中增加配置:
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)
十、日程表
有时候可能需要根据未完成任务显示日程安排,通过 C-c a a 可以进入日程表视图。 日程表根据任务的计划时间列出每天的任务。
在日程表视图中按 “l”(小写字母L) 显示日志。这样就会显示你所有已经完成的任务和它们完成的时间。