我试图在活动缓冲区改变时执行
C-x <left>).C-x o).他们的钩子适合检测吗?
通过标准挂钩我找到了以下选项,其中没有一个完全符合我的要求:
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,触发这些钩子,因此必须注意避免钩子触发自身的无限循环.
从评论中可以看出,这个问题的答案是“不,没有这种钩子”。
此外,我的问题中提到的某些挂钩也由用户看不见的更改触发,例如由于with-current-buffer和引起的临时更改with-selected-window。
但是,post-command-hook由于所需的状态检查很便宜,因此使用对性能没有影响。
可能很明显,但出于完整性考虑。
将状态信息存储在全局变量,帧参数,窗口参数或缓冲区局部变量中,以最适合用例的情况为准。在我的用例中,这种必需的唯一状态是由current-buffer,定义的,current-window在一种情况下是由line-beginning-position* 定义的。
在post-command-hook,检查是否状态发生了变化,有可能跳过甚至认为,如果this-command是self-insert-command。
* line-number-at-pos是不合适的,因为它通过迭代从point-minto到缓冲区来计数行point,因此通常便宜,但不足以在每个键入的字符之后执行。
小智 8
Emacs27.1 引入了一个名为“window-buffer-change-functions”的新变量
| 归档时间: |
|
| 查看次数: |
1118 次 |
| 最近记录: |