« ^ »

今、集中すべき事を忘れないためにしているEmacsでの工夫

所要時間: 約 3分

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

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

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

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