Metode yang baik untuk mengatur alarm (audio + visual) yang dipicu oleh acara mode-org?

35

Saya ingin alarm dimatikan berdasarkan peristiwa mode-org terkait dengan waktu tertentu (atau waktu mulai). Idealnya ini adalah audio dan visual, dan dapat disesuaikan sampai batas tertentu. Saya biasa menggunakan Sauron, tetapi saya tidak bisa membuatnya berfungsi dengan acara mode-org (atau pemberitahuan email) lagi. Apa metode bagus lainnya?

(Saya sangat tertarik untuk membuat notifikasi ditampilkan tidak hanya di layar melalui daemon notifikasi, tetapi juga diucapkan (text-to-speech). Saya di Linux.)

emacsomancer
sumber
@Constantine - ini sepertinya agak berbeda dengan saya. Saya tidak meminta alat untuk membuat ini, melainkan solusi siap pakai yang sudah ada. Lebih jauh, saya sebenarnya tertarik bukan pada alarm untuk DEADLINEs, melainkan untuk acara yang terkait dengan waktu (mulai).
emacsomancer
BAIK; Saya mengedit komentar saya. (Saya pikir kami berdua sepakat bahwa pertanyaan Anda terkait dengan pertanyaan yang saya tautkan.)
Constantine
2
Jika Anda telah menggunakan sistem appt bawaan untuk mengimpor janji dari file org-agenda Anda menggunakan fungsi org-agenda-to-appt. Kemudian Anda dapat menyesuaikan appt-disp-window-functionuntuk memberi tahu Anda seperti yang Anda inginkan (yang dapat mencakup pemanggilan program eksternal).
Iqbal Ansari

Jawaban:

15

Saya cukup senang dengan sistem yang saya gunakan, yang tidak (saya pikir) persis apa yang Anda inginkan. Ini memiliki dua bagian: bagian Emacs yang menggunakan appt.el untuk menjadwalkan pengingat dan program shell kecil (saya menggunakan Linux) yang membuat pemberitahuan suara popup +. Di sini saya membagikan kode untuk kedua bagian.

A) Kode di ~ / .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) Kode dalam ~ / bin / appt-notifikasi

#!/bin/sh

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

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

Untuk mendapatkan notifikasi suara, Anda dapat mengganti baris terakhir (putar) dengan yang berikut ini:

espeak "Appointment in $TIME minutes: $MSG"
pengecut yg berlagak
sumber
Saya menambahkan ; (4) ... Quitting org-agenda. (advice-add 'org-agenda-quit :after #'hw-org-agenda-to-appt)
kasing
Catatan: memperbarui sekitar tengah malam penting untuk burung hantu malam karena org-agenda-to-appthanya membuat appts untuk hari ini.
holocronweaver
+1 Ini luar biasa. Terima kasih sudah berbagi. Saya telah memodifikasi ini sedikit menggunakan alert.el sebagai gantinya. Namun, satu pertanyaan: apakah Anda pernah beruntung menggunakannya dengan properti "APPT_WARNTIME" org untuk menetapkan waktu peringatan khusus untuk setiap acara? Sepertinya saya tidak bisa membuatnya bekerja.
Joseph R.
11

Anda dapat menggunakan pemberitahuan di 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
sumber
13
Ini sepertinya sangat berguna. Apakah Anda tahu cara mengintegrasikannya org-mode?
erikstokes
2

Inilah yang akhirnya saya temukan:

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

Ini tidak berbeda dengan pengaturan scaramouche.

emacsomancer
sumber