How I use Emacs and Org-mode to implement GTD

Table of Contents

What is Getting Things Done

"Getting Things Done" is a book by David Allen in which he describes a work-life management system developed after twenty years of consulting work. The promise of GTD is "Stress-free productivity" and developing a calm state of mind in a state of readiness. Allen's second book, "Ready for Anything" elaborates on these principles in a series of essays.

The effectiveness of GTD lies in taking a complete and current inventory of all your commitments, then organizing and reviewing this information regularly in a systematic way. Your work and life can then be viewed from different levels of detail allowing you to make choices about what to do (and not do) at any moment.

The GTD system has some key practices that make it efficient and effective:

The benefit I have gained from using GTD is confidence that I haven't forgotten to do something because I regularly capture my thoughts, commitments, ideas and "to do" items in a trusted system. This allows me to think more clearly and not be stressed worrying about what I may have forgotten.

About the Author

My job is developing classroom training materials and E-Learning solutions for a software company based in North Sydney. Most of my day is spent at the computer using a variety of programs including Microsoft Word and Powerpoint, Adobe Captivate, Articulate Presenter, and Audacity (sound editing). Our company uses Outlook for email and calendaring which I use for my office time meetings and appointments.

I am married with two teenaged children. We have a varied and busy home life with a house and garden to maintain. My hobbies include watching movies on DVD, listening to music, reading, Toastmasters, and learning Japanese. My home computer is used extensively for my activities of enjoying movies and music, communicating, planning, writing, blogging and researching on the Web.


My trusted GTD system is a set of text files managed with Emacs, org-mode and Remember mode. The remainder of this article shows how I configured these tools and structured the text file contents.

The org mode text files

My org mode files are as follows:
The main file containing TODO items, Projects, appointments and reminders
The archive file for the file. This is the history of all completed work.
The Someday/Maybe file. The contents are reviewed each week. This file contains lists of things I would like to do, learn, books to read, places to go, and ideas for new projects.
This is my electronic notebook where I record everthing that I don't write by hand - notes, web site addresses, diary notes, films seen, books read, conversations I have had, and things I have done. This file is updated with Remember mode.
Birthday and Anniversary information. This file is one of my agenda files.

The main GTD File

The main file is structured into five main sections: Tasks, Calendar, Projects, Borrowed and Financial. Each heading is followed by a category label for identification of items in agenda views.

Category tags

I use the #+CATEGORY lines at the beginning of each major section for display in the agenda view. This shows me if an item is part of a project, a task, a borrowed item (requiring completing in the near future) or a financial activity.

Since I wrote this article it was pointed out to me that multiples occurences of #+CATEGORY are discouraged. Instead, a PROPERTIES entry is created as follows.

  :CATEGORY: Projects

Here is a sample agenda view showing these Category tags. This display is sorted first by context tag.

   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:

Context Tags

In the GTD system, contexts are used to define where a task can be done. The idea of a context is to narrow down your to-do list so you can focus on the work you can do at the present moment.

When I am at the office I look for "Office" context tasks, but when I am at home I look at "Home" or "Computer" (the Home computer) contexts. I read books during breakfast or on my daily train commute, and this context is "Reading".

Using contexts allows a larger list of tasks to be segmented into areas of focus. My contests are implemented as the following set of tags:


Here are brief description of these contexts.

Work that takes place in my office in North Sydney.
Activites that take place at home or in my personal time. For example I might have a task "Deliver package to Bill" in the "Home" context.
Tasks that require use of the home computer.
Books, magazines and other reading material for my breakfast reading or commute reading.
Films to watch in the comfort of my home entertainment room.
Errands and other activities I do in my lunch break at North Sydney. This also includes activites I may do before or after work, for example, buying something at a shop.
I use this tag to identify the heading of a project in order to display a list of active projects.

Tags are selected with the C-c C-c command then choose the letter next to the full tag name.


To Do states

I use the following set of To Do states, modelled on those described by John Wiegley in his blog post.


The tags are used as follows:

The item is ready to be done at the earliest opportunity or at the date (and maybe time) indicated in the SCHEDULED tag. Some tasks are given a DEADLINE date which is useful for scheduling the tasks during my daily planning.
I should use this tag when I start on a task, but if I clock in to a TODO item, I don't really need this task.
I did some work on this task but I am waiting for a response. If I use this task I schedule the task into the future as a reminder to follow up with some notes in the body of the task.
Used to tag an activity that can only be done at the specified time and date, instead of tasks that can be completed at any time.
The task is completed.
I decided not to do this task but have left the task on file with this status.
Used to identify a task that will not be activated just yet. The reason will be included in the task notes.

I set the org-use-fast-todo-selection variable to true for fast selection of tags. The C-c C-t command displays the following selections:


Planning the Day

At the beginning of the day I review the agenda for the day all my context lists using the command C-c a H. This shows first of all any time specific activities for the day, then tasks scheduled for the day, followed by items for each tag. The custom command for this view is:

 ("H" "Office and Home Lists"
          (tags-todo "OFFICE")
          (tags-todo "HOME")
          (tags-todo "COMPUTER")
          (tags-todo "DVD")
          (tags-todo "READING")))

Next I can see the deadline warnings for upcoming events so I can decide to schedule the activity. For example, my home building insurance policy is due in 5 days time:

  Financial:  In 5 d.:  NRMA Home Building Renewal due         :OFFICE

I received the reminder notice about 4 weeks ago, but since it was not due until the 18th January, I created a task when I received the bill then placed the document in my bills to pay folder:

 ** NRMA Home Building Renewal due                      :OFFICE:
   DEADLINE: <2009-01-18 Sun> 

