用于检测活动缓冲区变化的 Emacs-lisp 挂钩?
Emacs-lisp hooks for detecting change of active buffer?
我正在尝试在活动缓冲区发生变化时执行
- 正在更改当前 window 中的缓冲区(例如
C-x <left>
)。
- 正在切换到另一个 window (
C-x o
)。
- 正在切换到另一帧。
他们的钩子适合检测这个吗?
到目前为止我发现了什么
浏览 Standard Hooks 我发现了以下选项,none 其中完全符合我的要求:
buffer-list-update-hook
为 (1) 和 (2) 调用。然而,它是不合适的,因为它是 运行 before 缓冲区被更改,而我想知道 current-buffer
after 变化是。
window-configuration-change-hook
可以用来检测当前window中显示的buffer的变化,是运行after 根据需要进行更改。但是 M-x other-window
不是 运行。
mouse-leave-buffer-hook
似乎可以检测基于鼠标的 window 切换,但它被调用的次数有点频繁(对我来说,在切换 windows 时调用了四次鼠标,切换前三次,切换后一次),这需要额外的逻辑来防止多次执行。
post-command-hook
是可行的,但有点笨手笨脚,即使是小错误也可能导致编辑器显着变慢。
由于我的操作需要使用 with-selected-window
,这会触发这些挂钩,因此必须注意避免挂钩自行触发的无限循环。
从评论来看,这个问题的答案是“没有,没有这个钩子。”
此外,我的问题中提到的一些钩子也是由用户不可见的更改触发的,例如由于 with-current-buffer
和 with-selected-window
.[=22 引起的临时更改=]
但是,使用 post-command-hook
已被证明不是性能问题,因为所需的状态检查很便宜。
备选
可能很明显,但为了完整性而声明。
将状态信息存储在全局变量、帧参数、window 参数或缓冲区局部变量中,以最适用于用例的为准.在我的用例中,这个必要的唯一状态是由 current-buffer
、current-window
定义的,在一种情况下是 line-beginning-position
.*
在post-command-hook
中检查状态是否发生变化,可能会跳过
即便如此,如果 this-command
是 self-insert-command
.
- 如果有,执行预期的操作并更新存储的状态。
* line-number-at-pos
是不合适的,因为它通过遍历从 point-min
到 point
的缓冲区来计算行数,这使得它通常很便宜,但不足以在每次执行后执行输入的字符。
Emacs27.1 引入了一个名为`window-buffer-change-functions'的新变量
我正在尝试在活动缓冲区发生变化时执行
- 正在更改当前 window 中的缓冲区(例如
C-x <left>
)。 - 正在切换到另一个 window (
C-x o
)。 - 正在切换到另一帧。
他们的钩子适合检测这个吗?
到目前为止我发现了什么
浏览 Standard Hooks 我发现了以下选项,none 其中完全符合我的要求:
buffer-list-update-hook
为 (1) 和 (2) 调用。然而,它是不合适的,因为它是 运行 before 缓冲区被更改,而我想知道current-buffer
after 变化是。window-configuration-change-hook
可以用来检测当前window中显示的buffer的变化,是运行after 根据需要进行更改。但是M-x other-window
不是 运行。mouse-leave-buffer-hook
似乎可以检测基于鼠标的 window 切换,但它被调用的次数有点频繁(对我来说,在切换 windows 时调用了四次鼠标,切换前三次,切换后一次),这需要额外的逻辑来防止多次执行。post-command-hook
是可行的,但有点笨手笨脚,即使是小错误也可能导致编辑器显着变慢。由于我的操作需要使用
with-selected-window
,这会触发这些挂钩,因此必须注意避免挂钩自行触发的无限循环。
从评论来看,这个问题的答案是“没有,没有这个钩子。”
此外,我的问题中提到的一些钩子也是由用户不可见的更改触发的,例如由于 with-current-buffer
和 with-selected-window
.[=22 引起的临时更改=]
但是,使用 post-command-hook
已被证明不是性能问题,因为所需的状态检查很便宜。
备选
可能很明显,但为了完整性而声明。
将状态信息存储在全局变量、帧参数、window 参数或缓冲区局部变量中,以最适用于用例的为准.在我的用例中,这个必要的唯一状态是由
current-buffer
、current-window
定义的,在一种情况下是line-beginning-position
.*在
post-command-hook
中检查状态是否发生变化,可能会跳过 即便如此,如果this-command
是self-insert-command
.- 如果有,执行预期的操作并更新存储的状态。
* line-number-at-pos
是不合适的,因为它通过遍历从 point-min
到 point
的缓冲区来计算行数,这使得它通常很便宜,但不足以在每次执行后执行输入的字符。
Emacs27.1 引入了一个名为`window-buffer-change-functions'的新变量