我想告诉Emacs在缓冲区内“观察”一个特定的表单(由car
标识),并在编辑它时对其进行评估。
我能想到的一种方法是向post-self-insert-hook
添加一个函数,它会找到并解析目标表单并将其与之前存储的状态进行比较。
效率低,尤其是如果强制执行“每秒呼叫数”(例如,使用current-time
)。
是否有更高级别/更多惯用方法来实现这一目标?这听起来像是已经解决的问题。
答案 0 :(得分:3)
我认为最自然的方法是创建一个从表单的开头到结尾的叠加层。
叠加层具有modification-hooks属性,您可以向其添加观察器功能。
如果您在其中严格修改缓冲区内容,叠加层将适当收缩或展开,但您需要决定在窗体边缘编辑缓冲区时要执行的操作。请参阅insert-in-front-hooks
,insert-behind-hooks
以及make-overlay的最后两个参数。我可能只是在大多数情况下重新创建叠加层,只是为了确定新边界。
关于“每秒通话次数”的事情,您可以使用run-with-idle-timer。
答案 1 :(得分:2)
@Dmitry提及的部分内容可以变成简单的原型。标记(message "text")
并运行 M-x eval-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")