Org-mode And GTD

1 序章

Getting Things Done 中文翻译本《尽管去做:无压工作的艺术》是美国的商业顾问David Allen提倡的一种提高生产效率的系统。 利用GTD可以缓解压力,使心情平静,专心地工作,学习。(如果之前没有这么做过的话,是需要一段的时间训练才能掌握的。)

David Allen的第二部著作Ready for Anything 中文翻译本《结果第一:平衡工作和生活的52条原则》。 戴维从一个更宽泛的角度来看待工作与生活的平衡问题,不只是局限于GTD。

然而,这些我都没有看过。

如果想高效地使用GTD系统需要掌握以下的方法

  • 系统 中收集你所关心的和必须要做的所有事情。这个系统包括物理的实体(或者可以表现的东西),纸,E-Mail,邮件,笔记等。
  • 准备一个 收集箱 放入任何关心的内容。收集箱可以是一个文件盒,邮件客户端程序,语言邮件或者是一个笔记本等。
  • 定期地将关心的事情收集整理的 工作流。通常需要每天执行。
  • Next Action(下一步的工作)阶段,为了容易地执行任务,用明确的动词定义目地和行为。
  • 基于具体的情境(Contexts),时间等,在合适的分类构造中组织管理提示和信息。这样的系统结构中包含日历,备忘录,文件整理系统等。
  • 大概每天或者一周一次回顾,从而保证你的“委托”和“任务”保持最新状态。
  • 定义并执行项目,自然而然地形成一个任务计划模型。

掌握好上面的要义,然后严格要求去执行即可。你的生活会变得“美好”。

2 最简单的方式

邮箱+日历,其实就是最简单的GTD工具。 看一下邮箱的设计,一个Inbox,就是用来放所有信息的地方,收集到的信息全部汇总到这里。 然后定期的维护这个收件箱,将关心的事情整理,组织成工作流,录入到日历中去。 接下来顺着日历的时间顺序拿出任务执行。很自然的形成Next Action。 到一定阶段,回顾之前的任务,整理消化进入下一个循环。

上面这个循环就是一个很标准的GTD循环。所以,你看,善于利用现有的工具就可以管理起来你的时间。

3 加点高级功能

在GTD的概念中还有一个概念,情景(Contexts)。那这个我们怎么来实现呢?这个可以使用Tags的方式实现,创建这些标签:

  • Studio 工作室,公司等工作场景下
  • Home 在家或者自己空闲的时候安成的工作。
  • Tourism 外出旅游等需要做好的前期、中期、后期任务等
  • Computer 需要计算机完成的任务,毕竟互联网公司
  • Reading 早餐,上班路上,闲暇时候阅读书籍,杂志,网站等
  • Lunchtime 中午午休时间等休息的时候完成的任务,起了一个 可愛い 的名称
  • Project 为了表示我所参与的项目,项目的标题部分添加标签。
  • Mail 需要特别注意的邮件

标签不要创建太多,够用就行,上面就是我所创建的标签(情景)。(貌似也是挺多的啊。哈哈哈)。 创建完成之后,在创建任务的时候加上这些标签就可以啦 :P

还有其他的高级功能就是搜索、迅速创建任务的功能(避免打断任务流)等。 搜索的话,邮箱应该都会有,看各家厂商的实力了。迅速创建任务,这个可以用记事本、便签纸、提醒事项等等软件来记录。

我觉得,如果熟练掌握上面的软件,并且理解了GTD的精髓,知道如何合理运用时间、分配、组织任务。 那,我相信你的工作将会是井井有条的,你的家人会更加的爱你,你的上司会更加的赏识你。

4 我的方案

我的方案的话还是一如既往的Emacs了。Emacs有一个强大的模式 Org-mode (本文的主角之一)。 而上面我所说的一切都是在Emacs中配置一份而已。配合emacs强大的编辑功能,让人爱不释手。

不过刚开始配置的时候,一点头绪都没有,然后看到别人“浩如烟海”的配置代码时,内心是崩溃的。 靠着不靠谱的英语和匮乏的中文资料,开始了这一趟旅程。

最后我简化了一些配置,先以最小子集来试行一段时间。

