Regex 如何测试Emacs Lisp代码的“字体锁定关键字”值

Regex 如何测试Emacs Lisp代码的“字体锁定关键字”值,regex,emacs,elisp,syntax-highlighting,font-lock,Regex,Emacs,Elisp,Syntax Highlighting,Font Lock,我提出这个问题是因为我认为这个问题和可能的答案可能会帮助编写定义字体锁定关键字的Lisp代码的Emacs用户。我提供了一个我认为有帮助的答案。我还对其他答案感兴趣 该变量的值是一个表达式列表,每个表达式可以指定一个或多个要匹配的模式或要执行匹配的函数,以及一个或多个用于突出显示匹配文本的面。font-lock关键字值的可能性是众多而复杂的。(描述这一点的文档是Elisp手册节点。) 在大多数情况下,列表有多个元素,这意味着有多个regexp模式。它们可以以不同的方式相互作用。有些人可以阻止其他人

我提出这个问题是因为我认为这个问题和可能的答案可能会帮助编写定义
字体锁定关键字的Lisp代码的Emacs用户。我提供了一个我认为有帮助的答案。我还对其他答案感兴趣

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

在大多数情况下,列表有多个元素,这意味着有多个regexp模式。它们可以以不同的方式相互作用。有些人可以阻止其他人生效,或者他们可以改变其他人的效果。例如,我的库在Dired模式下定义了
字体锁定关键字
,其中有31个条目(regexp),其中许多条目相互作用

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


(好的,我知道大多数Elisp编码人员不会编写超复杂的
字体锁定关键字定义。但即使对于简单的定义,这也会变得复杂。如果这个过程更简单,用户可能不会不必要地将自己限制为仅一个或两个条目。)

为了解决这个问题,我编写了一个,
冰柱字体锁定关键字
。它允许您执行以下操作:

  • 在单独的
    字体锁定关键字
    条目(模式)之间循环,分别应用它们以查看每个条目的效果

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

  • 选择一个条目集,并按照条目在
    字体锁定关键字
    中出现的相同顺序应用它。您可以对任意数量的集合执行此操作

  • 按选择顺序累积多组条目的效果

  • 还原,查看所有条目的效果,即所有
    字体锁定关键字

您可以按任何顺序,在一次命令调用中完成所有这些


M-o
是用于面部菜单和字体锁定的前缀键,因此在冰柱模式下,我将此命令置于
M-o I
键上。

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

字体锁定studio-字体锁定关键字的交互式调试器 Font Lock Studio是一个用于字体锁定的交互式调试器 关键词(Emacs语法突出显示规则)

介绍 Font Lock Studio允许您单步锁定字体关键字-- 匹配器、高光和锚定规则,以便您可以看到 缓冲区格式化时发生。可以在或上设置断点 遵守规则,一直跑到被击中为止。在规则内时, 使用背景色调色板可视化匹配。这个 解释者可以用纯文本英语描述规则。紧的 与Edebug的集成允许您逐步使用Lisp表达式 这是字体锁定关键字的一部分

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

启动Font Lock Studio时,注释和字符串将被删除 预着色,因为它们是早期语法阶段的一部分 (字体锁定Studio不支持此功能)

通过键入“M-x字体锁定studio RET”启动调试器。按
或查看可用命令的菜单

例子 对于使用
html模式的缓冲区
,接口缓冲区看起来 下列的其他主要模式通常具有越来越复杂的特性 规则。左侧的箭头指示当前活动位置。 源缓冲区中的相应箭头位于当前位置 搜索位置

        ========================
        === 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
关键词

      ("xyz" (0 font-lock-type-face))
如图所示。有关详细信息,请参见
font-lock studio规范化关键字

解释者 解释者呼应了人类对当前事件的易读描述 部分字体锁定关键字。这有助于你理解这一点 规则中所有的
nil
:s和
t
:s实际上是指

使用自动解释程序时,Font Lock Studio会回显 每个命令后都有解释

Edebug——Emacs Lisp调试器 与Edebug的紧密集成允许您使用单步表达式 嵌入在界面缓冲区中的关键字中,它允许您 在调用函数的源文件中插入调试工具

跟随模式感知 源缓冲区中的搜索位置由 覆盖箭头,并通过更新点。如果源缓冲区是 在多个并排窗口中可见,跟随模式为 启用后,搜索位置将显示在适当的窗口中,以便
最小化滚动。

在查看如何下载时,看不到存档。@AndreasRöhler-对不起,我不知道你的意思。有几种方法可以获取冰柱文件,包括从MELPA获取。你尝试了什么,你遇到了什么问题?几周前我问自己同样的问题,写了几个字体锁定软件包,但没有找到好的答案。因此,我开始编写一个交互式字体锁定调试器,您可以在其中单步遍历字体锁定关键字,并将调试器和源缓冲区中的匹配可视化。我还没有完成它,但我会在适当的时候发布它。在等待的时候,您可以查看我的回归测试系统中的字体锁定关键字:听起来很有用,代码看起来也不错。你显然在我身上花了很多功夫
      ("xyz" (0 font-lock-type-face))