Org-Mode Calendar Notifications
I was wondering if I could create notifications for my calendar entries in org-mode on Windows and Linux and it turns out, that the setup isn’t that complex.
The appt
module can display notifications for specific appointments, so we
need to export org-mode entries as appointments:
(require 'appt)
(appt-activate t)
(defun fw/org-agenda-to-appt ()
"Rebuild all appt reminders using org."
(interactive)
(setq appt-time-msg-list nil)
(org-agenda-to-appt))
(fw/org-agenda-to-appt)
(add-hook 'org-agenda-finalize-hook 'fw/org-agenda-to-appt)
The above snippet will create appointments when Emacs boots up and every time
when we open org-agenda
. The appt
notifications appear in a mini-buffer,
which disappears after a few seconds. We can get persistent notifications by
using a different “backend” such as the Windows 10 notifications area (via the
PowerShell module BurntToast) or the Linux command line tool
notify-send
:
(defun fw/appt-disp-linux (min-to-app new-time msg)
"A custom `appt-disp-window-function' which uses `notifications'."
(require 'notifications)
(notifications-notify :title msg :timeout 0))
(defun fw/appt-disp-windows (min-to-app new-time msg)
"A custom `appt-disp-window-function' which uses the PowerShell module 'BurntToast'"
(shell-command
(concat "powershell.exe -Command \"New-BurntToastNotification -Text '" msg "'\"")))
(when (eq system-type 'gnu/linux)
(progn
(setq appt-display-format 'window)
(setq appt-disp-window-function (function fw/appt-disp-linux))
(setq appt-delete-window-function (lambda nil))))
(when (eq system-type 'windows-nt)
(progn
(setq appt-display-format 'window)
(setq appt-disp-window-function (function fw/appt-disp-windows))
(setq appt-delete-window-function (lambda nil))))