Emacs-lisp挂钩用于检测活动缓冲区的变化?

kdb*_*kdb 10 emacs hook

我试图在活动缓冲区改变时执行

  1. 更改当前窗口中的缓冲区(例如C-x <left>).
  2. 切换到另一个窗口(C-x o).
  3. 切换到另一个帧.

他们的钩子适合检测吗?

到目前为止我想到了什么

通过标准挂钩我找到了以下选项,其中没有一个完全符合我的要求:

  • buffer-list-update-hook被称为(1)和(2).但它不合适,因为它在缓冲区更改之前运行,而我想知道更改current-buffer 的内容.

  • window-configuration-change-hook可用于检测当前窗口中显示的缓冲区的更改,并根据需要在更改运行.然而,它不适合M-x other-window.

  • mouse-leave-buffer-hook 对于检测基于鼠标的窗口切换似乎是可行的,但是它经常被调用(对于我用鼠标切换窗口四次,切换前三次和切换一次),这需要额外的逻辑来防止多次执行.

  • post-command-hook 虽然可行,但有点沉重,即使是小错误,也有可能导致编辑器显着减速.

  • 由于我的操作需要使用with-selected-window,触发这些钩子,因此必须注意避免钩子触发自身的无限循环.

kdb*_*kdb 8

从评论中可以看出,这个问题的答案是“不,没有这种钩子”。

此外,我的问题中提到的某些挂钩也由用户看不见的更改触发,例如由于with-current-buffer和引起的临时更改with-selected-window

但是,post-command-hook由于所需的状态检查很便宜,因此使用对性能没有影响。

另类

可能很明显,但出于完整性考虑。

  • 将状态信息存储在全局变量,帧参数,窗口参数或缓冲区局部变量中,以最适合用例的情况为准。在我的用例中,这种必需的唯一状态是由current-buffer,定义的,current-window在一种情况下是由line-beginning-position* 定义的。

  • post-command-hook,检查是否状态发生了变化,有可能跳过甚至认为,如果this-commandself-insert-command

  • 如果有,请执行预期的操作并更新存储的状态。

* line-number-at-pos是不合适的,因为它通过迭代从point-minto到缓冲区来计数行point,因此通常便宜,但不足以在每个键入的字符之后执行。


小智 8

Emacs27.1 引入了一个名为“window-buffer-change-functions”的新变量

  • 它看起来更像是评论而不是答案。一旦您拥有足够的[声誉](https://stackoverflow.com/help/whats-reputation),您将能够[对任何帖子发表评论](https://meta.stackexchange.com/questions/214173/why- do-i-need-50-reputation-to-comment-what-c​​an-i-do-instead),请提供不'的[答案](https://stackoverflow.com/help/how-to-answer)不需要提问者的澄清。 (2认同)