ぐるっとぐりっど

日曜プログラマがいろいろ試してみたことを、後の自分のためにまとめておく場所

org-modeで計時(Clocking)する際に特定のTODOキーワードの場合だけ状態変更する

この記事は、.emacs Advent Calendar 2016の18日目の記事です。

org-modeの小ネタです。

はじめに

org-modeではTODO管理の中で、そのタスクにかかった時間を計測することができるようになっています。

C-c C-x C-i→時間計測を開始する(clock-in)

C-c C-x C-o→時間計測を終了する(clock-out)

で、便利なことに、clock-inした場合に、自動でTODOキーワードを変更することができます。

;; 時間計測を開始したら自動でSTARTED状態にする
(setq org-clock-in-switch-to-state "STARTED")

これをやっておくと、未着手のTODOを着手(時間計測開始)すると、STARETEDになり、着手済か未着手かがわかりやすくなるというわけです。

f:id:grugrut:20161217161555p:plain

Aプロジェクトを開始した状態。AプロジェクトはSTARTEDと表示され、BプロジェクトはTODOのままになっている。また、モードラインには計時しているタスクが表示されるのも便利。


org-captureを活用すると、タスクに着手している際に割り込み(電話等)が入って中断された場合でも、割り込まれたものも含め簡単に計時することができます。詳しくはこちらの過去記事をご覧ください。

grugrut.hatenablog.jp

このやりかたで困ったこと

そんなこんなでやってたのですが、困ったことがおきました。

それがこれです。

f:id:grugrut:20161217162528p:plain

本当のTODOも、一時的に実施していたTODOで無い作業も、ミーティングのような計時だけしておきたいものもすべて、clock-inすると皆STARTED状態になってしまって、何が本当のTODOなのかわからなくなってしまうのです(今回は例として適当に作りましたが、実際はもっと雑多なものが30個近くたまってしまいました)。

本当は、GTDでは日次レビュー、週次レビューは基本なので、その中で不要なものを完了状態にしていくのが基本なのですが、そうはいっても、これだけたまると片付けるのも面倒だし、そもそも計時だけしたいものをいちいち完了に変更するのも面倒だし、ということで、モチベーションがかなり下がってしまいました。

計時だけして、TODOでないものは、TODOキーワードいらないようにできないだろうか、と虫の良いことを考えていました。

そんな都合のよいやりかた

実はorg-clock-in-switch-to-stateには関数を指定することができます(できること自体は知ってたけど、わざわざそれをする意味がわかってなかった)。

;; 時間計測を開始したらSTARTED状態に
(setq org-clock-in-switch-to-state 'my-org-clock-in-switch-to-state)

;;; TODOの場合だけSTARTEDに変更する
(defun my-org-clock-in-switch-to-state (state)
  (when (or (string-equal state "TODO")
            (string-equal state "STARTED"))
    "STARTED"))

my-org-clock-in-switch-to-stateには前の状態のTODOキーワードが入ってくるので、TODOか既にSTARTEDの場合のみ"STARTED"を返すようになっています(よくよく見直すとSTARTEDを条件に入れる必要ないし、ヒットしない場合はstateをそのまま返したほうがよいのかな?)

そうするとこんな感じで、TODOに設定していない場合は、STRATEDが設定されないので、org-agendaを汚さないで良いかんじ。
f:id:grugrut:20161217163729p:plain

まとめ

他の人の.emacsを読んでて知ったのだけど、なぜそんな設定をしているのか想像しながら読むと勉強になるね

明日はtakaxpさんの「高速起動用ミニマム*scratch*バッファ」の予定です。楽しみですね。