有没有办法触发执行除M-x myfun之外的emacs lisp功能?我希望每次更改缓冲区时都重新调用该函数。
背景:我有一个数字表,但有一些错误。该表具有列总计和其他可用于识别错误的功能。我的elisp功能突出显示可疑的数字列。我想要的是,一旦数字得到纠正,突出显示就会消失,而不会重复调用高亮错误功能。
我相信Excel中的类似功能称为“条件格式化”
答案 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
。