EMACS & 程序 编程点滴...
GTD实践---使用Emacs和Org-mode
作者:Charles Cave
原文地址: How I use Emacs and Org-mode to implement GTD
TOPGTD(Getting Things Done)是什么
「Getting Things Done 中文翻译本《尽管去做:无压工作的艺术》」是美国的商业顾问David Allen提倡的一种提高生产效率的系统。利用GTD可以缓解压力,使心情平静,专心地工作,学习。David Allen的第二部著作「Ready for Anything 中文翻译本《结果第一:平衡工作和生活的52条原则》」。戴维从一个更宽泛的角度来看待工作与生活的平衡问题,不只是局限于GTD。
使用GTD,将你现在所想到的,计划到的完全用目录表格的形式记录起来,并通过一系列系统的方法整理,回顾做成的内容。在你的工作和生活中,任何时候都可以以不同的级别来查询/浏览下一步该做什么。
- 如果想高效地使用GTD系统需要掌握以下的方法
- **系统**中收集你所关心的和必须要做的所有事情。这个系统包括物理的实体(或者可以表现的东西),纸,E-Mail,邮件,笔记等。
- 准备一个 收集箱 放入任何关心的内容。收集箱可以是一个文件盒,邮件客户端程序,语言邮件或者是一个笔记本等。
- 定期地将关心的事情收集整理的 工作流。通常需要每天执行。
- Next Action(下一步的工作)阶段,为了容易地执行任务,用明确的动词定义目地和行为。
- 基于具体的情境(Contexts),时间等,在合适的分类构造中组织管理提示和信息。这样的系统结构中包含日历,备忘录,文件整理系统等。
- 大概每天或者一周一次回顾,从而保证你的“委托”和“任务”保持最新状态。
- 定义并执行项目,自然而然地形成一个任务计划模型。
使用GTD系统的好处是做任何事的时候可以专心一意,不用担心有被遗忘的项目。我定期地将思考的问题,委托别人做的工作,创意构思,「to do」等项目记录到可信赖的系统中。这样一来,我可以不在顾虑是否有遗忘的工作,想法,从而专心致志地思考,工作。
TOP关于作者(Charles Cave)
我效力与一家悉尼的计算机软件公司,主要开发面向学校的数字教材和网络教学的软件。几乎每一天的大部分时间我都是面朝着电脑,使用微软的Word,Powerpoint, 或者Adobe的 Captivate, Articulate Presenter, Audacity (音乐编辑)等软件。在公司,使用OutLook来管理日程安排。
我已经结婚了,有两个10几岁大的孩子。每天有许多家务,还要修整庭院,生活的忙忙碌碌的。我喜欢看DVD,听音乐,读书,时不时的做做司仪,学学日语等。我主要用家中的计算机来看电影,听音乐,交流,整理计划,写博客,网络搜索的等。
TOP工具
我所信赖的GTD系统是利用Emacs的Org-mode和Remember-mode,来管理一组文本文件。接下来我将介绍怎样使用这中工具来构造GTD系统。
TOPOrg-mode中的文本文件
我所使用的Org-mode文件有以下几种:
- newgtd.org
- 最主要的文件。包括TODO,项目,预定等,到了时间需要想到的东西都被记录在内。
- newgtd.org_archive
- newgtd.org文件的档案文件。这里记录了已完成任务的履历。
- someday.org
- 将来/也许(Someday/Maybe)文件。这里记录了我还没决定何时做的事情,比如像学习什么,想读的书,想去的地方,新项目的构思,想法等。这里的内容我会每周回顾。
- journal.org
- 这个文件作为电子笔记记录了Web地址,每天的笔记,摄影记录,读书笔记,会议笔记,行动记录等信息。
- birthday.org
- 记录生日或者是纪念日等信息。这个文件也是一个我的预定计划文件。
TOP主要的GTD文件
主要的GTD文件有5个部分组成。它们分别是任务,日历,工程项目,借的东西,财务管理。每个标题用议程表格式来区分不同的分类级别。
TOP任务(TASKS)
这个就是一般的ToDo链表功能。如果有什么需要做的了,我就会执行「C-c r t」命令,使用Remember mode来添加这个任务。简明扼要地写好了任务之后,我会使用「C-c C-c」命令来添加该任务的情境(Contexts,HOME、OFFICE等)。
任务分类刚开始像是下面这个样子。2
1 2 3 4 5 6 7 |
#+STARTUP: showall * TASKS #+CATEGORY: Tasks ** Tidy out the middle desk drawer :HOME: ** Read the Training Objectives :OFFICE: ** Watch Star Wars IV :DVD: SCHEDULED: <2009-01-14 Wed> |
GTD系统中任务的情境(Contexts),是指比如HOME(在家)或者OFFICE(在公司)等完成任务的场所。
添加任务的过程很快捷,并不会打乱工作的流程。且Remember的模板中包含可以添加日期的设定。即使任务的链表很长,或者有延迟的任务时,通过回顾能有效地明确当前的任务。通常回顾的时候,可以按照添加任务的顺序或者是时间先后顺序来记录。
1 2 |
("Todo" ?t "* TODO %^{Brief Description} %^g\n%?\nAdded: %U" "c:/charles/GTD/newgtd.org" "Tasks") |
任何任务都应该用明确的动词来表征「Next Action」的行为,并记述该动词的目的和行为的目标。这样一来你不需要再次思考任务的形式,从而简单地执行。比如,与其写「周报告」不如以「总结这一周的来表述任务的内容更加能够容易理解该做什么。
我用以下的词汇来表征任务表:
处理,提问,回避,购买,变更,明确,收集,委托,从事,深思,想象,决定,延期,开发,废弃,重新实现,下载,输入,整理,跟踪,雇佣,改善,增加,报告,寻找,维持,测定,检测,订货,描画,打电话,设置优先级,购入,减少,记忆,修理,回复,调查,回顾,时间安排,卖,送,服务,指定,开始,停止,建议,规划,坐车,更新,升级,写。
TOP日历
这里记录了节假日,学校的联欢会等特别的活动的时间信息,以里程碑的形式组织并使用。需要在特殊日子里完成的任务或项目被记录到该分类中,用日程表的形式来确认。
比如我将公共假期用以下的形式来表示:
1 2 3 4 5 6 7 8 9 10 11 12 |
#+STARTUP: showall ** Calendar #+CATEGORY: Calendar *** Public Holidays 2009 **** Australia Day (Holiday) SCHEDULED: <2009-01-26 Mon> **** Valentines Day SCHEDULED: <2009-02-14 Sat> **** St Patricks Day SCHEDULED: <2009-03-17 Tue> **** Good Friday (Holiday) SCHEDULED: <2009-04-10 Fri> |
TOP工程项目
我使用这个分类来记录各个工程项目中的详细信息。一个工程项目对应一个以上的行动,并且它们通常都付有结束的日期。
在各个工程项目的目录中记述项目的内容,换句话说就是细化项目流程,在其下方用目录构造表示。
与任务的(Next Action)中说明的一样,这里我也用一些动词来表述项目:安成,决定,处理,调查,提示,扩大,计划,设计,结束,确定,查询,展开,更新,安装,改良,设定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#+STARTUP: showall * Projects #+CATEGORY: Projects ** Implement Brian Tracy Focal Point Program :PROJECT: *** Outcome DEADLINE: <2009-09-30 Wed> Make the Focal Point methodology an ingrained part of my being *** TODO Detailed study of Health and Fitness Chapter :READING: DEADLINE: <2009-01-19 Mon> *** Detailed study of Business and Career (Focal Point) :READING: *** Detailed study of Family & Personal life (Focal Point) :READING: *** Detailed study of Money and Investments (Focal Point) :READING: *** Detailed study of Personal Growth and Develop (Focal Poin :READING: *** Detailed study of Social and Community (Focal Point) :READING: *** Detailed study of Spiritual Dev & Inner Peace (Focal Point) :READING: |
TOP财务管理
我支付的账单记录被保存在此,包括现金和信用卡的支付记录。
1 2 3 4 5 6 7 8 |
#+STARTUP: showall ** Financial #+CATEGORY: Financial ** TODO Prepare a Budget for 2009 :COMPUTER: ** Pay Credit Cards :COMPUTER: SCHEDULED: <2009-01-22 Wed +1m> ** Pay Mortgage :COMPUTER: SCHEDULED: <2009-01-22 Wed +1m> |
最后面两个是每个月都会定期发生的,这种情况下可以设定支付的日期。
TOP借的东西
我经常去公司和家附近的图书馆。所以基本上过3~4周都有必须返还的书籍,DVD,CD,杂志等,差不多每次最少的情况下都会有20多种。所以我使用Org-mode来管理返还的时间期限。
1 2 3 4 5 6 7 8 9 10 |
#+STARTUP: showall ** Borrowed #+CATEGORY: Borrowed *** Stanton Library **** TODO Watch Mikrokosmos :DVD: DEADLINE: <2009-01-30 Fri> **** TODO Read Parrots of Australia :READING: DEADLINE: <2009-01-30 Fri> **** TODO Watch The diaries of Vaslav Nijinsky :DVD: DEADLINE: <2009-01-23 Fri> |
TOP配置设定
文件的最后部分是用来设置Org-mode的。这些内容通常是不显示的。
1 2 3 4 5 6 7 8 9 |
** org-mode configuration #+STARTUP: overview #+STARTUP: hidestars #+STARTUP: logdone #+PROPERTY: Effort_ALL 0:10 0:20 0:30 1:00 2:00 4:00 6:00 8:00 #+COLUMNS: %38ITEM(Details) %TAGS(Context) %7TODO(To Do) %5Effort(Time){:} %6CLOCKSUM{Total} #+TAGS: { OFFICE(o) HOME(h) } COMPUTER(c) PROJECT(p) READING(r) #+TAGS: DVD(d) LUNCHTIME(l) #+SEQ_TODO: TODO(t) STARTED(s) WAITING(w) APPT(a) | DONE(d) CANCELLED(c) DEFERRED(f) |
TOP分类用标签
为了使各个分类项目的标题在日程表(Agenda View)1中显示,需要在项目名称下面写上「#+CATEGORY」。显示的项目是“工程项目”,“任务”,“借的东西”(近期必须结束的)或者“财务管理”中的一部分。
写这篇文章的时候,使用「#+CATEGORY」有不能对应多个匹配任务的问题。为了替代它,使用类似与下面PROPERTIES的方法。
1 2 3 |
:PROPERTIES: :CATEGORY: Projects :END: |
下面是一个将分类的标签用Agenda View表示的例子。按照情境(Contexts)的标签顺序来排序。
1 2 3 4 5 6 7 8 9 10 11 |
Tasks: TODO Write descrip of my GTD / orgmode :COMPUTER: Tasks: TODO Study the Inkscape Tutorial Book :COMPUTER: Tasks: TODO Write an article about org-mode vocabulary capture :COMPUTER: Projects: TODO Write notes and lists of Japanese adjectives :COMPUTER: Financial: TODO Pay Mastercard :COMPUTER: Projects: TODO Tidy up my GTD web site .. directory on display :COMPUTER: Tasks: TODO Watch TOKYO STORY :DVD: Projects: TODO Daily Hiragana review on Anki :HOME: Projects: TODO Daily Katakana review on Anki :HOME: Projects: TODO Study - Beyond Words: A Guide to Drawing Out Ideas :HOME: Projects: TODO Read TALE OF THE GENJI :READING: |
TOP情境(Contexts)的标签
GTD系统中情境(Contexts)的标签是指任务执行的场所,环境。在时间管理的概念中就是按所处的环境来分割TODO项目。
我在公司的时候,会搜索“OFFICE”情境的标签,在家的时候查看“HOME”或者“HOME COMPUTER”情境的标签。吃早餐的时候或是上班坐车的路上我会读书,这时需要搜索“READING”情境的标签。
即使有许多的任务,使用情境也能简单地筛选出当前环境处理的任务。我的情境标签像下面一样设置。
1 2 |
#+TAGS: { OFFICE(o) HOME(h) } COMPUTER(c) PROJECT(p) READING(r) #+TAGS: DVD(d) LUNCHTIME(l) |
简单地说明一下各个情境的意思。
- Office
- 在悉尼我的办公室安成的工作
- Home
- 在家或者自己空闲的时候安成的工作。比如,「给Bill送去包裹」等任务
- Computer
- 在家使用计算机安成的任务
- Reading
- 早餐,上班路上阅读书籍,杂志等
- DVD
- 在家欣赏电影
- Lunchtime
- 中午午休时间必须要完成的任务。这里包含上班前/后需要安成的任务。比如逛街购物等。
- Project
- 为了表示我所参与的项目,项目的标题部分添加标签。
执行「C-c C-c」,可以选择你所期望的标签。如下图:

