I have reconciled myself to the fact that more and more of my life is being assimilated by Emacs’ Org-mode
. And a few days ago, I decided to give the habits module a try. However, I found inserting new habits a bit cumbersome: manually setting the STYLE and LOGGING properties, inserting the timestamp (with the repeater) is too much a repetitive task for an Emacs user. So, here’s a quick fix:
(defun org-insert-habit ()
"Insert a new TODO subheading and set its properties so that it becomes a habit."
(interactive)
(beginning-of-line)
(org-insert-todo-subheading nil)
(org-schedule nil (format-time-string "%Y-%m-%d" (current-time)))
(save-excursion
(search-forward ">")
(backward-char)
(insert (concat
" .+"
(read-string "Minimum interval: ")
"/"
(read-string "Maximum interval: "))))
(org-set-property "STYLE" "habit")
(org-set-property "LOGGING" "TODO DONE(!)"))
Admittedly, it’s rather crude, but I thought that a quick-and-dirty hack like this, to be used maybe a dozen times at first and then once a few days or even weeks, need not have fancy things like history of repeater intervals etc. (Also, read-string in the middle of a function is indeed ugly – it really should be made into an argument with a suitable interactive clause. I did not have enough time/patience to look up and recall its syntax again, though…)
Have fun tracking your habits!
Edit: deleted the exclamation mark after TODO, which introduced a bug.