実践 org-mode 〜terminal-notifier でスケジューリングしたタスクを画面に通知する(Mac OS 向け)〜

org-mode

前回の記事では、タスクをスケジューリングする方法について説明していきました!今回の記事では、org-mode でスケジュールされた時間が近づくと、画面上に通知を出す方法について説明していきます!この機能を使うことで予定が近づくと以下の動画のように通知してくれます!

terminal-notifier の導入

terminal-notifier は mac OS の通知センターにメッセージを送信するユーティリティです。今回は org-mode でスケジュールされたタスクの10分前と、開始時間になった時に、terminal-notifier を発火することで通知をします。

terminal-notifier は homebrew でも提供されているので、以下のコマンドを実行すれば簡単に導入することが可能です。

brew install terminal-notifier

導入したら terminal-notifier による通知を許可しましょう。システム環境設定 > 通知 から terminal-notifier のところで、通知を許可のトグルを ON にしましょう。通知スタイルはバナーもしくは、通知パネルを選択してください。その他の設定についてはデフォルトで問題ありませんが、お好みで設定を変更してください。

次に org-

mode からの通知を設定していく前に terminal-notifier の基本的な操作について確認して行きましょう。以下が主要なオプションについての説明になります。他にも設定できる項目がありますので、詳しくは terminal-nortifier の github レポジトリを確認すると良いでしょう。

-message通知されるメッセージ本文(必須
-title通知されるメッセージのタイトル
-subtitle通知されるメッセージのサブタイトル
-appIcon通知されるアイコンの画像パス
(デフォルトはターミナルのアイコン)
-sound通知時の音声を設定
(設定できる音の種類は、サウンド > サウンドエフェクトで確認可能)
-activate通知元のアプリを設定
(通知をクリックした時にそのアプリが開かれる)

試しに以下のようにコマンドを実行すると、画像の形で通知が発火します。

❯ terminal-notifier -title "タイトル" -message " メッセージ" -subtitle "サブタイトル"

Emacs に通知設定を追加する

それでは実際に emacs に terminal-notifier を発火させるための設定を書いていきましょう。.emacs.d/init.el に、Vimユーザでも Org mode を使いたい!Spacemacs をインストールする の記事に従って spacemacs のインストールを行った方は、.spacemacs.d/init.el に設定を追加していきます。追加する設定は以下になります。まずは terminal-notifier を実行するための関数を定義していきます。my-appt-send-nortification という関数に実際に実行するshellコマンドが記述されています。この関数は、Emacs の appt-disp-window 関数が呼び出された時に、合わせて my-appt-display を通して実行されます。appt-disp-window は ダイヤリーエントリーがある場合に、スケジューリングされた日時が近づくと自動的に発火して、Emacs 上に警告を出してくれるというものです。このダイヤリーエントリーには Org-agenda に追加したスケジュールも追加することができます。

;; shellコマンドを使って、terminal-nortification を実行する関数
(defvar my-notifier-path "terminal-notifier")  
(defun my-appt-send-notification (title msg)
  (shell-command 
   (concat my-notifier-path " -message " msg
           " -title " title
           " -active org.gnu.Emacs"
           " -sound Funk")))
(defun my-appt-display (min-to-app new-time msg)
  (my-appt-send-notification 
    (format "'Appointment in %s minutes'" min-to-app)
    (format "'%s'" msg)))

;; appt-disp-window 実行時に合わせて my-appt-display 関数を実行する。
(defun my-appt-display (min-to-app new-time msg)
  (my-appt-send-notification 
    (format "'Appointment in %s minutes'" min-to-app)
    (format "'%s'" msg)))
(advice-add 'appt-disp-window :before 'my-appt-display)

ですので Org-agenda に追加したスケジュールをダイヤリーエントリーに追加する設定を記述していきましょう。以下の設定では Emacs を立ち上げた時、1時間おき、保存を行った時の 3つのタイミングでダイヤリーエントリーへの追加を行っています。

;; Emacs を立ち上げた時にダイヤリーエントリに追加する
(org-agenda-to-appt)
;; 1時間おきにダイヤリーエントリーに追加する
(run-at-time "24:01" 3600 'org-agenda-to-appt)
;; 保存したときにダイヤリーエントリーに追加する
(add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt)
(add-hook 'org-mode-hook
      (lambda() (add-hook 'before-save-hook
                          'org-agenda-to-appt t)))

最後に appt-disp-window の実行に関する設定を記述していきましょう。それぞれの設定値の意味は以下の通りです。

  • appt-time-msg-list … 本日のタスクのリスト
    (nil を設定して前日までのタスクを初期化しておく)
  • appt-display-interval … 通知を出す間隔(以下の例では 10 分おきに通知される)
  • appt-message-warning-time … 予定の開始何分前から通知を開始するか
  • appt-display-format … 通知を実行するときにどのモードを実行するか
    (window を設定することで、appt-disp-window を実行してくれるようになる
(setq
  appt-time-msg-list nil
  appt-display-interval '10
  appt-message-warning-time '10
  appt-display-format 'window)

最後に Emacs の起動時に通知を有効にするコマンドを記述します。

(appt-activate 1)  

ちなみにこの設定ですが、こちらの github レポジトリを参考にしています => squiter/notifications.md

最後に

以上が org-mode のスケジューリングされたタスクを MacOS の通知センターに表示させる方法になります!設定の部分は Emacs-lisp で書かれており少々複雑ではありましたが、特にこだわりがなかればそのままコピぺすれば OK かと思います。通知機能を使えばもうミーティングなどの外せない用事を忘れてしまうことももうありません!ぜひ活用して皆さんの仕事環境が少しでも快適になればと思います!

コメント

タイトルとURLをコピーしました