Note: Text in English because its written for an international audience.
We all know those task, that we always push ahead into the future. Those tasks that we know we should do sooner or later, but we decide for later. We all have them, wether it is a task like „file taxes“ or „unclutter wardrobe“ or whatever. Yesterday I made a small step forward in handling those tasks.
Those who know me know that I’m using Orgmode to implement my own GTD system. Yes, I made a long YouTube playlist about that and even a course on Udemy. While using Orgmode for many years now I was still thinking about a method on how I can cope with those „rotten“ tasks that are there in my „backlog“ but will always be procrastinated. So the last days I started to write some Emacs-Lisp code for my Org configuration and since I’m not an experienced Emacs-Lisp programmer I even needed some help from StackExchange on a problem that I hit. But now the code is ready.
The technical side
The idea behind that code is, that my system records timestamps for every „reschedule“ of a task. So whenever I push a task into the future, my „:LOBOOK:“ drawer will get a line that says „Rescheduled from…“. So yes, I could see how bad the situation is by just looking at the tasks logbook drawer. But I was aiming for a more automated way that I can use in my weekly review. So I made this code snippet.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
;; org-rotten code to identify rotten tasks (defun org-get-logbook-notes () (save-excursion (unless (org-at-heading-p) (outline-previous-heading)) (when (re-search-forward ":LOGBOOK:" (save-excursion (outline-next-heading) (point)) t) (let* ((elt (org-element-property-drawer-parser nil)) (beg (org-element-property :contents-begin elt)) (end (org-element-property :contents-end elt))) (buffer-substring-no-properties beg end))))) (require 's) (defun my/org-rotten-set () (interactive) (let ((lognotes (org-get-logbook-notes))) (when lognotes (org-entry-put nil "ROTTEN" (number-to-string (s-count-matches "Rescheduled from" lognotes)))))) (defun my/setrotten () (interactive) (org-map-entries #'my/org-rotten-set)) |
The function I need to call is „my/setrotten“. This will iterate through all entries, count the number of „Rescheduled from“ occurences in the logbook and then set a property named „ROTTEN“ with the number of reschedules for this task.
So the procedure will be that when I start my weekly review I once execute this function. Then I can do an agenda view that shows me all tasks with a „ROTTEN“ level above a certain number. For my weekly review I created a custom agenda view that shows all tasks with „ROTTEN>10“.
The GTD side of the problem
So now, that I can quickly see the tasks that are always postponed and procrastinated I need to act on them in another way. One starting point for this could be asking about the WHY this task is always postponed:
- Is it depending on something I cannot control? Example: If my task was working in the garden and this month it is constantly raining that might make me push this task forward and forward again.
- Am I waiting for input from another person? Then this task must be set to „WAITING“ and if no input arrives until the scheduled date I need to contact the person that should deliver something and remind her to do so.
- Is that task „too big“ to do it in a reasonable time? Maybe I should transform it into a project and create smaller tasks that need less time and where I can clearly identify the next action that brings this task forward.
- Is it a task that I’m not really convinced of doing? Then I should consider to cancel this task and don’t let it clutter my backlog since it will probably never be done.
The important part is that I need to act on that. Rescheduling that task again won’t solve the problem. As an example I made my WR for my „president of a shooting club“ role yesterday. I encountered some tasks that were always pushed forward for one reason: Doing them would mean return to „normal life“, but at the moment our clubhouse is closed because of COVID19 countermeasures. As long as we are in this lockdown there is no use in scheduling something because nobody knows when we will be back to normal. So I decided to put those task back to „SOMEDAY“ with no schedule. Once we’re back to normal I can transform then back to „TODO“ or „NEXT“ and make a reasonable schedule for them.
So after arranging those things I shortened the logbook and removed all those „Rescheduled lines“ and adding a note to the logbook, that this was a rotten task and I now do another approach to put it forward.
Today my private weekly review is scheduled. It will take longer than usual because I will now act on my rotten tasks, but I’m confident that things will get better with this small hack in the future. And since identifying those tasks is so easy now I don’t have an excuse any longer to not work on them.
Hi Über,
This snippet looks super useful. Can you share the code you use to generate a timestamp every time you reschedule a task? Thank you.
Pablo, look at the documentation of the variable org-log-reschedule:
org-log-reschedule is a variable defined in ‘org.el’.
Its value is ‘time’
Original value was nil
You can customize this variable.
Documentation:
Information to record when the scheduling date of a task is modified.
Possible values are:
nil Don’t add anything, just change the date
time Add a time stamp to the task
note Prompt for a note and add it with template ‘org-log-note-headings’
This option can also be set with on a per-file-basis with
#+STARTUP: nologreschedule
#+STARTUP: logreschedule
#+STARTUP: lognotereschedule
Its just customized with the value „time“.
Great, thank you. I didn’t know this variable existed.