僕は普段の作業をorg-modeのclock機能を使って管理しています。

メルマガ登録者 限定特典で僕の秘技「org習慣仕事術」もclock機能をシンプルかつ効果的に使う方法です。
この方法は絶大ですので、ぜひとも登録していただけると嬉しいです。

僕はいつも音楽をかけながら作業をしていますが、タスクによっては音楽を一時停止したいこともあります。
そこで、タスクの見出しのタグに「pause」が含まれている場合は、そのタスクを開始したら音楽を一時停止し、終了したら再生するような設定にしています。
多くのメディアプレイヤーではシェルから再生中の音楽・動画の一時停止機能があります。

そこで以下のようなコードを書きました。

(defun org-clock-get-tags ()
  "Get the list of tags specified in the current clocking task."
  (save-excursion
    (set-buffer (marker-buffer org-clock-marker))
    (goto-char org-clock-marker)
    (org-get-tags-at)))
(defun pause-music ()
  (interactive)
  (shell-command-to-string "音楽を停止するコマンド(各自で)"))
(defun org-clock-in/out-hook--pause-music (&rest ignore)
  (when (member "pause" (org-clock-get-tags))
    (pause-music)))

ここまでは問題ありません。

最初は以下のように設定しましたが、ここからが問題です。

(add-hook 'org-clock-in-hook 'org-clock-in/out-hook--pause-music)
(add-hook 'org-clock-out-hook 'org-clock-in/out-hook--pause-music)

確かにclock-inしたときには音楽は止まるのですが、
clock-outしてたときにエラーになります。
その原因は
org-clock-out-hookが実行されるのはclock-out後である
からです。
そのため (org-clock-get-tags) でclock-inされてないとエラーになります。

member: Wrong type argument: stringp, nil
org-agenda-clock-out: No running clock

かといって、clock-outする直前に実行するフックは存在しません。
そういう場合はadviceを使う ことになります。

(add-hook 'org-clock-in-hook 'org-clock-in/out-hook--pause-music)
;; org-clock-out-hookではすでにclock out後なのでclock out前に実行する必要あり
(advice-add 'org-clock-out :before 'org-clock-in/out-hook--pause-music)

非対称になってしまいますが、とりあえずこれで動作します。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。