持续执行Emacs Lisp函数

6
有没有一种方法可以触发Emacs Lisp函数的执行,而不是使用M-x myfun?我希望每当缓冲区更改时重新调用该函数。
背景:我有一个数字表格,其中有些错误。该表格具有列总计和其他可用于识别错误的特征。我的Elisp函数突出显示可疑的数字列。我希望在数字被更正后立即取消突出显示,而无需重复调用highlight-errors函数。
类似的Excel功能称为“条件格式化”。

1
当然可以做到。请查看c-mode实现的electric brace - Heath Hunnicutt
2个回答

9
你在第一段中要寻找的概念是“hooks”。钩子变量是一系列函数的列表,当发生某个事件时执行这些函数。大多数钩子变量的名称以“-hook”结尾。钩子变量“after-change-functions”在每次输入或更改缓冲区时执行。关于钩子的讨论可以在Emacs Lisp手册的“Hooks”标题下找到。
然而,考虑到你想做的事情,使用Emacs的高亮机制会更容易。解决方案可能只需要在正确的位置添加一个正则表达式。
大多数包含结构化文本(特别是编程语言)的文件都使用字体锁定机制进行高亮显示。这在Emacs和Emacs Lisp手册的“Font Lock”中有记录;特别是要看看函数“font-lock-add-keywords”,Emacs手册给出了一个非常接近你需求的例子。还有一些关于Emacs维基的信息补充:

字体锁定可以超越正则表达式;不幸的是,文档仅限于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))))

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


非常感谢。我的感觉是Font Lock可以根据正则表达式进行定制,但没有针对基于内容的条件(例如突出显示第1行1 1 3(因为1 + 1!= 3),然后在该行变为2 1 3时取消突出显示(因为2 + 1 = 3))的设施。 - josh
@josh:你可以编写任意代码来使用字体锁定配置高亮显示,只是有点复杂。你的例子绝对可行。我会寻找一些示例代码并将其添加到我的答案中。 - Gilles 'SO- stop being evil'

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接