8

我添加了一个这样的lambda()功能run-with-idle-timer

(run-with-idle-timer my-configurable-idle-time t
                 (lambda ()
                    ;;; do something
                  ) )

是否可以稍后从空闲计时器触发器中再次删除此功能?

4

3 回答 3

14

是的,run-with-idle-timer返回一个timer您可以传递给的对象cancel-timer

如果您没有保留timer对象,您可以timer-idle-list手动修改。

另请参阅获取正在运行的 Emacs 计时器的列表

于 2013-03-07T13:51:36.520 回答
8

我也遇到过类似的情况,我想杀死一个开始时的计时器:

(setq my-timer (run-with-timer 5 5 'my-func))

然而,

(cancel-timer my-timer) 

没有工作,因为它说我的计时器没有设置(不知道为什么会这样)。

除了第一张海报的方法外,还可以用:

(cancel-function-timers 'my-func)

这将取消所有调用函数 'my-func.

为了通过改变我也测试过的计时器列表来杀死它,我做了以下事情:

(length timer-list)  ;; I had two timers..one good, one bad
(cdr timer-list)  ;; I verified the last was the one I wanted to keep
(setq timer-list (cdr timer-list)) ;; I reset timer-list 

显然,此列表结构会有所不同,因此您必须进行相应调整。如果您使用 (run-with-idle-timer) 启动计时器,请替换“timer-idle-list”

如果您使用 'gamegrid-start-timer 启动计时器并且 'gamegrid-kill-timer 不起作用,这也应该有效,因为 'gamegrid-start-timer 本质上只是 'run-with-timer 的包装器

于 2015-01-08T00:26:42.720 回答
1

另一种解决方案:如果您运气不好并且实际上无法取消计时器,您可以随时使用

(defvar my-timer-enabler t)
(run-with-idle-timer my-configurable-idle-time t
                    (lambda ()
                      (when my-timer-enabler
                        ;;; do something
                        )))

my-timer-enabler因此,您可以通过设置为来禁用计时器nil。您稍后可以通过简单地将 var 设置回t.

于 2015-01-08T01:53:13.133 回答