4.1 文件结构

/GTD
|-- newgtd.org ;; main org file: Tasks Idea Someday/Maybe
|-- newgtd.org_archive ;; archive file
|-- reading.org ;; reading list
|-- projects
 |-- A.org
 `-- B.org
`-- remember.org ;; capture quickly

4.2 一些配置

4.2.1 主要的Tags(情景)

(setq org-tag-alist '(("STUDIO" . ?s) ;; company studio office
                      ("PROJECT" . ?p) ;; difference task at company
                      ("HOME" . ?h) ;; home
                      ("MAIL" . ?m) ;; mail somebody
                      ("LUNCHTIME" . ?l) ;; breakfast lunchtime dinner onway etc. (rest)
                      ("TOURISM" . ?t) ;; tourism or not at home/company and any where
                      ("COMPUTER" . ?c)
                      ;; ("FIELD" . ?f)
                      ("READING" . ?r))) ;; reading

4.2.2 任务的状态

(setf org-todo-keyword-faces
      '(("NEXT" . (:foreground "yellow" :background "red" :bold t :weight bold))
        ("TODO" . (:foreground "cyan" :bold t :weight bold))
        ("STARTED" . (:foreground "springgreen" :bold t :weight bold))
        ("CANCELLED" . (:foreground "#DC143C" :bold t :weight bold))
        ("WAITING" . (:foreground "yellow" :bold t :weight bold))
        ("DEFERRED" . (:foreground "deepskyblue" :bold t :weight bold))
        ("DONE" . (:foreground "gray50" :background "gray30"))))

4.2.3 常用操作

