LoginSignup
20
17

More than 5 years have passed since last update.

Emacs+org-mode で楽して分報を続けるための設定

Last updated at Posted at 2016-02-20

近ごろ、社内の Slack で分報が流行り始めていて、そのビッグウェーブに乗ってみたんですが三日くらいで飽きてしまいました。
たまに集中力が切れた時や詰まった時に呟く以外は「〜着手し始めた」みたいなのが大部分になってしまっていて、org-mode で TODO 管理して作業時間計測とかもしている身からすると二度手間で面倒くさくなってしまいました。
というわけで、org-mode で clock-in した時に勝手に呟いてくれるような設定をしました。

ちなみに、パッケージとして https://github.com/saidie/org-minrepo-slack に置いてみました。

Slack に投稿する関数

Emacs 用の Slack クライアントはいくつかあるようなのですが、まともなのを選定したり Slack 連携させたりとかが面倒くさかったので、cURL で Webhook を使って送るようにしました。

(defun oms/send-to-slack (url text &optional options)
  (let ((payload (json-encode (plist-put (or options '()) :text text))))
    (call-process "curl" nil 0 nil "-X" "POST"
                  "-H" "Content-Type: application/json" "--data" payload url)))

Webhook URL、投稿内容 (とオプション) を指定すると Slack に投稿してくれます。オプションは Webhook のパラメータをプロパティーリストで渡せるので、例えば、以下のように使えます。

(oms/send-to-slack "https://hooks.slack.com/services/XXXXXXXXXXXXXXXX" "testだよ" '(:channel "#test"))

clock-in したら Slack に投稿

タスクに clock-in したら Slack に投稿したいわけですが、clock-in したけどやっぱ他のタスク先にやろうとした時や操作ミスした時とか、即座に投稿されてしまうのはやや使いにくい感があります。また、家でやるような (センシティブな) タスクに clock-in した時に社内 Slack に通知されてしまうというのも避けたい所です。
というわけで、以下のような機能も盛り込みました。

  • clock-in してある程度継続してタスクをやっていたら投稿
  • 特定のタグ (デフォルトは @OFFICE) などがついているタスクのみ投稿

実装としては、以下の様な感じになります。

;; clock-in からこの時間経過しても同じタスクをやっていたら投稿する
(defvar oms/notification-delay "3 min")

;; 投稿するテキストを返す関数
(defvar oms/text-function
  (lambda () (format "`%s` を始めた" org-clock-heading)))

;; 通知を送るべきタスクかをチェックする関数
(defvar oms/task-select-function
  (lambda ()
    (let ((tags (nth 5 (org-heading-components))))
      (and tags (string-match ":@OFFICE:" tags)))))

;; 投稿する関数
;; clock-in した時と同じタスクをやっていた時のみ
(defun oms/send-notification (old-task)
  (when (and (org-clocking-p)
             (eq old-task org-clock-current-task))
    (oms/send-to-slack oms/slack-webhook-url
                       (funcall oms/text-function)
                       oms/slack-options)))

;; clock-in した時に呼ばれる関数
;; 通知すべきタスクの場合は指定時間後に oms/send-notification を呼ぶようにする
(defun oms/register-notification ()
  (let ((current-task org-clock-current-task))
    (when (and (stringp oms/slack-webhook-url)
               (funcall oms/task-select-function))
      (message "will notify to Slack")
      (run-at-time oms/notification-delay nil
                   'oms/send-notification current-task))))

で、最後にこれを hook に登録すれば完成です。

(add-hook 'org-clock-in-hook 'oms/register-notification)

結果

何に着手しているかを書かなくて済むようになって、分報が大分気楽になりました。そして、呟きや嘆きに工数を割けるようになりましたとさ。

org-minrepo-slack.png

つぶやき

  • clock-out した時には特に何も出さないというライフハック
  • 今後 DONE にしたら投稿するようにもしたい
20
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
17