当活动缓冲区更改为任何一个时,我将尝试执行
C-x <left>)。C-x o)。他们的钩子是否适合探测这一点?
到目前为止我发现了什么
通过查看标准钩,我发现了以下选项,但这些选项都不能完全满足我的要求:
buffer-list-update-hook。但是,这是不合适的,因为它是在缓冲区更改之前运行的,而我想知道更改后的current-buffer是什么。window-configuration-change-hook可用于检测当前窗口中显示的缓冲区的更改,并根据需要在更改后运行。但是,它不是为M-x other-window运行的。mouse-leave-buffer-hook似乎可以检测到基于鼠标的窗口切换,但它被调用得有点频繁(对我来说,在用鼠标切换窗口时,在切换之前和之后分别调用4次和一次),这需要额外的逻辑来防止多次执行。post-command-hook将是可行的,但有点笨手笨脚,即使是一些小bug,也有可能使编辑器出现显著的慢下来。with-selected-window,它会触发这些钩子,因此必须小心避免钩子本身触发的无尽循环。发布于 2017-11-29 10:53:40
从评论来看,这个问题的答案是“不,没有这样的钩子”。
此外,我在问题中提到的一些钩子也是由不可用户可见的更改触发的,例如由于with-current-buffer和with-selected-window而引起的临时更改。
然而,使用post-command-hook被证明不是性能问题,因为所需的状态检查很便宜。
替代方案
可能很明显,但为了完整起见。
current-buffer、current-window和一个例子line-beginning-position.*定义的。post-command-hook中,检查状态是否已经改变,甚至可能跳过状态,如果this-command是self-insert-command的话。* line-number-at-pos是不合适的,因为它通过迭代从point-min到point的缓冲区来计算行数,这使得它通常很便宜,但不足以在每个输入字符之后执行。
发布于 2020-02-02 21:43:10
Emacs27.1引入一个名为“窗口-缓冲区-更改-函数”的新变量。
https://stackoverflow.com/questions/47456134
复制相似问题