org-modeでclock-inしているタスクをMacのメニューバーに表示する


普段のタスク管理にはorg-modeを使用しています。
org-modeには素晴らしいタスクの時間計測機能がついているのですが、
タスク自体はEmacs以外で行うことが多いのもあり
clock-inするのを忘れてタスクに取り掛かってしまったり、
逆にclock-outするのを忘れて次のタスクに取り掛かってしまうことがよくあります。

そこで現在clock-inしているタスクが何か一目でわかるように
BitBar というアプリケーションを使って
メニューバーに現在のタスクと経過時間を表示させてみました。

BitBar のインストール

BitBarとはMacのメニューバーに任意の情報を表示することができるアプリケーションです。

brew cask を用いてインストールすることができます。

$ brew cask install bitbar

インストールが完了し、アプリを起動したらメニューバーの BitBar をクリックし、
Change Plugin Folder で任意のディレクトリを指定します

BitBar プラグインの追加

先程指定したディレクトリに以下のプラグインを追加します

BitBarのプラグイン名の命名規則は以下のようになっています

{任意の名前}.{更新間隔}.{拡張子}

今回は5秒間隔で実行するように設定してみました

org_clockin_task_bitbar_plugin.5s.sh
#!/bin/bash

if [ -e ~/.clockin_task ]; then
  task_name=`cat ~/.clockin_task | cut -f 2`
  start_time=`cat ~/.clockin_task | cut -f 1`

  elapsed=$(expr `date +%s` - $start_time)

  h=$(expr $elapsed / 3600)
  m=$(expr $elapsed % 3600 / 60)

  disph=`printf %02d $h`
  dispm=`printf %02d $m`

  echo ":hourglass_flowing_sand: [$disph:$dispm] $task_name"

else
  echo ":coffee: Break Time"
fi

後ほど記述しますがorg-modeでclockinしたタスクの開始時間(unixtime)とタスク名を
~/.clockin_task に出力するようにしています

org-clock-hookの設定

clock-inした際にタスク名とタスクの開始時間を ~/.clockin_taskに出力し、
clock-outまたはclock-cancelした際に~/.clockin_taskを削除するように設定します

  (defvar clockin-task-file "~/.clockin_task")
  (defun write-clockin-task-file ()
    (with-temp-buffer
      (insert (concat (format-time-string "%s" org-clock-start-time)
                      "\t"
                      org-clock-heading))
      (write-region (point-min) (point-max) clockin-task-file))
    )

  (defun delete-clockin-task-file ()
    (delete-file clockin-task-file))

  (add-hook 'org-clock-in-hook 'write-clockin-task-file)
  (add-hook 'org-clock-out-hook 'delete-clockin-task-file)
  (add-hook 'org-clock-cancel-hook 'delete-clockin-task-file)

適当な関数を作成し、org-clock-*-hook に追加しています

今後の課題とか

タスクをクリックしたら本日やる予定のタスクの一覧とか並べられたらいいなーとか思ったり