TOPToDo的状态
为了表示ToDo的状态,我使用一下的组合。这些和在John Wiegley的博客中示范的一样。
1 |
#+SEQ_TODO: TODO(t) STARTED(s) WAITING(w) APPT(a) | DONE(d) CANCELLED(c) DEFERRED(f)
|
这些状态标签按照以下的意思使用。
- TODO
- 这个项目是指该项目不久以后,或者某一天(也许某一时间)准备开始的项目。它是与预定相关的标签。一些任务会有DEADLINE来表明该任务安成的最终截止期限。
- STARTED
- 对于已经开始的任务,我会使用该标签。
- WAITING
- 我只能等待任务的结果的时候,使用该标签。使用该标签的时候,在任务的内容中填写记录。为了将来想起该任务将其添加到预定中。
- APPT
- 并不是任何时候都执行的任务,而是在特定的时间,日期需要完成的时候使用该标签。
- DONE
- 安成的任务
- CANCELLED
- 该任务决定不需要执行的时候在文件中用该标签标记
- DEFERRED
- 为了明确当前还没有开始执行的项目,使用该标签。理由是因为很多的情况下在任务的内容中记录了大量的笔记。
为了快速的选择该标签,我将「org-use-fast-todo-selection」参数设置为TRUE。用「C-c C-t」命令后显示如下画面。

