代码之家  ›  专栏  ›  技术社区  ›  kdb

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

  •  19
  • kdb  · 技术社区  · 8 年前

    我试图在活动缓冲区被以下任一项更改时执行

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

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

    到目前为止我发现了什么

    查看 Standard Hooks 我发现以下选项,没有一个完全符合我的要求:

    • buffer-list-update-hook 为(1)和(2)调用。然而,它不合适,因为它是运行的 之前 current-buffer 之后 变化是。

    • window-configuration-change-hook 可用于检测当前窗口中显示的缓冲区的变化,并运行 根据需要进行更改。然而,它不是竞选总统 M-x other-window .

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

    • post-command-hook 这是可行的,但有点繁重,即使是很小的bug,也会使编辑器的速度大大降低。

    • 因为我的行动需要使用 with-selected-window ,它会触发这些钩子,必须注意避免钩子自身触发的无尽循环。

    2 回复  |  直到 8 年前
        1
  •  11
  •   kdb    6 年前

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

    此外,我在问题中提到的一些挂钩也由用户不可见的更改触发,例如由于 with-current-buffer with-selected-window .

    但是,使用 post-command-hook 事实证明,这对性能没有问题,因为所需的状态检查很便宜。

    可供替代的

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

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

    • 在里面 post命令挂钩 ,检查状态是否已更改,可能会跳过 即使如此,如果 this-command self-insert-command .

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

    * line-number-at-pos 不合适,因为它通过从 point-min point ,这使得它通常很便宜,但还不足以在每个键入的字符之后执行。

        2
  •  8
  •   dingyi342    6 年前

    Emacs27.1引入一个新变量,称为“窗口缓冲区更改函数”

    推荐文章