观看sexpr进行编辑

时间:2012-12-29 01:26:54

标签: emacs elisp

我想告诉Emacs在缓冲区内“观察”一个特定的表单(由car标识),并在编辑它时对其进行评估。

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

效率低,尤其是如果强制执行“每秒呼叫数”(例如,使用current-time)。

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

2 个答案:

答案 0 :(得分:3)

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

叠加层具有modification-hooks属性,您可以向其添加观察器功能。

如果您在其中严格修改缓冲区内容,叠加层将适当收缩或展开,但您需要决定在窗体边缘编辑缓冲区时要执行的操作。请参阅insert-in-front-hooksinsert-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")