Miskatonic University Press

How I use Emacs for Getting Things Done

emacs gtd

I use the Getting Things Done system to keep track of what I'm doing. It works very well for me. My personal stuff I keep track of in paper in a Filofax, but I have a lot more detail to track at work at York University, so I use text files. Here's my system.

The files

I have three files to manage what I'm doing, plus a monthly work diary:

  • next-actions.outline.txt
  • waiting-for.outline.txt
  • projects.outline.txt
  • work-diary-200904.outline.txt, in which I jot down notes about what I did that day and what's on my mind.

(I'll explain about Emacs and outline mode below.)

git to manage the files

I use the distributed version control system git to manage these files. First, I set up a basic repository on a Unix host where I do my personal e-mail.

$ mkdir -p york/gtd
$ cd york/gtd
$ git init
Initialized empty Git repository in /home/buff/york/gtd/.git/

Here I edited next-actions.outline.txt. More on its format below. Right now it only matters that the file exists.

$ git status
# On branch master
# Initial commit
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#       next-actions.outline.txt
nothing added to commit but untracked files present (use "git add" to

$ git add next-actions.outline.txt
$ git commit -m 'getting started'
[master (root-commit)]: created e98f811: "getting started"
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 next-actions.outline.txt
$ git log
commit e98f811b6b67ffd354ff33ef5df3da872a8e7059
Author: William Denton <wtd@pobox.com>
Date:   Tue Apr 21 21:12:44 2009 -0400

    getting started

Now I have a git repository with one file sitting on a Unix server I can get to from anywhere: work, home, anywhere with an Internet connection. I make a copy of it on my home machine:

$ cd york
$ git clone picketfence:york/gtd/
Initialized empty Git repository in /home/buff/york/gtd/.git/
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), 268 bytes, done.

I already had a york directory where I kept stuff. I was able to specify the server and file path with just picketfence:york/gtd because I already have ssh set up to save me time in ~/.ssh/config:

Host picketfence
Hostname picketfence.server.com
User buff

This lets me just say ssh picketfence and I connect. I've got my keys set up so no password is required, either.

Back to cloning a local copy of the repository.

$ cd gtd
$ ls -l
total 2
-rw-r--r--  1 buff  wheel  44 21 Apr 21:13 next-actions.outline.txt

Here I can edit next-actions.outline.txt again and add a task. When I'm done, I do this:

$ git commit -m 'update' next-actions.outline.txt
[master]: created 15f2969: "update"
 1 files changed, 1 insertions(+), 0 deletions(-)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
nothing to commit (working directory clean)
$ git push
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 326 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
warning: updating the currently checked out branch; this may cause
as the index and working tree do not reflect changes that are now in HEAD.
To picketfence:york/gtd
   e98f811..15f2969  master -> master

The next day at work I did the same thing and made a local copy of the repository there. I made my lists and so on, and at the end of the day I committed all of the files. At home in the evening, I ran git pull and it downloaded all of the changes. I could edit them, do a git push, and then the next day do another git pull first thing at work.

Now I have an easy way of keeping my GTD files in synch across various machines. They're not in the cloud so I can work on them without Internet access.

Emacs and outline mode

I'm a Unix-loving geek, so of course I keep my text in text files. To manage the GTD files I settled on outline mode, which is built into Emacs.

That page explains what an outline mode is. Here's an example of mine:

* E-mail
** Catherine: accurate collection stats for Wikipedia entry
** LCC: will be away for next meeting
** Peter R: is Joomla in use anywhere at York?
If so, could I get a test account to see what it's like?

To prevent having to run M-x outline-mode every time I open one of these files, I added this to .emacs:

;; outline-mode
(add-to-list 'auto-mode-alist '("\\.outline\\.txt\\'" . outline-mode))
(add-hook 'outline-mode-hook 'hide-body)

Now when I open next-actions.outline.txt Emacs automatically goes into outline mode and hides the bodies of all the entries so I just see the tasks.

It works for me

This system works really well for me. When I'm jotting down notes on what I did that day, if I remember I need to do something (e-mail someone, read something, fix something, whatever) I can switch buffers to the next actions list and put it down there. If I have a new project on the go, and I copy notes to the projects lists. If I have a next action of e-mailing someone, when I've e-mailed them I just copy the line to the waiting for list and add the date I sent the e-mail.

Plain text, Emacs to edit it, outline mode to give it some structure, and git so I always have a current copy of the files I need. I'm really happy with this.