¿Buenos métodos para configurar alarmas (audio + visual) activadas por eventos en modo org?

35

Me gustaría activar las alarmas en función de los eventos del modo de organización asociados con horas específicas (u horas de inicio). Idealmente, estos serían audio y visuales, y podrían personalizarse hasta cierto punto. Solía ​​usar Sauron, pero ya no puedo hacer que funcione con eventos en modo org (o notificaciones por correo electrónico). ¿Cuáles son otros buenos métodos?

(Estoy particularmente interesado en que la notificación se muestre no solo en la pantalla a través del demonio de notificaciones, sino que también se hable (texto a voz). Estoy en Linux).

emacsomancer
fuente
@Constantine: esto me parece bastante diferente. No estoy pidiendo herramientas para hacer esto, sino soluciones listas para usar que ya existen. Además, en realidad no estoy interesado en las alarmas para los PLAZOS, sino en los eventos asociados con los tiempos (de inicio).
emacsomancer
OKAY; Edité mi comentario. (Creo que ambos estamos de acuerdo en que su pregunta está relacionada con la que he vinculado.)
Constantino
2
Si ha utilizado el sistema incorporado appt para importar citas de sus archivos de agenda de la organización utilizando la función org-agenda-to-appt. Luego, puede personalizarlo appt-disp-window-functionpara notificarle de la manera que desee (que puede incluir llamar a programas externos).
Iqbal Ansari

Respuestas:

15

Estoy bastante contento con el sistema que uso, que hace (creo) exactamente lo que quieres. Tiene dos partes: una parte de Emacs que usa appt.el para programar los recordatorios y un pequeño programa de shell (estoy usando Linux) que crea la notificación emergente + sonido. Aquí comparto el código para ambas partes.

A) Código en ~ / .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) Código en ~ / bin / appt-notify

#!/bin/sh

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

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

Para recibir notificaciones de voz, puede reemplazar la última línea (reproducir) con lo siguiente:

espeak "Appointment in $TIME minutes: $MSG"
Scaramouche
fuente
Agregué un caso para las aplicaciones de actualización automática al salir de org-agenda: ; (4) ... Quitting org-agenda. (advice-add 'org-agenda-quit :after #'hw-org-agenda-to-appt)
holocronweaver
Nota: la actualización alrededor de la medianoche es importante para los noctámbulos, ya que org-agenda-to-apptsolo crea aplicaciones para el día actual.
holocronweaver
+1 Esto es genial. Gracias por compartir. He modificado esto un poco para usar alert.el en su lugar. Sin embargo, una pregunta: ¿alguna vez ha tenido suerte de que funcione con la propiedad de organización "APPT_WARNTIME" para establecer un tiempo de advertencia personalizado para cada evento? Parece que no puedo hacer que funcione.
Joseph R.
11

Puede usar notificaciones en 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
fuente
13
Esto parece muy útil. ¿Sabes cómo integrarlo org-mode?
erikstokes
2

Esto es lo que terminé inventando:

;;; 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))

No es diferente a la configuración de scaramouche.

emacsomancer
fuente