基于定时器的Emacs自动化功能:用户干扰

3
我正在寻找一种通用的方法,使Emacs能够进行一些检查,并在条件为真或假时做出响应。
目前我有两个例子。一个是拍卖网站,我认为Emacs检查是否有更新会很好。我使用R(Emacs-ESS)来加载网站的源代码。然后我在Emacs中使用自制函数:
切换缓冲区、重新加载URL信息、将信息发送到屏幕上,(sleep-for )稍微等待一下。搜索“Today”,然后它必须检查这个字符串后面的值,如果它比0大,那么就意味着我有一些新的感兴趣的东西,它就会发出PING声。
这是一个长长的介绍,但我真的很喜欢这个功能。
我现在也在用Gnus做同样的事情。我有一个计时器,每10秒运行一个函数,打开Gnus,搜索“Inbox”,检查值,如果它大于0,那么它会通知我(否则它只是切换缓冲区)。唯一的问题是这需要大约0.5秒,在这段时间内你可以看到点移动到另一个缓冲区并返回。
有没有一般的方法可以让这些自动化的操作在不干扰用户的情况下完成呢?
编辑:在Stackoverflow上,Emacs执行检查以确定是否有我们喜欢的标签的新帖子,这不是很好吗?
2个回答

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

我相信你可以根据自己的需求进行适应。


嗯,我也有一个可以做到这个的函数,唯一的问题就是(我认为你的代码也是同样的情况),当进行电子邮件验证(或者任何其他检查)时,你无法像用户一样操作。 - PascalVKooten
1
Emacs是单线程的,所以我们很困难。诀窍在于选择好检查的频率和成本之间的平衡,以便用户可以承受。 - sds
我相信这个回答比你现在的回答更合适!如果你把它写成另一个答案,我会接受它!(因为你说服了我,实际上并没有一个答案) - PascalVKooten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接