Last year I wrote about the design of my personal productivity system, and promised to describe my implementation. I have to admit I am not very satisfied with it, but I’ve been using it for over half a year now and it works. Its main advantage is its simplicity – I only needed to write about 100 lines of Elisp to handle it.
So, here is the idea. Every planned day is an Org-mode headline, and every task is a sub-headline. Every task has a few properties – the due time, the “weight” (i.e., the score for that task if its completed on time), the actual score (awarded if the task is done at a certain time) and (sometimes) the “effort” (time alloted to the task). Predictably, I use the column view to see all these data at a glance (and also to have Org-mode sum up my score).
Now, I can see at least two things that could be automated with this setup. One is something I haven’t done (yet, perhaps?), and this is awarding points for completed tasks. This is a bit more involved than just putting the “weight” in the “score” column – if I complete the task early enough, the score is multiplied by 1.5 (rounded up), and if I complete 60% of the task on time (or the whole task not later than 5 minutes after the deadline for “one-off” tasks like “do Y” – this rule is new compared to the previous post, and serves to at least partially alleviate the “what-the-heck effect”), the score is divided by 2 (rounded down). This could be automated using hooks, but I admit I was a bit too lazy to do that. Also, manually awarding scores (using Org-mode column editing features) is rather fast, and actually feels a bit rewarding, so automating it (which is a good way to remove the frustration of repetitive tasks) doesn’t seem that necessary.
The other thing I did automate, and that is introducing a new task into the list. My code to do that is somewhere between “smart” and “stupid”. I will not show it here – it is pretty long, probably boring and not extremely elegant – but the idea is that it is a bit like a keyboard macro – it does what a human would do when creating a new headline and defining a bunch of properties on it. Actually, it does a bit more, like storing the entered tasks and their “weights” in history-like variables (these variables are remembered between sessions thanks to the persist package), calculating the score of the task from its weight, or calculating the due time for the task based on its effort estimate and the due time of the previous task, including a small margin – but not a lot more. (If there is some interest, I might put the code on GitLab or something, probably after cleaning it up a little bit, but it really isn’t anything to be very proud of.)
This is all very prototype-ish and rather crude, but the point is that it took me just about 2.5 hours to write that code, and it has been handling my needs pretty well for the last 6 months. This is just another testament to Emacs’ power – I think there are not many “frameworks” out there where you could write a functional (even if pretty rough) productivity app in under 3 hours.
CategoryEnglish, CategoryBlog, CategoryEmacs, CategoryOrgMode