1

我想告诉 Emacscar在缓冲区中“观察”一个特定的表单(由它标识),并在我编辑它时评估它。

我能想到的一种方法是向 中添加一个函数post-self-insert-hook,该函数将查找并解析目标表单并将其与之前存储的状态进行比较。

这听起来并不太低效,尤其是在强制执行“每秒调用次数”最大值的情况下(例如使用current-time)。

是否有更高级别/更惯用的方式来实现这一目标?这听起来像是已经解决的问题。

4

2 回答 2

3

我认为最自然的方法是创建一个覆盖从表格的开头到结尾的叠加层。

Overlays 有一个modify-hooks属性,你可以给它添加一个观察者函数。

如果您在其中严格修改缓冲区内容,则覆盖将适当收缩或扩展,但您需要决定在表单边缘编辑缓冲区时要做什么。请参阅insert-in-front-hooks,以及make-overlayinsert-behind-hooks的最后两个参数。在大多数情况下,我可能只是重新创建覆盖,只是为了确定新的界限。

关于“每秒调用次数”的事情,您可以使用run-with-idle-timer

于 2012-12-29T21:47:03.190 回答
2

@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")
于 2013-01-03T01:29:43.140 回答