如何测试Emacs Lisp代码的`font-lock-keywords`值

时间:2014-01-14 22:46:58

标签: regex emacs elisp syntax-highlighting font-lock

我提出这个问题,因为我认为问题和可能的答案可能会帮助编写定义font-lock-keywords的Lisp代码的Emacs用户。我提供了一个我觉得有帮助的答案。我也对其他答案感兴趣。

该变量的值是表达式列表,每个表达式可以指定一个或多个匹配的函数或用于执行匹配的函数,以及一个或多个用于突出显示匹配文本的面。 font-lock-keywords值的可能性很多且复杂。 (描述这个的文档是Elisp手册,节点Search-based Fontification。)

在大多数情况下,列表包含多个元素,这意味着不止一个正则表达式模式。这些可以以不同方式相互作用。有些可以阻止他人生效,或者他们可以改变他人的影响。例如,我的库Dired+在Dired模式下定义了font-lock-keywords,其中包含31个条目(regexps),其中许多条目相互作用。

如何保持这一切? 在定义或修改列表时如何调试这样的列表?您可以注释掉除列表项之外的所有项目,以便单独查看其效果。然后重复另一个。然后可能会添加一些,也许可以按不同的顺序添加。我想,有各种各样的可能性,但你做了什么?

(好吧,我知道大多数Elisp程序员都不会编写超级复杂的font-lock-keywords定义。但即使是简单的定义,这也会变得复杂。而且如果这个过程更容易,那么用户就不会不必要地限制自己一两个条目。)

2 个答案:

答案 0 :(得分:5)

您可以使用我新发布的Font Lock Studio。以下内容来自自述文件:

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 - Emacs Lisp调试器

与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 键上