Todo lists in Vim, syntax highlighting

2022-06-20

I keep a todo list on my computer, which contains tasks for work and home. It also contains items where I’m waiting for someone to do something, and I use it as a scratchpad for bits of pertinent information that might be useful in the near future. The file is written in Markdown . Items in the list are written as bullet points (-), and sometimes I group items together under headers (#). Sometimes I have headers for each day of the week, and sometimes for a particular project I’m working on. The bullet point list of tasks is sometimes nested to include extra information about each task, or to add subtasks below a main task.

I’ve known about the todo.txt file format for a long time, and I see the logic in it. todo.txt is very flexible and has a number of optional features. You can specify due dates and creation dates (2022-05-05, due:2022-05-05), prioritise tasks using a letter system ((A), (B)), group tasks by project (@project) or context (+context), mark tasks as done ([ ], [x]) and optionally move completed tasks to a separate done.txt file. In my current system I already move tasks to “done” files, one per day, and I often add creation dates and due dates, especially on tasks where I’m waiting for someone to do something.

The thing that has always put me off using todo.txt is the inability to add longer descriptions or subtasks to a task. Each task must occupy a single line. I also like having the ability to group tasks under headers as this allows me to plan my time, but todo.txt requires each line to be a task. Whenever I’ve dabbled with todo.txt in the past, it’s always given me tunnel vision, making it so I can only focus on the next few short tasks ahead of me, at the expense of understanding the wider context of my work. That being said, I would like to start making use of the context and project tags from todo.txt to organise tasks in my todo.md file.

I do most of my task management in neovim . I wrote some syntax highlighting rules to extend the basic Markdown syntax highlighting in vim, by placing a file at ~/.config/nvim/after/syntax/mardown.vim. The file contains:

syntax  match  TodoDate  '\d\{2,4\}-\d\{2\}-\d\{2\}'
syntax  match  TodoDue  'due:\d\{2,4\}-\d\{2\}-\d\{2\}'
syntax  match  TodoProject  '\(^\|\W\)+[^[:blank:]]\+' 
syntax  match  TodoContext  '\(^\|\W\)@[^[:blank:]]\+' 

highlight  default  link  TodoDate  Type
highlight  default  link  TodoDue  Constant
highlight  default  link  TodoProject  Comment
highlight  default  link  TodoContext  Statement

So when I open my todo.md it looks like this:

Screenshot of todo.md showing syntax highlighting