Therefore I didn't have to worry about forgetting to pay the bill as I knew my system would remind me closer to the event. Now I can decide to pay this bill on Thursday, so I enter the command C-c C-s to schedule the event, and select Thursday's date by entering Thur then pressing Enter. The item will be updated as follows:

 ** NRMA Home Building Renewal due                       :OFFICE
    DEADLINE: <2009-01-18 Sun> SCHEDULED: <2009-01-15 Thu>

After reviewing the date specific items I review the items grouped by tag. The GTD system says you should work from context lists, so when I am at the office I should look at the OFFICE list and just keep working through that.

What I like to do is to select the items i feel I MUST complete today, then shedule them for today. This gives me a list of things I want to achieve today, and as I work through the day I cross off the items and can see progress being made. I strive to have no more than about 15 items on the list otherwise I feel overwhelmed.

Once I have reviewed my lists I create another agenda view which shows just the items scheduled for today but sorted by context. Sometimes I print this list to have a daily plan for crossing off completed items with a highlight pen. I can then carry this printout in my pocket when I am away from my desk, or commuting. This custom command is:

 ("D" "Daily Action List"
           (agenda "" ((org-agenda-ndays 1)
                        (quote ((agenda time-up priority-down tag-up) )))
                       (org-deadline-warning-days 0)


Estimating the Day's work

Knowing what needs to be done is all very well, but how long will it take to complete all these tasks? This is where I use the org-mode feature of adding time estimates to each task. The following line configures the time values I use for estimating task durations:

 #+PROPERTY: Effort_ALL 0 0:10 0:20 0:30 1:00 2:00 4:00 6:00 8:00

Tasks that take several days to complete, for example reading a book will be given an estimate of how much time I can commit today. For example, I may allocate 4 hours to a major task for the day.

The best way to enter task estimates is to use Column View, so I switch to this view with the command C-c C-x C-c.


The time estimate is updated by moving to the appropriate row and column then using the shift-Left arrow or shift-Right arrow keys to cycle through the range of values in the EffortALL property

Alternatively, a single digit can be used as a short cut. The number corresponds to the position in the list:

 #+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

The total time for the day is updated and visible at the top of the agenda window. Typically I allocate around 6 to 8 hours of tasks per day.

Working the Day

I use the Clock mode to record the duration of the task. This gives me feedback on how much time a task actually took which I can compare to my estimate. It is surprising to find how little time some tasks require (paying a bill) and how some tasks take much longer than estimated.

When I start work on a task I move the cursor to the task in the agenda then issue the command I . The clock has started and I can see the active task in the Emacs window along with a current duration. This is a useful reminder of what I am working on (even when I am not using Emacs) and how much time has been spent in this current work session.


When stopping work on a task, I clock out with C-c C-x C-o, or enter the command O in the agenda window. The total accumulated time is displayed in the agenda view.

I often turn on the display of completed tasks to view the completed tasks. The command is the letter l which toggles the view. This is a good way of displaying when the task was done and to observe how I have been working during the day.


Reviewing the Week

Part of the GTD workflow is to do a weekly review of all the active projects and to get my system up to date. I created the weekly review file to use as a checklist of things to do.

The reminder to perform the weekly review is in my calendar as a repeating item. I have a link to the checklist file and I use clock in/out to record how long it took me to do the weekly review.

 * 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
   :Effort:   1:00
 [[][Open Weekly Review Checklist]]


As part of the weekly review, the "Someday/Maybe" list of ideas and projects is reviewed to see which items (if any) should become active. Such a task should be moved from the "someday" file to the "active" file. It is sometimes necessary to copy items from the active file to the someday file.

The has level 2 headings for the categories

 * Someday
 ** Books to Read
 ** Films to Watch
 ** Things to Do
 ** Things to Learn
 ** New Projects

This is where org-mode refiling is used. The C-c C-w file is used to prompt for a new location of the current headline. The targets for refiling are stored in the variable org-refile-targets. I have customised my variable to:

 '(org-refile-targets (quote (("" :maxlevel . 1) 
                              ("" :level . 2))))

This gives the effect of showing second level headings in the file and top level headings only in the file.

The C-c C-w command will display the headings and the filename in parentheses. This display will be different depending on which file is being edited. In the following display I am about to transfer the task of reading a book to the Tasks section of my file.


Note Taking

Throughout the day I take notes and capture ideas using Remember mode. At work I have a file called and at home I use a file

The heading of my file looks like:

 #+STARTUP: overview

 * December 2008
 * January 2009

I create top level headings for each month, and journal item headings have two asterisks. This allows me to organise my notes by month. The various Remember templates add the appropriate tag, so I can quickly create a list of Films I have seen, books I have read, or monitor my weight loss goal.

Synchronising home and work org-mode files

My file needs to be accessible at home and the office. I have a directory of files on both my home and office computers and use a USB drive and a Python script to synchronise the files.

I have a desktop shortcut "GTD Backup" which runs the Python script and gives a simple menu.

 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:

The script copies files using preconfigured directory and file names, performs backups to Zip file format. A very important part of the program logic is to stop me from accidentally copying an older version of the file over the newer version!

Further Reading

  1. A description of GTD from the David Allen web site.
  2. Natural Project Planning article by Charles Cave
  3. Remember Mode Tutorial by Charles Cave
  4. "Using Org-mode as a Day Planner" - John Wiegley's blog article
  5. My .emacs file.
  6. A cutdown version of my file.
  7. Quotes about org-mode.

Author: Charles Cave <>

Date: January 2009

HTML generated by org-mode 6.17c in emacs 22