TOP一天的计划
当开始新的一天,我会首先用「C-c a H」命令来查看所有的情景,回顾这一天的预定。接下来,按照不同的标签,安排这一天的的任务。为了浏览该表,我定制了以下的命令。
1 2 3 4 5 6 7 |
("H" "Office and Home Lists" ((agenda) (tags-todo "OFFICE") (tags-todo "HOME") (tags-todo "COMPUTER") (tags-todo "DVD") (tags-todo "READING"))) |
接下来,我会确认是否有逼近最终期限,发出警告的东西,并将发现的任务加入预定表中。比如,像下面支付建筑物保险的日子只有5天了。
1 |
Financial: In 5 d.: NRMA Home Building Renewal due :OFFICE |
我4周前接到通知,支付的期限是1月18日。我创建该任务并记入支付的最终期限。
1 2 3 |
#+STARTUP: showall ** NRMA Home Building Renewal due :OFFICE: DEADLINE: <2009-01-18 Sun> |
结果,当日期临近,系统会提醒我不要忘了交账单。我决定星期四交,那么在该任务预定处输入「C-c C-s」命令,然后输入「Thur」后回车,就变成下面的样子。
1 2 3 |
#+STARTUP: showall ** NRMA Home Building Renewal due :OFFICE DEADLINE: <2009-01-18 Sun> SCHEDULED: <2009-01-15 Thu> |
当到了星期四,我回顾特定的项目以后,根据标签来将项目分组。用GTD系统按照情境表示需要做的工作,如果我在公司,就可以按照OFFICE来搜索。
我选择必须在今天完成的项目,并维护其进度。同时努力使任务的长度不超过15项。
为了以情景的顺序表示今天的预定表,需要在做成一张日程表(Agenda View)。我经常将这张表打印出来,用荧光笔涂掉安成的项目,并将其随身携带。为了生成它,我有以下的设定。
1 2 3 4 5 6 7 |
("D" "Daily Action List" ( (agenda "" ((org-agenda-ndays 1) (org-agenda-sorting-strategy (quote ((agenda time-up priority-down tag-up) ))) (org-deadline-warning-days 0) )))) |

