给 org-pomodoro 增加桌面通知功能

因为我不是那么追求对 Emacs 使用的极致,在使用 org-mode 作为 GTD 工具的时候,会跳出 Emacs 使用别的工具。因此经常会因为看不到 org-pomodoro 的提示而忘记休息、开启新的番茄时钟。 那么,如果能让番茄时钟在工作、休息结束时跳出桌面通知,那就非常方便了。

实现 Emacs 和系统交互

想要让 org-pomodoro 在工作、休息结束时通知操作系统,我们就需要一个 中间件 来作为 EmacsOS 交流的桥梁。幸运的是,这个桥梁已经有人做好啦,我查找到的资料有两个选择

  1. terminal-notifier: 一个开源的命令行消息通知插件。但是只支持 Mac OS X
  2. Growl: 一个收费的软件,支持 Mac OS X,同时有Windows 版(我不清楚是否收费)和一个重新实现的开源的Linux 版

我使用的是 Mac,虽然 Growl 价格只有 25RMB,但是我更倾向使用开源软件。

配置

这里我介绍一下使用 terminal-notifier 的配置方法,如果你使用 Growl 可以参考子龙山人 的配置。

安装 terminal-notifier

安装 terminal-notifier 非常简单,只需要两步。

1
2
brew install terminal-notifier
brew linkapps

定义通知函数

1
2
3
4
5
6
7
8
(defun notify-osx (title message)   
(call-process "terminal-notifier"
nil 0 nil
"-group" "Emacs"
"-title" title
"-sender" "org.gnu.Emacs"
"-message" message
"-activate" "oeg.gnu.Emacs"))

定制通知内容

1
2
3
4
5
6
7
8
9
10
11
12
(add-hook 'org-pomodoro-finished-hook
(lambda ()
(notify-osx "Pomodoro completed!" "Time for a break.")))
(add-hook 'org-pomodoro-break-finished-hook
(lambda ()
(notify-osx "Pomodoro Short Break Finished" "Ready for Another?")))
(add-hook 'org-pomodoro-long-break-finished-hook
(lambda ()
(notify-osx "Pomodoro Long Break Finished" "Ready for Another?")))
(add-hook 'org-pomodoro-killed-hook
(lambda ()
(notify-osx "Pomodoro Killed" "One does not simply kill a pomodoro!")))

效果

1