org-modeのクロックテーブルの%表示を直してみた


追記(2017.03.31)

下の関数を適用しなくても、次のコードをinit.elに入れることでクロックテーブルの集計が時間単位となり、%表示が正常化することがわかりました。こっちのほうが楽なのでみなさんどうぞ。ううぅ…。

init.el
(setq org-time-clocksum-format '(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t))

こちらを参考にしました。この場を借りてお礼申し上げます。

なにをしたか

  • org-modeで使用できる作業時間のまとめテーブル(クロックテーブル)には、全体の作業時間に対して各項目がどのくらいの割合か表示してくれる機能がある
  • しかし、合計作業時間が1日以上だとうまく働かなかった
    • 日数を読み込んでくれないのが原因
  • これを何日でも対応できるようにした(gist)
    • 初めてemacs-lispをまともにいじって楽しかったから勢いで投稿

はじめに

Emacsには、org-modeというそれはそれは素晴らしい機能があり、タスク管理のほかタスク消化にかかった時間なども計測可能です。わたしはもっぱらアニメ試聴履歴の記録職場での工数管理に使用しています。

こうした工数を集計するのにとても便利なのがクロックテーブル機能です。これはorg-modeの動的テーブルを利用して、項目ごとの作業時間を自動的に集計してくれる優れものです(C-c C-x C-rで出せます)。さらにヘッダーに:formula %といれることで、作業時間が全体の何割だったかを集計してくれます。大変便利なのですが、これには一つ問題があり、合計作業時間が1日以上あると計算がおかしなことになります。私はもっぱら週次ないしは月次で集計するので、かなり問題です。再現した例を下に示しています。

全体の時間が2日12時間59分、けものフレンズ1話視聴時間が1日2時間で、全体の42.6%になるはずですが、この図では15.4%にしかなっていません。これは、関数org-clock-time%が行う計算の過程で日以上の情報が無視されており、単純に12:59 vs 02:00という計算になっているためです。そこで今回はこれを修正することに決めました。

ソース

ソースコードはこちらに上げました。

使用方法

gistの方にも書いてありますが、ソースをそのままinit.elにつっこんでeval-bufferすればいいです。nadvice.elでorg-clock-time%を上書きしているので、クロックテーブル側の変更は必要ないです。もし元に戻したくなった場合は、advice-removeを評価してあげる必要があります。

適用後は下の通り、うまく百分率が計算されています。捗る!

余談

ソースははじめ全然違う形で書いていたけど、オリジナルを踏襲した方がいいかと思い書き直してる。ぶっちゃけ小さいExcel VBAマクロはよく作るけど、こういうちゃんとしたアプリケーションに(間接的とはいえ)手を加えるということは初めてなのでお作法がよくわからない…。たぶんこういうのはadviceでいつでも変更を取り消せるようにするのが一番いい、はずだと思う。

あと、名前とかライセンス(いるのか?)の文言はこちらを参考にしました。