gpt4 book ai didi

Emacs -- 创建/删除一个 `buffer-local` 重复空闲计时器

转载 作者:行者123 更新时间:2023-12-04 13:50:19 25 4
gpt4 key购买 nike

我有一个使用重复空闲计时器的次要模式:

(timer-activate-when-idle
(run-with-idle-timer 0.2 t 'function-name))

我试图找出处理在多个缓冲区中处于事件状态的相同次要模式的最佳方法,以及如何在终止缓冲区或停用次要模式时取消计时器而不影响其他缓冲区。

如果可能的话,我首选的处理方法是创建一个缓冲区本地空闲计时器并为其分配一个唯一的名称/标识以用于取消。如果这种方法在可能的范围内,那么将不胜感激。

我最不喜欢的处理方法是遍历所有打开的缓冲区,以确定该特定次要模式是否在其中任何一个中处于事件状态,如果没有,则取消计时器。换句话说,将有一个定时器为所有缓冲区提供服务。

关于如何处理这种情况的任何其他想法将不胜感激。

[注意:我意识到我可以设置一个条件来阻止计时器采取任何行动(例如,如果不是次要模式 xyz),但是,当不再有需要一个特定的计时器。]

最佳答案

好吧,您几乎可以按照您的描述进行操作。

(defvar-local my-local-timer nil "Buffer-local timer.")

(defun do-something-with (buf)
"Callback function for `my-local-timer'."
(when (buffer-live-p buf)
(with-current-buffer buf
...)))

(setq my-local-timer
(run-with-idle-timer 0.2 t 'do-something-with (current-buffer)))

(add-hook 'kill-buffer-hook
(lambda ()
(when (timerp my-local-timer)
(cancel-timer my-local-timer))))

定时器对象添加到 timer-idle-list , 并且该变量只是为了在您想要修改/取消它时可以按名称访问它。因此,变量是缓冲区本地没有问题(除非您设法在不取消计时器的情况下终止缓冲区)。

您是否真的想要为每个缓冲区运行一个单独的计时器是另一回事,但是如果您愿意(或需要),您当然可以这样做,并且这样做可能会减少内务管理。

如果您选择单个计时器路由,但您不想遍历所有缓冲区,则可以简单地维护一个感兴趣的缓冲区列表(启用该模式可以添加当前缓冲区;禁用该模式可以删除它),并且然后你可以迭代这些。由于有一些方法可以让列表留下陈旧的条目,您的计时器函数会想要检查每个缓冲区是否有效,以及模式变量是否仍然设置,并删除无效条目。如果列表为空,您可以取消计时器。

关于Emacs -- 创建/删除一个 `buffer-local` 重复空闲计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24007822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com