3

我正在为 Emacs 寻找一种通用的方法来做一些检查,以及 (bing) 当某事是真或假时。

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

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

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

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

有没有一种通用的方法来完成这些自动化的事情,而不会打扰用户?

编辑: Emacs 执行检查以查看 Stackoverflow 上是否有带有我们最喜欢的标签的新帖子不是很好吗?

4

2 回答 2

1

Emacs 是单线程的,所以我们被搞砸了——根本没有办法做到这一点而不打扰用户。

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

于 2013-02-26T19:01:56.263 回答
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))

我相信您可以根据自己的需要进行调整。

于 2013-02-22T16:46:49.653 回答