hook - 连续执行一个emacs lisp函数

标签 hook elisp

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

背景:我有一张有一些错误的数字表。该表具有列总计和其他可用于识别错误的功能。我的 elisp 函数会突出显示可疑的数字列。我想要的是,一旦数字被纠正,突出显示就会消失,而不需要重复调​​用 highlight-errors 函数。

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

最佳答案

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

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

大多数包含结构化文本(尤其是编程语言)的文件都使用字体锁定机制突出显示。这在 Emacs 和 Emacs Lisp 手册的“Font Lock”下都有记录;尤其是函数 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 ) 中有一个字体锁定关键字的高级示例。

关于hook - 连续执行一个emacs lisp函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3426197/

相关文章:

winapi - Windows 资源管理器不接收 WM_DESTROY。如何检测用户何时关闭资源管理器窗口?

c - 通过 Hook 调用在 Windows 进程中加速或静音音频播放

hook - 重定向到 liferay 登录页面

python - Emacs 24.3 python : Can't guess python-indent-offset, 使用默认值 4

elisp - 更新结构域

C# 非托管 dll 导出(它是如何工作的)

php - 在 woocommerce 单页上添加到购物车按钮后添加内容

emacs - 并排镜像两个打开的缓冲区中文件中的位置

Emacs -- 创建/删除一个 `buffer-local` 重复空闲计时器

emacs - 显示 Emacs 中当前缓冲区的语法表名称