繁体   English   中英

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

[英]How to test `font-lock-keywords` values for Emacs Lisp code

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

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

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

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

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

您可以使用我新发布的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

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

特征

步进

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

断点

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

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

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

匹配数据可视化

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

请注意,内部匹配组优先于外部组。 这可能导致突出显示规则获得未出现在正则表达式或源缓冲区中的颜色的情况。 例如,匹配器“\\(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的紧密集成允许您在接口缓冲区中的关键字中嵌入单步表达式,并允许您在源文件中设置调用函数以进行调试。

遵循模式意识

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

为了解决这个问题,我编写了一个Icicles 多命令icicle-font-lock-keywords 它允许您执行以下操作:

  • 在单独的font-lock-keywords条目(模式)之间循环,单独应用它们以查看每个条目的效果。

  • 选择单个条目并单独应用它们以查看相同的内容。

  • 选择一条目并应用它,条目以相同的顺序出现在font-lock-keywords 您可以为任意数量的集合执行此操作。

  • 按照您选择的顺序累计多组条目的效果。

  • 还原,以查看所有条目的效果,即所有font-lock-keywords

您可以在命令的单个调用中以任何顺序执行所有这些操作。

Mo是Facemenu和字体锁定的前缀键,因此我在Icicle模式下将此命令放在键Mo I

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM