我提出这个问题,因为我认为问题和可能的答案可能会帮助编写定义font-lock-keywords
的Lisp代码的Emacs用户。我提供了一个我觉得有帮助的答案。我也对其他答案感兴趣。
该变量的值是表达式列表,每个表达式可以指定一个或多个匹配的函数或用于执行匹配的函数,以及一个或多个用于突出显示匹配文本的面。 font-lock-keywords
值的可能性很多且复杂。 (描述这个的文档是Elisp手册,节点Search-based Fontification
。)
在大多数情况下,列表包含多个元素,这意味着不止一个正则表达式模式。这些可以以不同方式相互作用。有些可以阻止他人生效,或者他们可以改变他人的影响。例如,我的库Dired+在Dired模式下定义了font-lock-keywords
,其中包含31个条目(regexps),其中许多条目相互作用。
如何保持这一切? 你 在定义或修改列表时如何调试这样的列表?您可以注释掉除列表项之外的所有项目,以便单独查看其效果。然后重复另一个。然后可能会添加一些,也许可以按不同的顺序添加。我想,有各种各样的可能性,但你做了什么?
(好吧,我知道大多数Elisp程序员都不会编写超级复杂的font-lock-keywords
定义。但即使是简单的定义,这也会变得复杂。而且如果这个过程更容易,那么用户就不会不必要地限制自己一两个条目。)
答案 0 :(得分:5)
您可以使用我新发布的Font Lock Studio。以下内容来自自述文件:
Font Lock Studio 是Font Lock的交互式调试器 关键字(Emacs语法高亮规则)。
Font Lock Studio可让您单步字体锁定关键字 - 匹配器,突出显示和锚定规则,以便您可以看到什么 当缓冲区被终结时发生。您可以在或上设置断点 内部规则和运行直到一个被击中。在规则内, 匹配是使用背景颜色的调色板可视化。该 explainer 可以用纯文本英语描述规则。紧 与 Edebug 的集成允许您进入Lisp表达式 这是Font Lock关键字的一部分。
使用调试器时,会显示接口缓冲区 包含所有关键字,用于导航和 匹配数据的访问。
启动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”将退出。
您可以将单步进入, over 和 out 的Font Lock 关键字。完全支持锚定规则。另外,你 可以运行到结尾或下一个断点。
您可以在关键字的一部分上设置断点,例如匹配器 (例如正则表达式),突出显示规则或锚定突出显示内部 规则。
如果要在不断点的情况下步进或运行,请添加前缀
带有C-u
的命令。
请注意,在锚定规则中,您可以设置断点 整个规则或单个部分。在前一种情况下,只有 外括号突出显示。
关键字或锚定突出显示的匹配器之后
执行后,匹配数据(无论搜索到什么)都可视化
在源缓冲区,正则表达式和。中使用背景颜色
超过相应的突出显示规则或规则。如果是正则表达式的一部分
或者一个高光不匹配,它没有着色,这可以
示例在使用postfix regexp operator ?
时发生。
请注意,内部匹配组优先于外部组。 这可能导致突出显示规则变为颜色的情况 这不会出现在正则表达式或源缓冲区中。对于 例如,匹配器“\(abc \)”将用颜色着色 匹配1,而higlight规则`(0 a-face)'获得颜色 匹配0。
界面中显示的关键字已经标准化。对于 例如,而不是
("xyz" . font-lock-type-face)
关键字
("xyz" (0 font-lock-type-face))
显示。有关详细信息,请参阅font-lock-studio-normalize-keywords
。
说明者回应了人类可读的当前描述
Font Lock关键字的一部分。这有助于您理解这一点
规则中的所有nil
:s和t
:s实际上都是指。
使用自动解释器时,Font Lock Studio回应了 每个命令后的解释。
与Edebug的紧密集成允许您使用单步表达式 嵌入在接口缓冲区中的关键字,它允许您 在源文件中调用调用函数进行调试。
源缓冲区中的搜索位置由a显示 覆盖箭头并更新点。如果源缓冲区是 在多个并排的窗口中可见,并且跟随模式是 启用后,搜索位置将显示在合适的窗口中 最小化滚动。
答案 1 :(得分:0)
为了解决这个问题,我编写了Icicles multi-command, icicle-font-lock-keywords
。它允许您执行以下操作:
在单独的font-lock-keywords
条目(模式)中循环,单独应用它们以查看每个条目的效果。
选择单个条目并单独应用,以查看相同的内容。
选择设置条目并应用,条目与font-lock-keywords
中的条目顺序相同。你可以为任意数量的套装做到这一点。
按照您选择的顺序累计多组条目的效果。
还原,查看所有条目的效果,即所有font-lock-keywords
。
你可以在一次调用命令中以任何顺序完成所有这些操作。
M-o
是Facemenu和字体锁定的前缀键,因此我在 Icicle 模式下将此命令放在 M-o I
键上