TOP预计一天的工作
我知道我该做什么,那些能做好,完成所有的任务需要多少时间。使用Org-mode提供的功能,预计每项任务需要多少时间。通过下面的设置,我可以预见任务所需要的时间。
1 |
#+PROPERTY: Effort_ALL 0 0:10 0:20 0:30 1:00 2:00 4:00 6:00 8:00
|
需要花好几天的任务,比如开完一本书,我可以预计我今天花多久来执行。比方说今天的重要任务我分配了4个小时。
预计任务时间的最基本方法是使用Column视图。执行「C-c C-x C-c」命令切换到这个视图:

如果想修改预计的时间值,可以使用「shift-Left arrow」或者「shift-Right arrow」键来更改,改变的值就是刚才在「EffortALL」属性中设置的值。
方便起见,使用数字来代替时间选择。像下面的设定:
1 2 |
#+PROPERTY: Effort_ALL 0 0:10 0:20 0:30 1:00 2:00 3:00 4:00 8:00
Short cut ------> 1 2 3 4 5 6 7 8 9
|
这一天的总时间会在日程表的最上方表示出来。
TOP当天的工作
为了记录工作的时间,我使用了Clock模式。通过它,我可以比较预计的时间和实际花费的时间,从而掌握任务的进度。比如我可以知道某一任务(缴纳账单)比预计的时间短,而另一件需要追加时间。
我准备开始执行任务的时候,首先在日程表中将光标移动到当前任务的所在行,使用 “I” 命令启动时钟。通过Emacs的画面我就可以知道任务的开始时间。这能帮助我了解现在正在做什么,并掌握在什么时间做什么工作。

当完成了任务,我会使用「C-c C-x C-o」或者在日程表画面中点击「0」停止时钟。日程表中会显示任务的累计耗时。
另外通过「l」命令,可以浏览已经完成的任务列表。从中可以掌握一天中我怎样分配时间,任务。

