2013-02-22 1 views
3

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

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

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

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

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

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

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

ответ

1

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

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

0

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

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

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

+0

Ну, у меня есть функция, которая делает это также, единственная проблема заключается в том, что (и это то же самое для вашего кода, насколько я могу видеть), когда он проверяет электронную почту (или делает любую другую проверку), вы можете 'т действовать как пользователь. – PascalVKooten

+1

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

+0

Я считаю, что это более подходящий ответ, чем ваш текущий ответ! Если вы напишете это как еще один ответ, я соглашусь! (поскольку вы убедили меня, что на самом деле нет ответа) – PascalVKooten