Функция автоматизации Emacs на основе таймера: вмешательство пользователя

Я ищу общий способ для Emacs выполнять некоторые проверки и (bing), когда что-то истинно или ложно.

На данный момент у меня есть 2 примера. Существует веб-сайт аукциона, и я подумал, что было бы неплохо, если бы Emacs проверял, было ли обновление. Я сделал это, используя R (Emacs-ESS) для загрузки исходного кода веб-сайта. Затем я использую самодельную функцию в Emacs, чтобы:

Переключить буфер, перезагрузить информацию URL, отправить информацию на экран, (sleep-for ) немного подождать. Найдите «Сегодня». Затем он должен проверить значение после этой строки, если оно выше 0, то это означает, что у меня есть что-то новое, представляющее интерес, и оно пингуется.

Это длинное введение, но мне очень нравится, что это работает.

Теперь я делаю то же самое с Gnus, у меня есть таймер, который запускает функцию, которая открывает Gnus каждые 10 секунд, ищет «Входящие», проверяет значение, и если оно больше 0, то уведомляет меня (в противном случае он просто переключает буфер обратно). Единственная проблема заключается в том, что это занимает около 0,5 секунды, в течение которых вы можете видеть, как точка перемещается в другой буфер и переключается обратно.

Существует ли общий подход к тому, чтобы эти автоматизированные действия выполнялись, не беспокоя пользователя?

EDIT: Было бы неплохо, если бы Emacs выполнил проверку, чтобы увидеть, есть ли новая запись с нашим любимым тегом здесь, в Stackoverflow?


person PascalVKooten    schedule 22.02.2013    source источник


Ответы (2)


Emacs однопоточный, поэтому мы облажались — нет способа сделать это, не беспокоя пользователя.

Хитрость заключается в том, чтобы выбрать хороший баланс между частотой и стоимостью проверки, чтобы пользователь мог ее вынести.

person sds    schedule 26.02.2013

Вот код, который я использовал однажды:

(defvar sds-new-mail-line nil "cache")
(defun sds-new-mail-line (&optional arg)
  "add or remove the mode-line new-mail marker"
  (or sds-new-mail-line (error "sds-new-mail-line has not been initialized"))
  (let* ((mlf (default-value 'mode-line-format))
         (already-have (eq sds-new-mail-line (car mlf))))
    (if (or (eq arg nil) (< arg 0))
        (when already-have
          (setq-default mode-line-format (cdr mlf)))
        (unless already-have
          (setq-default mode-line-format (cons sds-new-mail-line mlf))))))
(defun sds-gnus-scan-mail ()
  "check for new mail, notify if there is some"
  (when (gnus-alive-p)
    (with-current-buffer gnus-group-buffer
      (gnus-group-get-new-news 3)
      (gnus-group-get-new-news 2)
      (goto-char (point-min))
      ;; look for new messages in groups of level 1 and 2
      (cond ((search-forward-regexp "^ *s[12] *[1-9][0-9]*n" nil t)
             (message "you have new mail! (%s)" (user-time-format))
             (sds-new-mail-line 1)
             (ding))
            (t (sds-new-mail-line -1)
               (message "no new mail (%s)" (user-time-format))))
      (goto-char (point-min)))))

(defun sds-gnus-load-hook ()
  (unless sds-new-mail-line     ; init
    (let ((str "mail") (map (make-sparse-keymap)))
      (define-key map [mode-line down-mouse-1] 'ignore)
      (define-key map [mode-line mouse-1] read-mail-command)
      (add-text-properties 0 (length str)
                           (list 'display gnus-mode-line-image-cache
                                 'help-echo "you have new mail - read it!"
                                 'local-map map)
                           str)
      (setq sds-new-mail-line str))
    (gnus-demon-add-handler 'sds-gnus-scan-mail 3 t))
  (add-hook 'gnus-summary-prepared-hook 'gnus-summary-first-unread-subject)
  (add-hook 'gnus-summary-prepare-exit-hook 'gnus-summary-catchup))

;; cannot use gnus-load-hook here!
(eval-after-load "gnus-start" '(sds-gnus-load-hook))

Я уверен, что вы можете адаптировать его к вашим потребностям.

person sds    schedule 22.02.2013
comment
Что ж, у меня есть функция, которая делает то же самое, единственная проблема в том, что (и, насколько я вижу, это то же самое для вашего кода), когда она проверяет электронную почту (или выполняет любую другую проверку), вы не можете действовать. как пользователь. - person PascalVKooten; 22.02.2013
comment
emacs однопоточный, так что мы облажались. Хитрость заключается в том, чтобы выбрать хороший баланс между частотой и стоимостью проверки, чтобы пользователь мог ее вынести. - person sds; 22.02.2013
comment
Я считаю, что это более подходящий ответ, чем ваш текущий ответ! Если вы напишете это как еще один ответ, я приму это! (поскольку вы убедили меня, что ответа на самом деле нет) - person PascalVKooten; 26.02.2013