TOP周回顾
周回顾是GTD的工作流中不可缺少的一部分,通过回顾没有完成的任务/项目,保持自己的GTD系统时刻处于最新状态。我专门为周回顾制作了单独的文件(weekly_review.org),作为任务执行列表来使用。
为了使自己不要忘记了周回顾,我在日历中重复的登录了该项目。像下面的设置,将周回顾的文件链接添加到主文件中,并记录每次周回顾的开始/结束时间。
1 2 3 4 5 6 7 8 9 |
#+STARTUP: showall * TODO Review Weekly :HOME: SCHEDULED: <2009-01-16 Fri +1w> - State "DONE" [2009-01-10 Sat 21:46] CLOCK: [2009-01-10 Sat 20:37]--[2009-01-10 Sat 21:44] => 1:07 :PROPERTIES: :Effort: 1:00 :END: [[file:weekly_review.org][Open Weekly Review Checklist]] |
TOP转接(Refiling)
在周回顾中,回顾“将来/也许”(Someday/Maybe)列表中的想法和任务,如果需要将其更改为需要执行的项目。这样的项目需要从「Someday」文件中转移到「active」文件。同样有时候也需要将项目由「active」文件转移到「someday」文件。
「Someday.org」文件有两层分类:
1 2 3 4 5 6 7 |
#+STARTUP: showall * Someday ** Books to Read ** Films to Watch ** Things to Do ** Things to Learn ** New Projects |
这里可以使用Refiling功能。使用「C-c C-w」file 就可以将现在标题所在的项目移动到新的地方。重新读取不同位置的参数是「org-refile-targets」,你可以像下面这样设置。
1 2 |
'(org-refile-targets (quote (("newgtd.org" :maxlevel . 1) ("someday.org" :level . 2)))) |
通过这样的设定,可以表示出「someday.org」文件中第二阶层的标题和「newgtd.org」文件中第一阶层的标题。
使用「C-c C-w」命令可以显示出文件名和标题。下面的图表示我将读书的任务移动到「newgtd.org」文件的Task段中的例子。

TOP记笔记
在一天直接我会使用Remember-mode来记录笔记或者是创意。在工作中我会用「privnotes.org」文件,而在家我使用「journal.org」文件。我的「journal.org」文件中的标题如下所示:
1 2 3 4 5 6 |
#+STARTUP: overview #+TAGS: DIARY(d) READING(r) FILMS(f) #+TAGS: IDEAS(i) WEIGHT(w) CONTACTS(a) PYTHON(y) * December 2008 * January 2009 |
我每个月用第一阶层标题表示,用两个星(*)表示每天的标题。通过这样来管理每个月的笔记。给各种各样的Remember-mode的模板附上适当的标签,我可以立刻查询想看的电影,书籍,或者是管理减肥的记录。
TOP同步家中和公司的「org-mode」文件
我需要在家和公司访问「newgtd.org」文件。为了方便起见,在家中的电脑和公司的电脑上都是成了专门的目录,并用优盘来同步它们,同时使用Python的脚本程序。
在桌面上生成了名为「GTD Backup」的快捷方式,指向Python脚本程序,其有简单的菜单可以选择。
1 2 3 4 5 6 7 8 9 10 11 |
GTD directory is C:/charles/GTD/ USB directory is e:/GTD/ ---------------------------------- 1. Copy files from USB to disk 2. Copy files from disk to USB 3. Backup USB directory 4. Backup Disk directory Q. Quit ---------------------------------- What is your choice: |
该脚本使用预先设定好的目录和文件,对其进行拷贝,并用zip压缩备份。程序中有一项非常重要的逻辑部分,就是防止你用旧的版本覆盖新的版本内容。
TOP加深阅读
- David Allen 网站上关于GTD的文章
- Charles Cave的 NaturalProjectPlanning
- Charles Cave的 RememberModeTutorial
- "Using Org-mode as a Day Planner"- John Wiegley的博客
- 我的.emacs文件
- 我修整过的newgtd.org文件
- Org-mode相关的引述
Author: Charles Cave < charlesweb@optusnet.com.au >
Date: January 2009
HTML generated by org-mode 6.17c in emacs 22
1. Agenda view 就是要把你的数据,按时间来排列分割,然后展示给你看的。在你打开Emacs的任何时候,可以用(C-c a a)来打开agenda view。
2. 本文中关于Org-mode例子中为了显示全部的代码,使用了 #+STARTUP: showall 属性。实际使用中不是每部分代码都需要的,只是在设置段落中出现。