(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cg" 'gtd)
(global-set-key "\C-cc" 'org-capture)

4.3 操作流

GTD-任务类型

任务被我分成4类:重要紧急、重要不紧急、不重要不紧急、不重要但紧急。查阅相关资料( zhihu:20247508 )之后理解成这个,仅供参考:

  • 重要紧急:救火
  • 重要不紧急:规划
  • 不重要但紧急:琐事
  • 不重要不紧急:休闲

对于重要不紧急,我一般一天刚开始的时候,会 C-c a a 看一下今天需要做什么任务。 做完任务之后,我会 C-c C-x a 暂时将这个任务归档。 等到周末的时候(一般以7天为一周期进行回顾),再通过 C-c C-x C-a 一次性全部归档。 规划、项目等需要长期执行的任务,也是通过 gtd-org 来完成。

如果在工作的时候突然有什么紧急需要被打断,或者有什么新的点子,我会 C-c c 捕捉这个放到 remember.org 中去。 之后在做完任务之后去整理一下。 当然重要紧急任务的话,还是会中断当前的任务,切换过去做这个任务。这个就是去救火了。

对于琐事(交话费等)的话,我一般用Reminder这款软件来记录,就是一堆to-do list。

休闲就没有什么可以记的了,“遵从”本性。

完整配置

;;; dto-org-gtd.el --- dto's org-mode configuration for GTD

;; Copyright (C) 2007  David O'Toole

;; Author: David O'Toole(require 'org) <dto@gnu.org>
;; Modifier: Junjia Ni (creamidea@gmail.com, 2015) 
;; Keywords: tools

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.

;;; Commentary:

;; There are several articles about using GTD (GettingThingsDone) with
;; OrgMode. I'm publishing mine as an Emacs Lisp source
;; file. 

;; This is a very basic example org-and-gtd setup. It's also my real
;; configuration, so you can load it yourself or just take a few
;; pieces.

;;; Code:

(require 'org)
(setq gtd-path "~/Documents/GTD")

;; I have a nice Wacom tablet, so I like to use the mouse. Org-mouse
;; adds various clickable menus to org-mode constructs.
(require 'org-mouse)

;; I want files with the extension ".org" to open in org-mode.
;; (add-to-list 'auto-mode-alist '("\\.org$" . org-mode))

;; I keep almost everything in one big org file.
;; I open my gtd file when I hit C-c g
(defvar org-gtd-file (concat gtd-path "/newgtd.org"))
(defun gtd ()
  "Open the GTD file."
  (interactive)
  (find-file org-gtd-file))

;; Some basic keybindings.
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
;; (global-set-key "\C-cr" 'org-remember)
(global-set-key "\C-cg" 'gtd)
(global-set-key "\C-cc" 'org-capture)

;; This seems like a good basic set of keywords to start out with:

(setq org-use-fast-todo-selection t)
;; (setq org-todo-keywords '((type "TODO" "NEXT" "WAITING" "DONE")))
(setq org-todo-keywords
      (quote ((sequence "TODO(t!)" "NEXT(n)" "|" "DONE(d@/!)")
              (sequence "PROJECT(p)" "|" "DONE(d!/!)" "CANCELLED(c@/!)")
              (sequence "WAITING(w@/!)" "HOLD(h)" "|" "CANCELLED(c@/!)")
              (sequence "SOMEDAY(s)"))))

;; Some projects need their own org files, but I still want them to
;; show up in my agenda.

(defvar org-gtd-other-files)
(setf org-gtd-other-files
      (list (concat gtd-path "/projects/third-part-monitor.org")
            (concat gtd-path "/remember.org")
            (concat gtd-path "/reading.org")))
(setf org-agenda-files (cons org-gtd-file org-gtd-other-files))
;; (setq org-agenda-files (list "~/Documents/GTD/project"))

;; When I'm using org to track issues in a project, I use these
;; keywords on a file-local basis: 

;; #+SEQ_TODO: TODO | DONE
;; #+SEQ_TODO: REPORT BUG KNOWNCAUSE | FIXED 
;; #+SEQ_TODO: | CANCELLED

;; The lisp version is:

;; (setq org-todo-keywords '((sequence "TODO" | "DONE")
;;                        (sequence "REPORT" "BUG" "KNOWNCAUSE" | "FIXED")
;;                        (sequence | "CANCELLED")))

;; Easy basic searches. Get a quick view of nextactions, etc

(setq org-agenda-custom-commands
      '(("w" todo "WAITING" nil)
        ("n" todo "NEXT" nil)
        ("d" "Agenda + Next Actions" ((agenda) (todo "NEXT")))))

;; I use org's tag feature to implement contexts.

(setq org-tag-alist '(("STUDIO" . ?s) ;; company studio office
                      ("PROJECT" . ?p) ;; difference task at company
                      ("HOME" . ?h) ;; home
                      ("MAIL" . ?m) ;; mail somebody
                      ("LUNCHTIME" . ?l) ;; breakfast lunchtime dinner onway etc. (rest)
                      ("TOURISM" . ?t) ;; tourism or not at home/company and any where
                      ("COMPUTER" . ?c)
                      ;; ("FIELD" . ?f) 
                      ("READING" . ?r))) ;; reading 

;; I like to color-code task types.

(setf org-todo-keyword-faces
      '(("NEXT" . (:foreground "yellow" :background "red" :bold t :weight bold))
        ("TODO" . (:foreground "cyan" :bold t :weight bold))
        ;; ("TODO" . (:foreground "cyan" :background "steelblue" :bold t :weight bold))
        ("STARTED" . (:foreground "springgreen" :bold t :weight bold))
        ("CANCELLED" . (:foreground "#DC143C" :bold t :weight bold))
        ("WAITING" . (:foreground "yellow" :bold t :weight bold))
        ;; ("WAITING" . (:foreground "yellow" :background "magenta2" :bold t :weight bold))
        ("DEFERRED" . (:foreground "deepskyblue" :bold t :weight bold))
        ("DONE" . (:foreground "gray50" :background "gray30"))))

;; I put the archive in a separate file, because the gtd file will
;; probably already get pretty big just with current tasks.

(setq org-archive-location "%s_archive::* Archive")

;; Remember support. This creates several files:
;;
;;   ~/todo.org      Where remembered TODO's are stored.
;;   ~/journal.org   Timestamped journal entries.
;;   ~/remember.org  All other notes

;; and a keybinding of "C-c r" for making quick notes from any buffer.

;; These bits of Remembered information must eventually be reviewed
;; and filed somewhere (perhaps in gtd.org, or in a project-specific
;; org file.) The out-of-sight, out-of-mind rule applies here---if I
;; don't review these auxiliary org-files, I'll probably forget what's
;; in them.

;; (add-to-list 'load-path "~/.emacs.d/package/remember-el")
;; (require 'remember)
;; move sub-tree from one file to another
(setq org-refile-use-outline-path 'file)
(setq org-refile-targets '((org-agenda-files :level . 1)))
(setq org-reverse-note-order t)  ;; note at beginning of file by default.
(setq org-default-notes-file (concat gtd-path "/remember.org"))
(setq org-capture-templates
      '(("t" "Todo" entry (file+headline (concat gtd-path "/newgtd.org") "Tasks")
         "* TODO %?\n  %i\n  %a\n")
        ("i" "Idea" entry (file+headline (concat gtd-path "/newgtd.org") "Idea")
         "** %?\n %T\n  %a\n")
        ("j" "Journal" entry (file+datetree (concat gtd-path "/journal.org"))
         "* %?\nEntered on %U\n  %i\n  %a\n")))

;; (setq remember-annotation-functions '(org-remember-annotation))
;; (setq remember-handler-functions '(org-remember-handler))
;; (add-hook 'remember-mode-hook 'org-remember-apply-template)

;; (setq org-remember-templates
;;       `((?t "* TODO %?\n  %i\n  %a" ,(concat gtd-path "/todo.org"))
;;         (?j "* %U %?\n\n  %i\n  %a" ,(concat gtd-path "/journal.org"))
;;         (?i "* %^{Title}\n  %i\n  %a" ,(concat gtd-path "/remember.org") "New Ideas")))

;; (global-set-key "\C-cr" 'org-remember)
;; (global-set-key [(f12)] 'org-remember)

;; My preferences. These are less related to GTD, and more to my
;; particular setup. They are included here for completeness, and so
;; that new org users can see a complete example org-gtd
;; configuration.

(setq org-return-follows-link t)
(setq org-hide-leading-stars t) 
(setf org-tags-column -65)
(setf org-special-ctrl-a/e t)

;; (setq org-log-done t)
(setq org-log-done 'time)
(setq org-log-done 'note)
(setq org-deadline-warning-days 14)
(setq org-fontify-emphasized-text t)
(setq org-fontify-done-headline t)
(setq org-agenda-include-all-todo nil)
(setq org-agenda-include-diary t)
(setq org-agenda-use-time-grid t)
(setq org-directory gtd-path)
;; org export setting(config)
;; (setq org-export-html-style "<link rel=stylesheet href=\"../e/freeshell2.css\" type=\"text/css\">")
;; (setq org-export-with-section-numbers nil)
;; (setq org-export-with-toc nil)
(setq org-adapt-indentation nil)

;; widen category field a little
(setq org-agenda-prefix-format "  %-17:c%?-12t% s")

;; fix new keybinding that clobbers mine
(add-hook 'org-mode-hook
          (lambda ()
            (local-set-key [(control tab)] 'other-window)))

(provide 'org-gtd)
;;; org-gtd.el ends here

5 其他工具

其实,是有“专业”的GTD工具存在的,Google搜索 Best GTD Tools 可以出现很多的结果。 为了避免被说做广告,我就不列举了。你们自己玩的开心就好 :P

关键是你要明白 你要做什么

6 尾声

时间管理,对于我来说就是循环执行决策原则,而我又不是太会做决策,真是搞笑呢!

在学习的过程中,突然意识到自己太注重「器」,而忽视了「道」和「术」的学习,本末倒置。但愿现在醒悟不太晚。

我目前理解的GTD核心就是这么多了。接下来就是对具体的事进行具体的分析了。 这个是要训练的,我相信通过一段时间系统的学习和训练,一定可以发挥GTD最大的功效。

如果大家还想深入了解的话,我推荐大家可以去看一下这个: Organize Your Life In Plain Text! 虽然讲的是如何用orgmode来管理任务,但是思想可以借鉴一下。

以上。

7 Reference

Junjia Ni

2015-11-18

2016-11-10 Thu 13:03

Emacs 25.1.1 (Org mode 9.0)

2016-11-10 Thu 12:43