Aurélien Gâteau

Due task reminder in your prompt

written on Sunday, January 22, 2017

Over my years of managing my TODO list with Yokadi I have tried many approaches, with various levels of success.

Yokadi comes with a daemon, Yokadid, which pops notifications on your desktop for tasks which are late or about to be late. I don't personally use it because I find it too intrusive, especially when looking at my screen with a coworker or sharing my screen during a remote meeting.

Since I spend a lot of time in terminals, I figured out it would be nice to have a reminder there. To keep this discreet, I only wanted to show the number of due tasks. This is what it looks like:

[agateau ~/src d: 4]
$ █

As you can see, the only indication that I have 4 tasks due is the d: 4 part of my prompt.

I use the same Yokadi database for my personal and my professional user account, so for my personal account I wanted a count of all overdue tasks for projects whose name does not start with "geny" (the company I work for is called Genymobile, so all my work projects are named "genysomething").

I didn't want to access Yokadi database every time the prompt shows up, so instead I did the following:

First I created a short script called "ydue", which prints the number of overdue tasks matching a given filter. It looks like this:

#!/bin/sh
set -e
filter="$*"
yokadi "t_list --format plain --overdue $filter" | grep --count '^- ' || true

That's a bit hackish: it calls Yokadi to list all tasks matching the filter in plain mode, and prints the number of tasks, based on the fact that a task line starts with -.

(Note the || true so that the script does not exit with an error if grep does not find any task)

Then I setup a cronjob to call ydue every 5 minutes and store the output in ~/.cache/taskcount

*/5 * * * * ydue "!geny%" > ~/.cache/taskcount

Finally, I modified my .zshrc to include the task count in the prompt if it's greater than 0.

if [ -e "$HOME/.cache/taskcount" ] ; then
    local taskcount=$(cat $HOME/.cache/taskcount)
    if [ "$taskcount" -gt 0 ] ; then
        extraps="${extraps} d: $taskcount"
    fi
fi
PS1="[$user$host %~$extraps]$nl$ "

($extraps is a variable which can contain other info like the current branch when inside a git repository. $nl is a newline character)

That's it, I now get a discreet reminder that I have tasks due today. Every time I get it down to 0, I pat myself on the back :)

This post was tagged tips and yokadi