有没有办法触发执行除Mx myfun之外的emacs lisp函数?我希望每次更改缓冲区时都重新调用该函数.
背景:我有一个数字表,有一些错误.该表具有列总计和其他可用于识别错误的功能.我的elisp功能突出显示可疑的数字列.我想要的是,一旦数字得到纠正,突出显示就会消失,而不会重复调用突出显示错误功能.
我相信Excel中的类似功能称为"条件格式"
您在第一段中寻找的概念是钩子.钩子变量是在某个事件发生时执行的函数列表.大多数钩子变量的名称都以-hook.结尾.after-change-functions每次键入内容或以其他方式更改缓冲区时都会执行挂钩.在Emacs Lisp手册的"Hooks"标题下讨论了钩子.
但是,考虑到您要做的事情,使用Emacs的突出显示机制会更容易.解决方案可能就像在正确的位置添加正则表达式一样简单.
大多数包含结构化文本(特别是编程语言)的文件都使用字体锁定机制突出显示.这在"字体锁定"下的Emacs和Emacs Lisp手册中都有记录.特别参见一下这个函数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))))
Run Code Online (Sandbox Code Playgroud)
即使正则表达式也可以被任意代码替换,该代码查找要突出显示的内容的边界(函数名称为MATCHER,使用docstring中的词汇表).标准C模式(cc-fonts.el)中有一个字体锁定关键字的高级示例.