読者です 読者をやめる 読者になる 読者になる

ぐるっとぐりっど

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

org-modeで割り込みにも対応した時間記録をとる方法

emacs

はじめに

みんな大好きorg-modeは、単なるアウトラインエディタとしての機能にとどまらず、メモ書き、表計算、タスク管理、その他もろもろに使えるすごいツールだけれども、僕はその中でも、時間管理もできることに魅力を感じていた。ただ、時間管理について簡単な説明はゴロゴロ転がっている中で、急な割り込み(電話がかかってきた、とか、誰かから相談を受けた、とか)に対するイケてる操作方法の紹介がなく、できないものとあきらめていた。

だがしかし

マニュアルだったり、チュートリアルをまじめに読んでいたら、イケてる感じの方法を見つけてしまったので、まとめておこうと思う。

org-mode界隈では(たぶん)有名な以下のドキュメントをもとに、さらっと流してるけどこれイケてんじゃんと思ったところを調査した結果をまとめたものなので、org-modeについて興味がある人は、以下のURLのドキュメントも一読してみることをお勧めします。

http://doc.norang.ca/org-mode.html

時間管理のおさらい

まずは、割り込みを考慮しない時間管理の方法をおさらいしておくと、基本的には、clock-inclock-outの二つのファンクションを使う。

使い方は簡単で、org-modeの開始するタスク(TODOキーワードをつけておく必要は無い)を示すノード上で、C-c C-x C-iと入力 (clock-in)。
すると、ノードに開始時間が自動で挿入され、モードライン(画面下の行)にも、clock-inしたタスク名と今までの計測時間が表示される。

f:id:grugrut:20160313082650p:plain

そして、終了するときや、いったん中断するときは、C-c C-x C-o (clock-out)。これは別にノード上で行う必要はなく、どこでもできる(はず)。
すると、ノードに終了時間と、その作業時間が自動で挿入される。超便利。

f:id:grugrut:20160313083551p:plain

clock-inは何度でもでき、やるたびに作業時間の行が増えていく。ほかにも、集計する機能とかいろいろとあるけど、今回は省略。

割り込みがあったら

で、ここからが本題。

予定調和で進んでいくタスクであれば、例えば、AA業務を開始したらclock-inして、ずっと集中してAA業務に取り組んで、終わったら、clock-outでまったく問題ない。

でも、実際そんなとんとん拍子に行くわけもなく、途中で電話がかかってくる、とか、チームメンバから「ちょっと相談が。。。」とくる、とか、そんなこんなで突発的に時間がつぶれることっていうのは多々ある。そんなこんなもできる限り記録に残しておいて、自分の作業時間や効率なんかを振り返れるようにしておきたい。

これに対応しようとすると、真面目に考えるとめんどくさい。

  1. 今やってるタスクをclock-outする
  2. 割り込まれる内容をタスク管理用のorgファイルに記載する
  3. 割り込まれた内容をclock-inする
  4. 割り込まれた内容に取り組む
  5. 割り込まれた内容が終わったらclock-outする
  6. もとのタスクをclock-inしなおして作業に戻る

このフローには、実はもう少し作業短縮できるところがあるけど、真面目にやるとこんな感じになってしまう。こんなん急な割り込みには対応できないよ。

賢い割り込みの記録方法

org-captureを使うと、このめんどくさいフローが簡単に解決する。まずは準備として、org-capture用のテンプレートに以下を加えておく。

(require 'org-capture)
(setq org-capture-templates
      '(
        ("i" "interrupted task" entry
         (file "~/org/diary.org")
         "* %?\n" :clock-in t :clock-resume t)
       ))

ショートカットキー「"i"の部分」や説明、保存するファイルとノード構成なんかは好みのものに変えてもらって、ポイントは:clock-in:clock-resume。これを設定しておくと、org-captureすると同時に割り込まれたタスクの計時が始まり、C-c C-cで保存すると同時に割り込まれたタスクのclock-outともとのタスクのclock-inが行われる。そのため、さっきのめんどくさいフローが以下で済む。

  1. 割り込みが入ったら、ひとまず、C-c cして、先ほど設定したキャプチャテンプレートを呼び出す(僕の例では、iを使うので、C-c c iとなる)
  2. 割り込まれた内容に取り組む
  3. 割り込まれた内容が終わったら、C-c C-cでorg-captureを保存する
  4. もとのタスクにそのまま戻る

たったこれだけ。org-captureしている間だけ、元のタスクの計時が止まるイメージととらえてもらえればよいのではないかと。

大きなポイントとしては、割り込まれた時に、org-capture(C-c c)までしておけばOkということ。割り込まれたタスクのメモは済んでから残せばよい。

デモ

よりイメージしやすくするため、実際の画面も出すとこんな感じになる。

AA業務をclock-inして(上の行の8:31のほうね)、タスクに取り組んでたら、「ちょっと教えてください」と相談を受ける。そこですかさずorg-capture(C-c c)。

f:id:grugrut:20160313083613p:plain

org-captureのテンプレートの中から、割り込み用のテンプレート「i」を選択する。
すると、画面が分割されて、org-captureの画面が出てくる。上側の画面を見てもらうと、先の画面では計時中だったAA業務がいったんclock-outされていることがわかる。

f:id:grugrut:20160313083725p:plain

そして相談が終わったら、必要に応じてメモを残して、保存(C-c C-c)。すると割り込まれたタスクがclock-outされ、時間の計算が行われ、もとのAA業務が再度clock-inされている。

f:id:grugrut:20160313085226p:plain

まとめ

org-captureのオプションを使うと、簡単に割り込まれたタスクの記録を残せることがわかった。今後の改良点としては、テンプレートの文字列を工夫(いちいちタイトルをつけなくても、あらかじめ、 * [割込]とつけておくとか、タグを設定しておくとか)すると、もっと便利になりそう。

また、org-captureのテンプレートにはもっとほかのオプションもありそうなので、また便利になる機能を見つけたら整理してまとめていきたい。

ほかにも、こんな対処で簡単に処理できるよ!というのがあればぜひ教えてください!(C-u C-c C-x C-iを使う案も考えたんだけど、どうなんでしょ)

エンジニアのための時間管理術

エンジニアのための時間管理術