私は元々注意散漫なところがあって、些細なことで集中が途切れてしまう。 そのため集中力を維持するためにいろいろな工夫をしている。 例えば、スマホやチャットの通知は切っているし、関連の少ない情報は目に入らないようにしている。 エディタを簡素化し、モードラインも消し、どうしても集中したいときは、 インターネットへのアクセスができない状態にして作業を行っている。

しかし必要のない情報は目に入ってきて注意を引いてくる。 その結果、いつのまにか今やっているタスクの内容を忘れてしまう。

忘れてしまうのは仕方がないとして短かい時間でやっていたタスクを思いだすことはできないだろうか。 今やっているタスクが何かを思い出すタイミングを増やせれば、脱線してしまっていた作業を中断し本来すべき作業に戻れる。 そのために本来すべきタスクの情報を目に付く機会を増やすのがよさそうと考えて、エディタをカスタマイズすることにした。

Emacsのフレームタイトルに現在作業中のタスク名を表示する

タスクの管理はorg-modeで実施していて、作業時間の計測にorg-clockを用いている。 つまり今集中するべきタスクは、今org-clock-inしているタスクと言える。 今回はEmacsのフレームタイトルに現在org-clock-inしているタスク名を表示するようにカスタマイズする。

関連する変数やhook

frame-title-format

フレームのタイトルを保持する値

org-clock-current-task

現在org-clock-inしているタスクの文字列。

org-clock-in

org-clock-inするための関数。

org-clock-in-hook

org-clock-inの呼出し時の最後に呼び出されるhook

org-clock-out

org-clock-outするための関数。

org-clock-out-hook

org-clock-outの呼出し時の最後に呼び出されるhook

実装

org-clock-in 及び org-clock-out された時に実行されるフックに、自作のフレームタイトルを変更する関数を設定した。 org-clock-inしていない時はフレームタイトルにはバッファ名を表示するようにした。

(defun change-frame-title-to-org-clock-current-task-name ()
  "Change frame title to org- clock current task name.

Display current buffer name if not clock in now."
  (interactive)
  (setq frame-title-format (or org-clock-current-task "%b")))

(add-hook 'org-clock-in-hook #'change-frame-title-to-org-clock-current-task-name)
(add-hook 'org-clock-out-hook #'change-frame-title-to-org-clock-current-task-name)

できあがり

https://res.cloudinary.com/symdon/image/upload/v1652143036/blog.symdon.info/1652142295/emacs-frame-title.png

ミニバッファに現在作業中のタスク名を表示する

フレームタイトルに現在作業中のタスク名を表示するようにしたが、 Emacsを全画面表示しているとフレームタイトルは見えないことも多い。 ただ現在作業中のタスクは忘れてはいけない。 煮詰って手が止まった時に何度でもタスクが何かを思い出せるようにする。

手が止まって煮詰っている時、Emacsはアイドル状態になっていると言える。 そこでアイドル状態になったら作業中のタスク名をミニバッファに表示するようにする。

関連する関数や変数やhook

minibuffer-message

ミニバッファにメッセージを表示する。次の入力があると、この文字は消える。

minibuffer-message-timeout

ミニバッファにメッセージを表示する秒数。nilにすると無限に表示する。

org-clock-current-task

現在org-clock-inしているタスクの文字列。

run-with-idle-timer

Emacsがアイドル状態の時に呼び出されるタイマーを登録する。

実装

まずは作業中のタスク名をミニバッファに表示する関数を実装する。

(defun display-current-task-name-in-to-mini-buffer ()
  "Display current task name in to mini buffer"
  (interactive)
  (when org-clock-current-task
    (let ((minibuffer-message-timeout nil))
      (minibuffer-message org-clock-current-task))))

この display-current-task-name-in-to-mini-buffer 関数をrun-with-idle-timerに渡し、 アイドル時に呼び出すようにする。

(setq display-current-task-name-in-to-mini-buffer-timer
      (run-with-idle-timer 3 t #'display-current-task-name-in-to-mini-buffer))

できあがり

https://res.cloudinary.com/symdon/image/upload/v1652312121/blog.symdon.info/1652142295/demo_pvvynl.gif