我想告诉 Emacscar
在缓冲区中“观察”一个特定的表单(由它标识),并在我编辑它时评估它。
我能想到的一种方法是向 中添加一个函数post-self-insert-hook
,该函数将查找并解析目标表单并将其与之前存储的状态进行比较。
这听起来并不太低效,尤其是在强制执行“每秒调用次数”最大值的情况下(例如使用current-time
)。
是否有更高级别/更惯用的方式来实现这一目标?这听起来像是已经解决的问题。
我认为最自然的方法是创建一个覆盖从表格的开头到结尾的叠加层。
Overlays 有一个modify-hooks属性,你可以给它添加一个观察者函数。
如果您在其中严格修改缓冲区内容,则覆盖将适当收缩或扩展,但您需要决定在表单边缘编辑缓冲区时要做什么。请参阅insert-in-front-hooks
,以及make-overlayinsert-behind-hooks
的最后两个参数。在大多数情况下,我可能只是重新创建覆盖,只是为了确定新的界限。
关于“每秒调用次数”的事情,您可以使用run-with-idle-timer。
@Dmitry提到的部分内容可以变成简单的原型。标记(message "text")
并运行M-xeval-on-modify-add
(defun eval-on-modify-add ()
(interactive)
(let ((ov (make-overlay (region-beginning) (region-end))))
(overlay-put ov 'modification-hooks '(eval-on-modify-execute))))
(defun eval-on-modify-execute (ov &optional flag &rest rv)
(if flag
(eval-region (overlay-start ov) (overlay-end ov))))
(message "test")