如何从run-with-idle-timer中删除一个函数?

Arn*_*rne 6 emacs elisp

我添加了一个这样的lambda()函数run-with-idle-timer:

(run-with-idle-timer my-configurable-idle-time t
                 (lambda ()
                    ;;; do something
                  ) )
Run Code Online (Sandbox Code Playgroud)

是否可以在以后从空闲定时器触发器中删除此功能?

sds*_*sds 13

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

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

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


vt5*_*491 7

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

(setq my-timer (run-with-timer 5 5 'my-func))
Run Code Online (Sandbox Code Playgroud)

然而,

(cancel-timer my-timer) 
Run Code Online (Sandbox Code Playgroud)

没有工作,因为它说我的计时器没有设置(不知道为什么会发生这种情况).

除了第一张海报的方法,它可以用以下方法杀死:

(cancel-function-timers 'my-func)
Run Code Online (Sandbox Code Playgroud)

这取消了所有调用函数'my-func的计时器.

要通过更改timer-list来杀死它,我也测试过,我做了以下事情:

(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 Code Online (Sandbox Code Playgroud)

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

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