2010-08-06 61 views
6

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

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

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

+1

当然,你可以做到这一点。查看'c-mode'实现'电子支架'。 – 2010-08-06 17:48:17

回答

9

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

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

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

新增:

字体锁可以超越正则表达式;不幸的是,文档仅限于font-lock-keywords的文档字符串中的简洁说明。 cperl-mode.el中有几个简单的例子(尽管它们有点埋在大众中)。该wiki还参考使用此功能的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)))) 

即使是正则表达式可以通过查找你想要突出(函数名MATCHER,使用的词汇从文档字符串)什么界限任意代码来代替。在标准C模式下有一个字体锁定关键字的高级示例(cc-fonts.el)。

+0

非常感谢。我的感觉是Font Lock可以为正则表达式定制,但是没有基于内容的条件,比如突出显示行1 1 3(因为1 + 1!= 3),然后在行变为2时删除突出显示1 3(因为2 + 1 = 3)。 – josh 2010-08-07 06:49:52

+0

@josh:你可以使用字体锁来编写任意代码来配​​置突出显示,它只是更复杂一点。你的例子绝对有可能。我会寻找一些示例代码并将其添加到我的答案中。 – Gilles 2010-08-07 10:15:23

1

加入你的函数变量after-change-functions