Further adventures in org-mode

emacs geekery

Emacs is really the gift that keeps giving. It has now been about 4 months since I started using org-mode to manage all my todos, and it has been working terrifically well for me. Despite having lots of different projects to juggle at the moment, I continue to feel more or less on top of things — or at least, I know how much stuff I haven’t been able to get to yet! The best thing about Emacs and org-mode is that you can expand and develop your system as your needs change. You don’t need to set up a complex system at the start, nor do you need to make the whole system complex if only one part of it needs extra structure. It’s all very flexible. I’ve made a couple of tweaks recently, and also started adapting my system of keeping notes which I thought might be interesting for other Emacs users and the Emacs-curious.

At the start of the year, I started a new role as part of my job. It requires keeping on top of things that I need to handle and dealing with them in a timely way. It is also quite structured, in that each task allocated to me has a series of more or less identical steps that I need to move through. It’s important that I don’t forget any of these steps, so it struck me that it would reduce the amount of thinking I need to do if I pre-populated them automatically when I set each task up.

As I explained in my previous post on my setup, this role definitely merited its own file. I also added the header #+CATEGORY: work to the header of the file so that it gets included in my work tasks in the agenda. The first change I made was to set up a specific capture template to build the structure of sub-tasks automatically, and file the tasks under the right header in this file. I discovered after a searching around that you can set up more complex capture templates in separate files, which seemed useful for this case. Each of the tasks assigned to me gets a unique ID number, so when the notification email comes in, I copy this ID and the capture template fills it in automatically from the clipboard, adding it to the main headline and each sub-task. I include a properties drawer which has fields for several dates. These dates either get filled in automatically with the current date or I get prompted to enter them when I capture the task. I add to these date properties as the task moves through several stages, and this helps me keep track of how long the different phases are taking across the tasks. Eventually, I plan to create an org-mode table to summarise this information, but for now I just use column-mode to get an overview across the tasks which I can toggle on and off. Again, the incremental nature of org-mode is useful: I don’t need to build the table from the start, but just when it becomes useful or necessary.

Since you can set up different todo keywords in different files (by adding them to the top of the files with one or more #+TODO: lines), I created some specific key words for the headline for each task so that I can scan across the folded tasks headlines and see what phase each is in, like a kind of status dashboard.

I also keep a ‘Workflow’ headline at the bottom of the file, so that I have the details of each of the steps and the various rules and guidelines they entail in the same place that I am tracking the task: no more having to click around to find that file which has all the information in!

It seems simple, but these steps have really smoothed out what could be an overwhelming process for me. As I mentioned earlier, the power of org-mode is that I could tailor this structure precisely to my needs and also that I only have this level of detail for this part of my work: other kinds of tasks are handled in a much simpler way.

I mentioned that the other change I have made has been to update the way I take notes on ideas, papers I read and so on. Many people I follow on Micro.blog have got into using a very clever note-taking tool called Roam. I tried it out, and while I thought the ease of linking between ideas was very useful and clever, I kept finding myself thinking that surely org-mode could do this. Evidently I am not the first person to think that, as Jethro Kuan has written about it, and uses a system that combines Deft (which I was already using) with his own package, org-roam. Here’s how I integrate it:

(use-package! deft
  :after org
  :bind
  ("<f7>" . deft)
  :init
  (setq deft-file-naming-rules
      '((noslash . "-")
        (nospace . "-")
        (case-fn . downcase)))
  :custom
  (deft-recursive t)
  (deft-use-filename-as-title nil)
  (deft-use-filter-string-for-filename t)
  (deft-extensions '("md" "txt" "org"))
  (deft-default-extension "org")
  (deft-directory (expand-file-name "~/Dropbox/SemanticNotes/")))

;; org-roam
(use-package! org-roam
  :after deft org
  :bind (("C-c r t" . org-roam-today)
         :map org-mode-map
         (("<C-f7>" . org-roam)
          ("C-c r u" . org-roam-update-buffer)
          ("C-c r l" . org-roam-get-linked-files)
          ("C-c r i" . org-roam-insert)))
  :custom
  (org-roam-directory (expand-file-name "~/Dropbox/SemanticNotes/")))

I used to use Markdown format for my Deft notes, but I now use org-mode to make it easier to include code snippets, images and so on. Deft is modelled on Notational Velocity/nvALT, and intended to store relatively short notes. The idea is that when you launch it you are immediately in the search field. You start typing words and it filters the list of matching notes live. You can hit enter to open the selected note, or — if there are no matching notes — create a new note of that name. The configuration I use converts the filter string to a sanitized form (substituting spaces for hyphens for example) and then adds the original title as the org-mode title header.

As originally conceived, Deft deals with lots of separate and independent notes, but if you are constructing a knowledge base of interconnected information (as Roam does), you need to be able to link ideas together easily. This is what org-roam does. It provides functions which enable you to easily insert links to other files, providing a list of files which gets filtered live using either Ivy, Helm or Ido, depending on what you use. It also caches a list of notes that link to the currently-open note, so you can use another function to view them in a side window, and jump to them if you want. It also replicates the ‘daily notes’ feature of Roam, though I use org-journal for that instead. It covers the main things I would want from Roam, but also offers the full power of org-mode and enables me to stay in Emacs which is where I am most of the time. The files are on my own computer (and backed up and synced), and I can use pandoc at any time to export some or all of them to other formats like HTML or PDF. Jethro actually generates a public website from his notes (Jethro’s Braindump), which he builds using Hugo, the same tool I use to generate this blog. It’s a really slick system.

The final change I have made is to switch from syncing my org files with iCloud to Dropbox. iCloud seems to have a maddening tendency to stubbornly refuse to sync in some circumstances, so I was having to touch a file in the relevant iCloud folder from the command line in order to force it to notice changes to the files and sync. So far, Dropbox is working beautifully and syncs changes very quickly.