Emacs基于计时器自动执行功能:用户干扰

时间:2013-02-22 16:09:25

标签: r emacs elisp gnus

我正在寻找Emacs做一些检查的一般方法,以及(bing)什么时候是真或假。

目前我有2个例子。有一个拍卖网站,我认为Emacs检查是否有更新会很好。我使用R(Emacs-ESS)来加载网站的源代码。然后我在Emacs中使用自制函数:

切换缓冲区,重新加载URL信息,将信息发送到屏幕,(sleep-for )等待一下。搜索“今天”。然后它必须检查此字符串后的值,如果它高于0,那么这意味着我有一些新的兴趣,并且PINGS。

这是一个很长的介绍,但我真的很喜欢这个。

我现在对Gnus执行相同的操作,我有一个计时器,它运行一个每10秒打开一次Gnus的函数,搜索“收件箱”,检查值,如果它高于0则会通知我(否则只是将缓冲区切换回来)。唯一的问题是这需要大约0.5秒,在这里您可以看到点移动到另一个缓冲区并切换回来。

是否有一般方法可以完成这些自动化操作,而不会打扰用户?

编辑:对于Emacs来说,在Stackoverflow上执行检查以查看是否有一个包含我们最喜欢的标签的新帖子会不会很好?

2 个答案:

答案 0 :(得分:1)

Emacs是单线程的,所以我们搞砸了 - 没有办法在没有打扰用户的情况下做到这一点。

诀窍是在支票的频率和成本之间选择一个良好的平衡,以便用户可以承受。

答案 1 :(得分: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))

我相信你可以根据自己的需要调整它。