In "how I get work done with Emacs and org-mode" I talked about how I manually switch a task to IN-PROGRESS when I start working on it. It's not a huge inconvenience, but I did wonder if I could configure Emacs to do it for me.

Of course there's a feature for that.

There are two variables that can be used to configure org's behaviour when clocking time:

org-clock-in-switch-to-state
The state to change a task to when clocking in.
org-clock-out-switch-to-state
The state to change to when clocking out.

Both of these variables can either be a string which will be the new state, or they can be a function. If they're a function it must accept ONE parameter - the task's current state - and return the state to switch to.

In practice it looks like this:

;; Always change the task to IN-PROGRESS.
(setq org-clock-in-switch-to-state "IN-PROGRESS")

;; Use a function to decide what to change the state to.
(setq org-clock-in-switch-to-state #'sodaware/switch-task-on-clock-start)

(defun sodaware/switch-task-on-clock-start (task-state)
  "Change a task to 'IN-PROGRESS' when TASK-STATE is 'TODO'."
  (if (string= task-state "TODO")
      "IN-PROGRESS"
      task-state))

It's a small change, but it smooths out a slight wrinkle in my workflow.