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

Emacs-lisp hooks for detecting change of active buffer?

我正在尝试在活动缓冲区发生变化时执行

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

他们的钩子适合检测这个吗?

到目前为止我发现了什么

浏览 Standard Hooks 我发现了以下选项,none 其中完全符合我的要求:

从评论来看,这个问题的答案是“没有,没有这个钩子。”

此外,我的问题中提到的一些钩子也是由用户不可见的更改触发的,例如由于 with-current-bufferwith-selected-window.[=22 引起的临时更改=]

但是,使用 post-command-hook 已被证明不是性能问题,因为所需的状态检查很便宜。

备选

可能很明显,但为了完整性而声明。

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

  • post-command-hook中检查状态是否发生变化,可能会跳过 即便如此,如果 this-commandself-insert-command.

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

* line-number-at-pos 是不合适的,因为它通过遍历从 point-minpoint 的缓冲区来计算行数,这使得它通常很便宜,但不足以在每次执行后执行输入的字符。

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