我提出这个问题是因为我认为这个问题和可能的答案可能会帮助编写定义font-lock-keywords
的Lisp代码的Emacs用户。我提供了一个我认为有帮助的答案。我也对其他答案感兴趣。
该变量的值是一个表达式列表,每个表达式都可以指定一个或多个要匹配的模式或执行匹配的函数,以及一个或更多个用于突出显示匹配文本的面。CCD_ 2值的可能性是多而复杂的。(描述这一点的文档是Elisp手册,节点Search-based Fontification
。)
在大多数情况下,列表有多个元素,这意味着有多个regexp模式。它们可以以不同的方式相互作用。有些可以阻止其他人生效,也可以改变其他人的效果。例如,我的库Dired+在Dired模式下用31个条目(regexp)定义font-lock-keywords
,其中许多条目相互作用。
如何保持这一切当您定义或修改这样的列表时,如何调试它?您可以注释掉除一项外的所有列表项,以查看其单独使用时的效果。然后重复另一个。然后,也许把一些加在一起,也许按照不同的顺序。我想有各种各样的可能性,但你是怎么做的?
(好吧,我知道大多数Elisp编码程序都不会编写超复杂的font-lock-keywords
定义。但即使对于简单的定义,这也可能变得复杂。也许如果这个过程更容易,那么用户就不会不必要地将自己限制为只有一两个条目。)
您可以使用我新发布的Font Lock Studio。以下来自自述文件:
font lock studio-用于font lock关键字的交互式调试器
Font Lock Studio是用于Font Lock的交互式调试器关键字(Emacs语法高亮显示规则)。
引言
Font Lock Studio允许您单步Font Lock关键字--匹配器、高亮显示和锚定规则,以便您可以查看当缓冲区被字体化时发生。您可以在或上设置断点内部规则和运行,直到命中为止。当在规则内时,匹配使用背景色调色板进行可视化。这个解释者可以用纯文本英语描述规则。牢固的与Edebug的集成允许您逐步进入Lisp表达式它们是字体锁定关键字的一部分。
使用调试器时,会显示接口缓冲区包含所有关键字,用于导航和匹配数据的可视化。
当Font Lock Studio启动时,注释和字符串预着色,因为它们是早期语法阶段的一部分(Font Lock Studio不支持)。
输入"M-x font lock studio RET"启动调试器。按?
或查看菜单以获取可用命令。
示例
对于使用html-mode
的缓冲区,接口缓冲区看起来下列的其他主要模式通常越来越复杂规则。左侧的箭头指示当前活动位置。源缓冲区中的相应箭头位于当前位置搜索位置。
========================
=== Font Lock Studio ===
========================
--------------------------------------------------
=> "<\([!?][_:[:alpha:]][-_.:[:alnum:]]*\)"
(1 font-lock-keyword-face)
--------------------------------------------------
"</?\([_[:alpha:]][-_.[:alnum:]]*\)\(?::\([_:[:alpha:]]
[-_.:[:alnum:]]*\)\)?"
(1
(if
(match-end 2)
sgml-namespace-face font-lock-function-name-face))
(2 font-lock-function-name-face nil t)
--------------------------------------------------
"\(?:^\|[ t]\)\([_[:alpha:]][-_.[:alnum:]]*\)\(?::
\([_:[:alpha:]][-_.:[:alnum:]]*\)\)?=["']"
(1
(if
(match-end 2)
sgml-namespace-face font-lock-variable-name-face))
(2 font-lock-variable-name-face nil t)
--------------------------------------------------
"[&%][_:[:alpha:]][-_.:[:alnum:]]*;?"
(0 font-lock-variable-name-face)
--------------------------------------------------
"<\(b\(?:ig\|link\)\|cite\|em\|h[1-6]\|rev\|s\(?:
mall\|trong\)\|t\(?:itle\|t\)\|var\|[bisu]\)
\([ t][^>]*\)?>\([^<]+\)</\1>"
(3
(cdr
(assoc-string
(match-string 1)
sgml-tag-face-alist t))
prepend)
==================================================
Public state:
Debug on error : YES
Debug on quit : YES
Explain rules : YES
Show compiled code : NO
按空格键可单步浏览所有关键字。"n"将消失下一个关键字"b"将设置断点,"g"将运行到结束(或到下一个断点)和"q"将退出。
功能
步进
您可以将单步执行到字体锁定的、上和下关键字完全支持锚定规则。此外,您可以运行到结束或下一个断点。
断点
您可以在关键字的一部分设置断点,如matcher(例如regexp)、高亮显示规则或锚定高亮显示内部规则
如果要在不停止断点的情况下执行步骤或运行,请使用前缀具有CCD_ 8的命令。
请注意,在锚定规则中,您可以在整个规则或单个部分。在前一种情况下,仅外括号突出显示。
匹配数据可视化
关键字或锚定突出显示的匹配器之后执行时,匹配数据(无论搜索结果如何)都会可视化在源缓冲区、regexp中使用背景色,以及超过相应的高亮显示规则。如果是正则表达式的一部分或者高亮显示不匹配,没有颜色,这可以用于示例发生在使用后缀regexp运算符?
时。
请注意,内部匹配组的优先级高于外部组。这可能导致高亮显示规则获得颜色的情况它不会出现在regexp或源缓冲区中。对于例如,匹配器"\(abc\)"将使用匹配1,而higlight规则"(0a-face)"获得匹配0。
规范化关键字
界面中显示的关键字已被规范化。对于例如,而不是
("xyz" . font-lock-type-face)
关键字
("xyz" (0 font-lock-type-face))
显示。详见font-lock-studio-normalize-keywords
。
讲解员
解释程序呼应了当前字体锁定关键字的一部分。这有助于你理解规则中的所有CCD_ 11:s和CCD_。
当使用自动解释器时,Font Lock Studio会回显每个命令后的解释。
Edebug——Emacs Lisp调试器
通过与Edebug的紧密集成,可以实现单步表达式嵌入到接口缓冲区中的关键字中,它允许您在被调用函数的源文件中对其进行调试。
跟随模式意识
源缓冲区中的搜索位置通过覆盖箭头和通过更新点。如果源缓冲区在多个并排窗口中可见,跟随模式为启用后,搜索位置将显示在合适的窗口中最小化滚动。
为了解决这个问题,我编写了一个Icicles多命令,icicle-font-lock-keywords
。它可以让你做以下事情:
-
在单独的
font-lock-keywords
条目(模式)之间循环,单独应用它们以查看每个条目的效果。 -
选择单独的条目并分别应用它们,可以看到相同的内容。
-
选取条目集并应用它,其顺序与条目在
font-lock-keywords
中的显示顺序相同。您可以对任意数量的集合执行此操作。 -
按照选择的顺序累积多组条目的效果。
-
Revert,查看所有条目的效果,即所有
font-lock-keywords
。
您可以在一次命令调用中以任何顺序完成所有这些操作。
M-o
是Facemenu和字体锁定的前缀键,所以当处于Icicle模式时,我将此命令放在键M-o I
上。