现在开始说一下 org mode 里面一个特复杂的功能——TODO,时间及任务管理。
额,这个功能是基于“严肃”的GTD理念开发,所以不知道GTD的,可以先百度、Google一下,在回来看。
当然,如果认为不需要,直接无视吧……
6.使用TODOC-c C-t 将当前项的状态在(unmarked)->TODO->DONE 之间循环切换
C-c / t 在稀疏树中显示 TODO 项,同时显示 TODO 项和它们所在的层次的标题
C-c a t 显示全局 TODO 列表,将从所有的议程文件中收集 TODO 项到一个缓冲区中
S-M-RET 在当前项下插入一个新的 TODO 项
--------------------------------------------------------------------------------
用 TODO 关键字来定义不同的状态,用以处理项,比如:
#+begin_src lisp
(setq org-todo-keywords
'((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED")))
#+end_src
竖直线将 TODO 关键字(还需要进一步的动作)和 DONE 状态(不需要进一步的动作)分隔开。如果你不给出竖直线,最后一个状态会作为 DONE 状态。设置之后,C-c C-t 就会将状态从 TODO 转换到 FEEDBACK,再转换到 VERIFY,最后到 DONE 和 DELEGATED。
--------------------------------------------------------------------------------
有时你可能希望同时使用几个不同的 TODO 状态集合。例如,你可能想要一个基本的 TODO/DONE,以及一个修改 bug 的工作流程和一个隔开的状态来表示取消的项目(既还是 DONE,也不需要进一步的动作),你可以这样设置:
#+begin_src elisp
(setq org-todo-keywords
'((sequence "TODO(t)" "|" "DONE(d)")
(sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)")
(sequence "|" "CANCELED(c)")))
#+end_src
关键字应该各不相同,这样对于一个选项 Org 才知道该用哪个状态序列(集合)。例子中也给出了快速使用一个关键字的方法,就是在关键字后面括号中给出快捷字母——当用 C-c C-t时,会询问,让你输入一个字母。
要定义只在一个文件中有效的 TODO 关键字,可以在文件中任意地方给出下面的文本:
#+begin_src org
,#+TODO: TODO(t) | DONE(d)
,#+TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f)
,#+TODO: | CANCELED(c)
#+end_src
当改变这些行中的一行后,光标停留在改变行上,用 C-c C-c 让改变生效。
--------------------------------------------------------------------------------
很多时候将一个大的任务分成几个的易于完成的小任务是明智的,你可以通过在TODO项目下新建一个大纲树,并在子树上标记子任务来实现这个功能。
为了能对已经完成的任务有个大致的了解,你可以在标题的任何地方插入‘[/]’或者‘[%]’。当每个子任务的状态变化时,或者当你在标记上按 C-c C-时,这些标记状态也会随之更新。例如:
#+begin_src org
* Organize Party [33%]
** TODO Call people [1/2]
*** TODO Peter
*** DONE Sarah
** TODO Buy food
** DONE Talk to neighbor
#+end_src
当纯文本中的项以‘[]’开头时,就会变成一个复选框。
复选框不会包含在全局 TODO 列表中,所以它们很适合地将一个任务划分成几个简单的步骤。下面是一个复选框的例子:
#+begin_src org
,* TODO Organize party [1/3]
, - [-] call people [1/2]
, - [ ] Peter
, - [X] Sarah
, - [X] order food
, - [ ] think about what music to play
#+end_src
复选框是分层工作的。所以如果一个复选框项目如果还有子复选框,触发子复选框将会使该复选框变化以反映出一个、多个还是没有子复选框被选中。
C-c C-c 触发复选框的状态或者(加上前缀)触发复选框的的存在状态
M-S-RET 增加一个带有复选框的项。这只在光标处于纯文本列表项中才起使用
--------------------------------------------------------------------------------
最基本的日志功能是跟踪一个特定项目的完成。这可以这样实现:
#+begin_src elisp
(setq org-log-done 'time)
#+end_src
这时当你将一个项目从一个 TODO(未完成)状态改变为一个完成状态时,标题下面就会插入一行 “CLOSED:[timestamp]”。如果你想和时间戳一起作一个记录,用:
#+begin_src elisp
(setq org-log-done 'note)
#+end_src
这时会提示你输入一个记录(note),并将它保存在标题为“Closing Note”项目之下。
--------------------------------------------------------------------------------
你可能想跟踪 TODO 状态的变化。可以只记录一个时间戳,也可以为变化作一个带时间戳的记录。记录会被插入到标题之后形成列表。当有很多记录之后,你可能希望将记录取出放到抽屉里。通过定制变量 org-log-into-drawer 可以实现这个功能。
对于状态记录,Org 可以实现基于每个状态关键字的设置。实现方法是在每个后的括号中指定“!”(记录时间戳)或“@”(作一个记录)。例如:
#+begin_src org
,#+TODO: TODO(t) WAIT(
[email protected]/!) | DONE(d!) CANCELED(
[email protected])
#+end_src
将会设置 TODO 关键字和快速访问字母,以及当一个项目设为 DONE 时,会记录时间戳,当状态变为 WAIT 或 CANCELED 时,会作一个记录。这个语法也适用于变量 org-todo-keywords。
--------------------------------------------------------------------------------
如果你广泛地使用 Org 模式,这样你就会有大量的 TODO 项。给它们设定优先级就很有必要。可以在 TODO 项的标题中加入一些标记(cookie)来设置它们的优先级,像这样:
#+begin_src org
,*** TODO [#A] Write letter to Sam Fortune
#+end_src
Org模式支持三个优先级别:’A‘、’B‘和’C‘。’A‘是最高级别,如不指定,’B‘是默认的。优先级只在议程中有用。
C-c , 设置当前标题的优先级
S-UP/Down 增加/减少当前标题的优先级
--------------------------------------------------------------------------------
用org-mode来做TODO管理,那么无法避免的是,随着时间的流逝,被DONE的事件会越来越多,那么TODO被会被夹杂在DONE之间,难以查找。同时,由于后期回顾的需要,你也不想简单地将DONE事件删除掉。这个时候,你就需要归档命令了。归档,就是把你不想天天看到的东西,放到你看不到了,或者不怎么影响你的注意力的地方去。org-mode提供了两种归档方式。
内部归档
内部归档是在本文件内部给特定子树打上 ACHIVED 标签或者移动到名为 ACHIVED 的子树中去并打上标签。这个被认为是 ACIVED 的子树,会被移动了本级子树的最末端。
C-c C-x a 将某一个节点打上ARCHIVE标签
C-c C-x A 将当前节点归入一个名为Archive的子树中
并且这个子树是位于当前级别子树的最下方
外部归档
外部归档是指把子树移动到另一个org文件中去。文件名可以自定义。默认情况下,归档的子树会被移动到名为“当年文件名_archived”的文件中去。
C-c C-x C-s 把当前的节点移到archived文件中去。
--------------------------------------------------------------------------------
周期性 TODO这我觉得是一个必不可少的功能……
只要对任务开始日期稍加修改,Org Mode 就能够管理周期性代办事项。比如周四要开会,可以设置如下代办事项:
* TODO 开会
SCHEDULED: <2009-01-22 四>
如果是每周四都开会,就改写成如下的样子:
* TODO 开会
SCHEDULED: <2009-01-22 四 +1w>
1w表示每周,另外1d表示每天,1m表示每月。对于周期性的任务, C-c C-t 每次将开始日期修改为相应的下一次开始日期,并保持 TODO 状态不变。
通常情况下,任务开始日期总是严格地按照预定间隔变动,但是当我们需要忽略 掉已经过期的日期时,就可以使用 ++ 或者 .+ 来修饰时间间隔,如
<2009-01-22 四 ++1w>
的下一次日期一定是今天之后的第一个星期四,而
<2009-01-22 四 .+1w>
的下一次日期是按今天算起的下一个星期,也就是说,不一定是星期四;如果今天是星期二,那么下一次开始日期就是星期二。
7.议程文件认识所谓议程,简单说就是比如你今天晚上计划好明天要做到事情,并添加到TODO文件(前提是文件已经加入到议程文件列表),等到第二天你只需要打开议程界面就可是知道今天应该做什么……
C-c [ 将当前文件加入到议程文件列表中
如果文件已经在列表中,会被移到前面带有前缀时,文件添加/移到到后面
C-c ] 将当前文件从议程文件列表中删除
C-, 遍历议程文件列表,依次访问其中的每一个文件
C-c a M-x org agenda 打开议程调度器
a 日历式的议程
t/T TODO 项的列表,T 可选择TODO关键字
m/M 匹配某个标签表达式的标题的列表,可匹配属性
L 给出 Org 文件中所有带时间戳条目的排序视图
带有 C-u 前缀时,没有完成的 TODO 项也列在当前日期下
s 通过关键字和/或正则表达式选中的条目的列表
Org 可以跟 Emacs 的约会提醒功能结合。想添加议程文件中的约会提醒,可以使用命令 org-agenda-to-appt。
自定义搜索的主要用途是对于频繁使用的搜索进行快捷键绑定,从而快捷地创建议程缓冲区或者稀疏树(当然后者只涵盖当前缓冲区的内容)。
自定义的命令是用变量 org-agenda-custom-commands 来配置的。你可以用 C-c a C 来定制这个变量。也可以直接在 ”.emacs“ 中用 Emacs lisp 来设置。下面的例子包含了所有合法的搜索类型:
#+begin_src elisp
(setq org-agenda-custom-commands
'(("w" todo "WAITING")
("u" tags "+boss-urgent")
("v" tags-todo "+boss-urgent")))
#+end_src
意思即为:
C-c a w 对于包含关键字“WAITING”的 TODO 项的全局搜索
C-c a u 对于带有标签“:boss:”而不含标签“:urgent:”的标题的全局标签搜索
C-c a v 同搜索 C-c a u,但搜索范围只限于同时也是 TODO 项的标题
--------------------------------------------------------------------------------
议程缓冲区中的条目链接到了它们的源 Org 或者日记文件。有一些命令可以用来显示和跳转到条目的源位置,也可以从视图缓冲区中编辑源文件。
n 下一行
p 上一行
<space> 在另一个窗口中显示条目的源位置,带前缀使得整个条目在大纲中可见,而不只是标题
<TAB> 在另一个窗口中条目的准确源位置
<Enter> 转到条目的源位置并删除其它的窗口
o 删除其他窗口
d/w 切换到日/周视图
f/b 时间前移或者后移显示,例如显示了一周的内容,切换到下/上一周
. 转到今天
j 询问日期并转到那天
r/g 重新构造议程,以反映最新状态
s 保存当前 Emacs 会话的所有 Org 缓冲区和ID的地址
l 触发日志模式(Logbook mode)
在日志模式中,当记录功能打开(变量 org-log-done)时标记为 DONE 的条
目,以及在那天计时的条目,都会显示在议程中
0-9 数字参数
t 修改议程和 org 文件中条目的TODO状态
C-k 删除当前的议程条目以及源文件中它的整个子树
a C-c C-x C-a ,用在 org-archive-default-command 中设置的默认归档命令对当前的条目对应的整个树进行归档
$ C-c C-x C-s ,归档当前标题对应的树
C-c C-d 为条目设置截止期限
I 对当前条目开始计时
O/X 暂停最近开始的计时
J 在另一个窗口中跳转正在进行的计时
S-RIGHT/LEFT 将与当前行相关的时间戳改变一天