连续执行emacs lisp函数

时间:2010-08-06 17:27:13

标签: hook elisp

有没有办法触发执行除M-x myfun之外的emacs lisp功能?我希望每次更改缓冲区时都重新调用该函数。

背景:我有一个数字表,但有一些错误。该表具有列总计和其他可用于识别错误的功能。我的elisp功能突出显示可疑的数字列。我想要的是,一旦数字得到纠正,突出显示就会消失,而不会重复调用高亮错误功能。

我相信Excel中的类似功能称为“条件格式化”

2 个答案:

答案 0 :(得分:9)

您在第一段中寻找的概念是 hooks 。钩子变量是在某个事件发生时执行的函数列表。大多数钩子变量的名称以-hook结尾。每次键入内容或以其他方式更改缓冲区时都会执行钩子after-change-functions。在Emacs Lisp手册的“Hooks”标题下讨论了钩子。

但是,考虑到你要做的事情,使用Emacs的突出显示机制会更容易。解决方案可能就像在正确的位置添加正则表达式一样简单。

大多数包含结构化文本(特别是编程语言)的文件都使用字体锁定机制突出显示。这在“字体锁定”下的Emacs和Emacs Lisp手册中都有记录。特别参见函数 font-lock-add-keywords ,其中Emacs手册给出的示例几乎就是您所追求的。还有some information on the Emacs wiki

<强>增加:

字体锁可以超越正则表达式;遗憾的是,文档仅限于font-lock-keywords文档字符串中的简洁说明。在cperl-mode.el中有一些简单的例子(虽然它们有点埋没在质量中)。维基还引用了使用此功能的ctypes.el。这是一个突出显示错误整数添加的示例。

(defun maybe-warn-about-addition ()
  (let ((x (string-to-int (match-string 1)))
        (y (string-to-int (match-string 2)))
        (z (string-to-int (match-string 3))))
    (if (/= (+ x y) z)
        font-lock-warning-face)))
(font-lock-add-keywords
 nil
 '(("\\s-\\([0-9]+\\)\\s-*\\+\\s-*\\([0-9]+\\)\\s-*=\\s-*\\([0-9]+\\)\\s-"
    (3 (maybe-warn-about-addition) t))))

即使正则表达式也可以被任意代码替换,该代码使用docstring中的词汇表查找要突出显示的内容的边界(函数名称为MATCHER)。标准C模式(cc-fonts.el)中有一个字体锁定关键字的高级示例。

答案 1 :(得分:1)

将您的函数添加到变量after-change-functions