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

Dre*_*rew 3 regex emacs elisp syntax-highlighting font-lock

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

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

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

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

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

Lin*_*cer 5

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

font-lock-studio - Font Lock关键字的交互式调试器

Font Lock Studio是Font Lock关键字的交互式调试器(Emacs语法高亮规则).

介绍

Font Lock Studio允许您单步执行字体锁定关键字 - 匹配器,突出显示和锚定规则,以便您可以看到缓冲区已经完成时会发生什么.您可以在规则上或规则内设置断点,然后运行直到命中一个断点.在规则内部时,使用背景颜色调色板可视化匹配.该 解释器可以描述纯文本英语的规则.与Edebug的紧密集成允许您进入作为Font Lock关键字一部分的Lisp表达式.

使用调试器时,会显示一个接口缓冲区,它包含所有关键字,用于匹配数据的导航和访问.

当Font Lock Studio启动时,注释和字符串会预先着色,因为它们是早期语法阶段的一部分 (Font Lock Studio不支持).

键入"Mx 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
Run Code Online (Sandbox Code Playgroud)

按空格键以单步执行所有关键字."n"将转到下一个关键字,"b"将设置断点,"g"将运行到结尾(或下一个断点),"q"将退出.

特征

步进

您可以单步进入,结束退出 Font Lock关键字.完全支持锚定规则.此外,您可以运行到结束或下一个断点.

断点

您可以在关键字的一部分上设置断点,例如匹配器(例如正则表达式),突出显示规则或锚定突出​​显示规则内部.

如果要在不停止断点的情况下步进或运行,请在命令前加上C-u.

请注意,在锚定规则中,您可以在整个规则或单个部件上设置断点.在前一种情况下,仅突出显示外括号.

匹配数据可视化

在执行关键字或锚定突出​​显示的匹配器之后,使用源缓冲区,正则表达式中的背景颜色以及相应的突出显示规则或规则来显示匹配数据(无论搜索找到什么).如果正则表达式或突出显示的一部分不匹配,则它不会着色,例如,当使用后缀正则表达式运算符时会发生这种情况?.

请注意,内部匹配组优先于外部组.这可能导致突出显示规则获得未出现在正则表达式或源缓冲区中的颜色的情况.例如,匹配器"\(abc \)"将使用匹配1的颜色着色,而higlight规则"(0 a-face)"将获得匹配0的颜色.

规范化关键字

界面中显示的关键字已经标准化.例如,而不是

     ("xyz" . font-lock-type-face)
Run Code Online (Sandbox Code Playgroud)

关键字

      ("xyz" (0 font-lock-type-face))
Run Code Online (Sandbox Code Playgroud)

显示.详情font-lock-studio-normalize-keywords请见.

解释器

解释器相呼应的字体锁定关键字的当前部分的人类readble描述.这有助于您理解所有这些nil:t规则中的s和:s实际上是指.

使用自动解释器时,Font Lock Studio会在每个命令后回复说明.

Edebug - Emacs Lisp调试器

与Edebug的紧密集成允许您在接口缓冲区中的关键字中嵌入单步表达式,并允许您在源文件中设置调用函数以进行调试.

遵循模式意识

源缓冲区中的搜索位置通过覆盖箭头和更新点进行可视化.如果源缓冲区在多个并排窗口中可见并且启用了跟随模式,则搜索位置将显示在合适的窗口中以最小化滚动.