僕は普段の作業を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)
非対称になってしまいますが、とりあえずこれで動作します。
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。