elisp的一段代码可以“收益”,所以emacs不会阻止吗?

时间:2009-09-25 00:27:33

标签: emacs elisp

有没有办法在没有接管emacs的情况下写这样的东西?

(defun dumb-wait (seconds)
    (let ((done (+ (second (current-time)) seconds)))
        (while (< (second (current-time)) done)
            (message "waiting"))))

(dump-wait 5)将阻止5秒内的emacs。反正有没有写这个,所以它不会阻止?我只是想循环并不时检查一些条件,仍然可以使用emacs。

谢谢!

2 个答案:

答案 0 :(得分:6)

(run-at-time time repeat function &rest args)应该这样做。 nil现在时间意味着。

(setq my-timer 
      (run-at-time nil 5 (lambda () (message "waiting")))) ; returns timer object
;; or
(setq my-timer
      (run-at-time nil 5 'message "waiting"))

(cancel-timer my-timer) ; use timer object from above

修改

参数repeat期望一个数字为秒,但是有一个函数timer-duration,您可以使用它来代替数字。它返回字符串参数提供的秒数。对于大间隔,这有点容易阅读。

(timer-duration "3 hours 2 seconds 1 millisec") ; => 10802.001

您可以使用的单词在变量timer-duration-words中定义。

答案 1 :(得分:2)

在相关的说明中,没有通用的方法来编写不阻塞的Emacs Lisp代码,因为该语言没有协程,连续和线程等功能。相反,你必须寻找能够做到最接近你想要的东西的异步内置。示例:url-retrieveasync-shell-command。像SLIME这样的应用程序已经设法解决了这个问题并且已经自己实现了一种线程,而像gnus这样的其他应用程序正在等待Emacs Lisp改进。