Org-mode-unicorn

Emacsのorg-modeは、作業時間を記録することができます。

スポンサーリンク

できることは次の二通りです。

  • org-timer カウントダウンタイマー
  • org-clock 作業時間の記録

それぞれを連携させることでさらに便利になります。他にもorg-agendaなどという巨大な機能もありますがここでは触れません。

それではorg-timerから。

org-timer カウントダウンタイマー

指定した時間でカウントダウンを行ないます。時間は分単位で指定します。 使うの簡単で、 org-timer-set-timer (ショートカット C-c C-x ; )を実行すると

How many minutes left?

と聞かれるので例えば30と入力すれば30分カウンダウンしてくれます。

カウントダウン中は、モード行に <0:29:15> のような感じで残り時間が表示されます。

時間が来たらミニバッファに通知されます。開始時点でカーソルのあったヘッダタイトルなどが表示されます。

僕としては何か音が鳴ってくれると嬉しいので次のようなhookを書いています。

(add-hook 'org-timer-done-hook
	  (lambda ()
	    (save-excursion
	      (let ((display-buffer-alist '(("\\*Async.*" display-buffer-no-window (nil)))))
	          (async-shell-command "mplayer /home/foobar/sound.mp3")))))

最後の async-shell-command で音を鳴らすために mplayer で適当なアラーム音のmp3ファイルを再生しています。 ひとつ手前の display-buffer-alist の設定は、これがないとmplayerの実行結果の別バッファがそのたびに開いてしまうので、それを抑制するための設定です。

org-clock 作業時間の記録

org-clockは時間の開始と終了を記録する機能です。

何か作業を始めるときに C-c C-x C-i を押して作業開始。終えるときは C-c C-x C-o するだけでそれぞれの時間が現在のorg-modeバッファに記入されます。

org-clockには必ずヘッダ行が必要なので、例えば次のようがヘッダを書いたとします。

  * memo

カーソルをmemoヘッダへ移動してから C-c C-x C-i を押せば、開始時間が記録されます。

  * memo
    CLOCK: [2015-09-12 Sat 23:18]

作業が完了したら、 C-c C-x C-o を実行すれば、現在の時刻が記録されます。

  * memo
    CLOCK: [2015-09-12 Sat 22:18]--[2015-09-12 Sat 22:48] =>  0:30

作業を中断するときも同じように完了して再び開始を繰り返していくだけです。

  * memo
    CLOCK: [2015-09-12 Sat 23:30]
    CLOCK: [2015-09-12 Sat 22:55]--[2015-09-12 Sat 23:20] =>  0:25
    CLOCK: [2015-09-12 Sat 22:18]--[2015-09-12 Sat 22:48] =>  0:30

時間の経過時間も自動で計算してくれるの便利ですね。日時を手動で書きかえて C-c C-c を実行すると再計算しなおしてくれます。

org-timerとorg-clockを連携させる

org-timerとorg-clockはそれぞれ独立した機能になっています。

僕としては、作業時間を記録しつつ、org-timerで制限時間を決めてやる、ということがしたいので、前述の org-timer-done-hook のコードにorg-clockを完了させる処理を追加で入れています。

(add-hook 'org-timer-done-hook
	  (lambda ()
	    (save-excursion
	      (let ((display-buffer-alist '(("\\*Async.*" display-buffer-no-window (nil)))))
	      (if (org-clocking-p)   ; org-clockが実行中なら
		  (org-clock-out))   ; 完了させる
	          (async-shell-command "mplayer ~/Dropbox/jingle_01.mp3")))))

これで、作業の記録開始は手動で行ない、記録の終了はorg-timerで決めた時間が経過したら自動で作業完了、という使いかたができるようになります。

また逆にorg-clockを手動で完了させたときに、動作中のorg-timerをキャンセルしたいので、次のようなhookを書いています。

(add-hook 'org-clock-out-hook
	  (lambda ()
          (if org-timer-countdown-timer
              (org-timer-cancel-timer))))

こうすることで、org-timerとorg-clockの適度な連携が実現できるのでおすすめです。

作業記録はどこに書くべきか?

org-modeで何かの文書を書いている場合、その作業記録自体もその中に書いてしまうのがorg-mode的な考えかたです。

当然、その作業記録は文書そのものとは関係がないので人に見せたくありません。

org-modeのexport機能で何かしらのフォーマットで第三者に見てもらうのに、その作業記録まで入ってしまうのはまずい。

そこでorg-modeでは2種類の回避策があって一つ drawer の中に作業記録をつける方法です。

 * memo
  :LOGBOOK:  
  CLOCK: [2015-09-12 Sat 23:00]--[2015-09-12 Sat 23:10] =>  0:10
  :END:

drawerというのは折り畳み可能なプロパティ設定みたいなものでいろいろorg-modeの設定を保存する仕組みです。 :LOGBOOK:というdrawerが存在している場合は自動でそこに記録されますが、変数 org-clock-into-drawer をカスタマイズすることで挙動は選べます。僕は見た目が苦手なもんで全然使っていないのですが・・・。

もう一つは noexport タグを使う方法。次のように :noexport: タグを追加しておきます。

 * memo          :noexport:
   CLOCK: [2015-09-12 Sat 22:55]--[2015-09-12 Sat 23:20] =>  0:25
   CLOCK: [2015-09-12 Sat 22:18]--[2015-09-12 Sat 22:48] =>  0:30

noexportタグがついたヘッダと中身はexportから除外されます。 org-export-exclude-tags をカスタマイズすることで任意のタグを選べます。