De bonnes méthodes pour configurer les alarmes (audio + visuel) déclenchées par des événements en mode org?

35

Je souhaite que les alarmes soient déclenchées en fonction d'événements en mode org associés à des heures spécifiques (ou à des heures de début). Idéalement, ces éléments seraient audio et visuels et pourront être personnalisés dans une certaine mesure. J'avais l'habitude d'utiliser Sauron, mais je ne peux plus le faire fonctionner avec des événements en mode org (ou des notifications par e-mail). Quelles sont les autres bonnes méthodes?

(Je souhaite particulièrement que la notification soit affichée non seulement à l'écran via le démon de notification, mais également parlée (synthèse vocale). Je suis sous Linux.)

Emacsomancer
la source
@ Constantine - cela me semble plutôt différent. Je ne demande pas d'outils pour ce faire, mais plutôt des solutions toutes faites qui existent déjà. De plus, je ne m'intéresse pas aux alarmes pour les DEADLINEs, mais plutôt aux événements associés aux heures (de début).
Emacsomancer
D'ACCORD; J'ai édité mon commentaire. (Je pense que nous sommes tous les deux d'accord pour dire que votre question est liée à celle à laquelle j'ai lié.)
Constantine
2
Si vous avez utilisé le système d'application intégré pour importer des rendez-vous à partir de vos fichiers org-agenda à l'aide de la fonction org-agenda-to-appt. Ensuite, vous pouvez personnaliser appt-disp-window-functionpour vous informer comme vous le souhaitez (ce qui peut inclure l'appel de programmes externes).
Iqbal Ansari

Réponses:

15

Je suis assez satisfait du système que j'utilise, qui fait (je pense) exactement ce que vous voulez. Il comporte deux parties: une partie Emacs qui utilise appt.el pour planifier les rappels et un petit programme shell (j'utilise Linux) qui crée la notification contextuelle + sonore. Ici, je partage le code pour les deux parties.

A) Code dans ~ / .emacs.d / init.el

(require 'appt)
(appt-activate t)

(setq appt-message-warning-time 5) ; Show notification 5 minutes before event
(setq appt-display-interval appt-message-warning-time) ; Disable multiple reminders
(setq appt-display-mode-line nil)

; Use appointment data from org-mode
(defun my-org-agenda-to-appt ()
  (interactive)
  (setq appt-time-msg-list nil)
  (org-agenda-to-appt))

; Update alarms when...
; (1) ... Starting Emacs
(my-org-agenda-to-appt)

; (2) ... Everyday at 12:05am (useful in case you keep Emacs always on)
(run-at-time "12:05am" (* 24 3600) 'my-org-agenda-to-appt)

; (3) ... When TODO.txt is saved
(add-hook 'after-save-hook
          '(lambda ()
             (if (string= (buffer-file-name) (concat (getenv "HOME") "/ideas/TODO.txt"))
                 (my-org-agenda-to-appt))))

; Display appointments as a window manager notification
(setq appt-disp-window-function 'my-appt-display)
(setq appt-delete-window-function (lambda () t))

(setq my-appt-notification-app (concat (getenv "HOME") "/bin/appt-notification"))

(defun my-appt-display (min-to-app new-time msg)
  (if (atom min-to-app)
    (start-process "my-appt-notification-app" nil my-appt-notification-app min-to-app msg)
  (dolist (i (number-sequence 0 (1- (length min-to-app))))
    (start-process "my-appt-notification-app" nil my-appt-notification-app (nth i min-to-app) (nth i msg)))))

B) Code dans ~ / bin / appt-notification

#!/bin/sh

TIME="$1"
MSG="$2"

notify-send -t 0 "<br>Appointment in $TIME minutes:<br>$MSG<br>"
play "~/bin/alarm.wav"

Pour obtenir des notifications vocales, vous pouvez remplacer la dernière ligne (lecture) par ce qui suit:

espeak "Appointment in $TIME minutes: $MSG"
scaramouche
la source
J'ai ajouté un cas pour la mise à jour automatique des applications lorsque vous quittez org-agenda: ; (4) ... Quitting org-agenda. (advice-add 'org-agenda-quit :after #'hw-org-agenda-to-appt)
holocronweaver
Remarque: la mise à jour vers minuit est importante pour les noctambules, car elle org-agenda-to-apptne crée que des appts pour le jour en cours.
holocronweaver
+1 c'est génial. Merci pour le partage. J'ai un peu modifié cela pour utiliser alert.el à la place. Une question cependant: avez-vous déjà eu de la chance de l'utiliser avec la propriété org "APPT_WARNTIME" pour définir un délai d'avertissement personnalisé pour chaque événement? Je n'arrive pas à le faire fonctionner.
Joseph R.
11

Vous pouvez utiliser les notifications dans Emacs> 24:

(require 'notifications)

(notifications-notify :title "Achtung!"
                      :body (format "You have an appointment in %d minutes" 10)
                      :app-name "Emacs: Org"
                      :sound-name "alarm-clock-elapsed")
ungawa
la source
13
Cela semble très utile. Savez-vous comment l'intégrer avec org-mode?
erikstokes
2

C'est ce que j'ai fini par proposer:

;;; org-to-appt

;; based on http://emacs-fu.blogspot.nl/2009/11/showing-pop-ups.html
(defun talky-popup (title msg &optional icon sound)  
  "Show a popup if we're on X, or echo it otherwise; TITLE is the title
of the message, MSG is the context. Optionally, you can provide an ICON and
a sound to be played"

  (interactive)
  ;;verbal warning



  (shell-command
   ;;  (concat "espeak -v mb-en1 -k5 -s125 " "'" title " " msg "'" " --stdout | paplay") ;; use local espeak
   (concat "echo " "'" title "'" " " "'" msg "'" " |text-to-speech en-gb")  ;; use remote Google voices
    ;; text-to-speech is from https://github.com/taylorchu/speech-to-text-text-to-speech
   )
  (if (eq window-system 'x)
    (shell-command (concat "notify-send -u critical -t 1800000  " 

                     (if icon (concat "-i " icon) "")
                     " '" title "' '" msg "'"))
    ;; text only version

    (message (concat title ": " msg))))

;; the appointment notification facility
(setq
  appt-message-warning-time 15 ;; warn 15 min in advance

  appt-display-mode-line t     ;; show in the modeline
  appt-display-format 'window) ;; use our func
(appt-activate 1)              ;; active appt (appointment notification)
(display-time)                 ;; time display is required for this...

 ;; update appt each time agenda opened

(add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt)

;; our little façade-function for talky-popup
 (defun talky-appt-display (min-to-app new-time msg)
    (talky-popup (format "In %s minute(s):" min-to-app) msg 
  ;;    "/usr/share/icons/gnome/32x32/status/appointment-soon.png"   ;; optional icon

  ;;    "/usr/share/sounds/ubuntu/stereo/phone-incoming-call.ogg"    ;; optional sound

        ))
  (setq appt-disp-window-function (function talky-appt-display))

Ce n'est pas différent de l'installation de Scaramouche.

Emacsomancer
la source