首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于检测活动缓冲区变化的Emacs挂钩?

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

Stack Overflow用户
提问于 2017-11-23 12:58:51
回答 2查看 3.9K关注 0票数 20

当活动缓冲区更改为任何一个时,我将尝试执行

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

他们的钩子是否适合探测这一点?

到目前为止我发现了什么

通过查看标准钩,我发现了以下选项,但这些选项都不能完全满足我的要求:

  • (1)和(2)都需要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,它会触发这些钩子,因此必须小心避免钩子本身触发的无尽循环。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-29 10:53:40

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

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

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

替代方案

可能很明显,但为了完整起见。

  • 将状态信息存储在全局变量、帧参数、窗口参数或缓冲区局部变量中,以最适用于用例的变量为准。在我的用例中,这个必要的唯一状态是由current-buffercurrent-window和一个例子line-beginning-position.*定义的。
  • post-command-hook中,检查状态是否已经改变,甚至可能跳过状态,如果this-commandself-insert-command的话。
  • 如果有,则执行预期的操作并更新存储状态。

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

票数 11
EN

Stack Overflow用户

发布于 2020-02-02 21:43:10

Emacs27.1引入一个名为“窗口-缓冲区-更改-函数”的新变量。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47456134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档