Task Management using Emacs and Org-mode

During my daily work, I must be on top of several projects. I do the technical groundwork, plan, coordinate, and follow up with people. That is not always easy as the context switching becomes quite exhausting. I’ve become protective of my memory bandwidth. I use it sparingly, mostly in areas where I can bring the most value. Hence, I don’t try to memorize my work agenda. A plain text file does it for me instead.

Task management is hard to get right. One can easily overdo it, causing it to become a chore. One can also underdo it, which then renders it useless.

My task management had to have two essential properties.

After all, the task management has to work for us, not the other way around.

It took me a while to find a process matching the above properties. I tried several tools. Some had many features, but I found them hard to work with. Others were simple but harder to navigate for larger workloads. I needed to set up my workflow using a tool, and it had to be just right. I found it in Emacs and its Org-mode.

Not everything must be a Task

It’s important to keep this in mind before diving into the workflow. Sometimes, we only need to do the thing and move on. I add items to my task list sparingly. Otherwise I’d end up with a cluttered agenda with mostly useless information.

My Org-mode config

I keep everything in a single file ~/org/tasks.org.

(setq org-agenda-files '("~/org"))

My tasks have three states - [TODO] -> [PROG] -> [DONE]. I delete the cancelled tasks and archive the DONE ones (more on that later).

(setq org-todo-keywords
      '((sequence "TODO(t)" "PROG(p)" "DONE(d)")))


|-- Root
   |-- [Project]      :Tag:
      |-- [Task]

This structure allows me to expand/collapse and easily navigate through projects. I have a single root and topic-based child nodes. I tag each of the topic nodes nodes so that the tasks below can inherit it. That comes handy when searching/filtering my agenda. My tree rarely gets deeper that three levels. Sometimes, I break down a task into subtasks using bullets. In general, however, I try to keep the structure flat and as simple as possible.

Here is an example:

Just like not everything deserves a to be a Task, not every Task deserves to have a deadline. I set deadlines only when sometihng is time sensitive. I set scheduled dates only for things which take more thay a day or two to complete. Not all tasks have to be DONE either. We have shifting priorities, so it’s OK for a Task to remain in the list for as long as it’s needed.

My custom agenda view shows me the weekly distribution by deadline/schedule and a global list of tasks groped by their state.

  ;; Customized view for the daily workflow. (Command: ", a n")
  (setq org-agenda-custom-commands
        '(("n" "My Weekly Agenda"
           ((agenda "" nil)
            (todo "PROG" nil)
            (todo "TODO" nil)
            (todo "DONE" nil))

(setq org-todo-keyword-faces
      '(("PROG" . (:foreground "yellow" :weight bold))))

;; Hide the deadline prewarning prior to scheduled date.
(setq org-agenda-skip-deadline-prewarning-if-scheduled 'pre-scheduled)

Show my custom weekly agenda view (org-agenda) n

Most of the work I do in thus buffer falls down to:

List all the TOOD entries (org-agenda) t

Here I filter my tasks by state.

Org-mode has plenty more ways to search and navigate, but the above are the ones I use most of the time.


I archive my completed Tasks by pressing $ when on a task in the Agenda buffer.


There are still areas of Org-mode and Emacs which I’m yet to explore. This wokrflow, however, has been working well for me. The Agenda view is one of the screens I keep open most of the time, and the Task list is what I usually start my days with. I use Spacemacs, so the ergonomics of this workflow might differ in other distributions.

comments powered by Disqus