VS Code for Raku 中的多行注释

Sum*_*nal 8 github visual-studio-code raku

我使用 VS Code 来编写Raku代码。

它正确显示单行注释。

# this is single-line comment!

Run Code Online (Sandbox Code Playgroud)

然而,它与嵌入式、多行和 pod 注释不同。请参阅下面的片段:

在此输入图像描述

在此输入图像描述

在此输入图像描述

Raku

嵌入的评论是

if #`( This is an inline comment here? ) True {
    say "Raku is awesome";
}
Run Code Online (Sandbox Code Playgroud)

多行注释是

#`[
And this is how a multiline comment would work.
That says why we do what we do below.
]
say "Raku is awesome";

Run Code Online (Sandbox Code Playgroud)

pod 评论是

=begin comment
 
Here are several
lines
of comment
 
=end comment

say "Hello";

Run Code Online (Sandbox Code Playgroud)

问题是,一旦 VS code 看到#,它就会注释掉整行,而嵌入注释中不应出现这种情况。更多详细信息请参见此处

Raku 为了理解,我看到了https://github.com/microsoft/vscode/blob/main/extensions/perl/perl6.language-configuration.json的源配置文件(大约 2 年没有更新!)。尝试了一些修改

"comments": {
        // symbol used for single line comment. Remove this entry if your language does not support line comments
        "lineComment": "#",
        // symbols used for start and end a block comment. Remove this entry if your language does not support block comments
        "blockComment": [
           [ "/*", "*/" ],
           ["#`(", ")"],
           ["#`[", "]"],
           ["#`{", "}"],
           ["#`<", ">"],
           ["=begin", "=end"]
        ]
Run Code Online (Sandbox Code Playgroud)

但似乎不起作用。

我怎样才能让它以正确的方式工作?

rai*_*iph 10

TL;DR如果我们真的很幸运的话,我已经解决了你的问题。更有可能的是我只是提供了一些值得深思的东西。

我尽力解决您 Q 中的问题

首先,让我尝试解决/讨论您所写的两个具体问题。

        // symbol used for single line comment.
        "lineComment": "#",
Run Code Online (Sandbox Code Playgroud)

浏览完 VS Code 文档后,我初步猜测该字符串是VS Code 文档中提到的Textmate 语法"#"支持的方言中的正则表达式。这表明,如果使用 PCRE 正则表达式方言:

        // symbol used for single line comment.
        "lineComment": "#(?!`[(\[{<])"
Run Code Online (Sandbox Code Playgroud)

这里的要点是确保“符号”正则表达式(假设它是正则表达式)与以开头的代码或您在块注释配置中允许的其他变体不匹配。#`(

继续:

        // symbols used for start and end a block comment.
       "blockComment": [
           [ "/*", "*/" ],
           ["#`(", ")"],
           ["#`[", "]"],
           ["#`{", "}"],
           ["#`<", ">"],
           ["=begin", "=end"]
        ]
Run Code Online (Sandbox Code Playgroud)

首先,我认为[ "/*", "*/" ],应该删除该行。Raku 不支持这种形式的块评论。

接下来,浏览了上面链接的 Textmate 页面后,似乎这可能适用于使用以下内容的最后一点=begin foo

           ["^=begin\s+(\w+)", "\n=end\s+\1"]
Run Code Online (Sandbox Code Playgroud)

这里的要点是:

  1. 捕获后面的评论标识符。​ (我使用该语法是因为这是用于捕获的正则表达式方言中最常见的语法,就像它在 Raku 正则表达式中一样。)我编写的模式只是匹配简单的标识符,但它是一个开始,假设,如前所述,这些 VS Code“符号”字符串确实是正则表达式。=begin(...)\w+

  2. 插入在 后捕获的任何内容=end。(是正则表达式方言中最常见的语法,用于插入第一个编号的捕获。这对应于Raku 正则表达式中使用的\1语法。)$0

我还添加了:

  • A位于行首时限制匹配^=begin但也许应该删除该正则表达式才能与 VS Code 一起使用。

  • 出于同样的原因,A\n之前。=end(但我的猜测是,这^对于 来说是正确的,=begin而对于 来说则\n是正确的=end。)

下一个最佳镜头

如果这些更改不起作用即使起作用,也可以尝试摆弄它们,和/或使用正则表达式测试工具(例如 regex101.com)进行实验,和/或阅读 Textmate 技术支持的正则表达式方言(VS Code 文档中有链接;我在准备上述建议时阅读了一些语言语法)。

我必须说我很难理解 Textmate 文档(轻描淡写!)。因此,如果上述方法不起作用,并且您也无法弄清楚,那么也许我们应该[textmate]在您的 Q 中添加一个标签,以尝试吸引了解 VS Code 正则表达式方言/方面的人员的注意。


即使解决了这两个问题,至少对于简单的情况来说,还会有很多其他问题。Raku 的语法很复杂!

这个答案的其余部分涵盖了更大的图景,不是专门解决使用语法突出显示的这些特定问题,而是使工具正确、高效且可维护地突出显示 Raku 代码的整体问题。

更大的图景

我怎样才能让它以正确的方式工作?

如果是我,我会看看其他工具中语法突出显示所取得的成就。其中任何一个可以正确突出你的例子吗?如果是这样,他们是如何做到这一点的?他们使用什么正则表达式方言以及什么正则表达式模式?

具体来说:

  • CommaIDE 可以处理你的例子吗?如果是这样,那么无论它使用方法 1 还是方法 2,如果可以的话,在 VS Code 中使用相同的方法或类似的方法可能是有意义的。

  • emacs 或 vi 怎么样?如果其中任何一个都有效,它们使用什么正则表达式方言/引擎,您可以在 VS Code 中使用相同的正则表达式吗?

两种方法

无论定制的编辑器/IDE 是 VS code 还是任何其他,都值得明确以下两种不同的方法来执行此类操作:

  1. 创建 Raku 语法和动作类,并将 Rakudo 和此语法插入到工具中。

  2. 在某些正则表达式引擎中创建(非 Raku)正则表达式并将其插入工具中。

根据使用哪种方法,会面临不同的挑战:

  1. Raku 的语法具有挑战性

    我们知道可以编写一个 Raku 语法来完美保真地解析它——因为这正是 Rakudo 解析 Raku 代码的方式。如果一个工具允许将语法和乐道插入到该工具中,那么这将是“最简单”的解决方案——除非它只有在克服下一个挑战时才成为一个解决方案,也就是说,即使一个工具确实做到了这一点支持插入 Rakudo ——最合适的标准方法是 LSP [1] —— 你会遇到性能问题:

    1.1 Rakudo总体来说很慢,尤其是它的语法引擎

    1.2 需要(至少在原则上)语法突出显示等功能来重新处理每次插入或删除字符时正在编辑的所有代码,以便知道如何解析它。

    许多 PL 的语法/编译器都易于处理且性能可接受。一些现代解析技术和/或编译器特别关注增量解析,通过在解析之间对代码进行微小的更改,可以从根本上加快重新处理代码的速度。

    就 Raku(do) 的现状而言(至少在这十年的剩余时间里似乎是这样),这是一个大问题。如果/当重写语法引擎时,事情可能会发生重大变化,我认为这可能会在 2023-2025 年的时间范围内发生,但与此同时,Rakudo 解析速度不够快,无法成为使用 LSP 的语法突出显示解决方案,这在某种程度上似乎是合理的或类似的。

    (这就是为什么CommaIDE 不使用Rakudo进行语法突出显示,而是使用更快/更增量的单独解析器。)

这导致了第二种方法,即您当前正在尝试使用的方法:

  1. 用于在工具中语法突出显示代码的主要其他方法是用给定编辑器或其他工具支持的某种非 Raku 正则表达式方言编写正则表达式。这种方法带来了自己的一系列挑战:

    2.1 该工具与正则表达式的交互方式是否使它们有机会匹配要突出显示的元素?

    2.2 如果存在这种机会,工具支持的给定正则表达式方言是否有足够的能力来正确进行匹配?

    2.3 如果一种方言具有足够的力量,那么这种力量是否可以由具有足够技能和决心的人来运用,并且突出显示将足够完整和快速?编写一个通常会明显减慢打字速度的荧光笔是没有意义的。

    2.4 如果 VS Code 提供了足够的机会来挂钩正则表达式,并且正则表达式方言具有足够的功能,并且应用了足够的技能和决心,然后进行维护,那么这将是个好消息。

VS Code 中的两种方法

将语法突出显示指南中的引文与我的评论穿插在一起:

VS Code 的标记化引擎由TextMate 语法提供支持。TextMate 语法是正则表达式的结构化集合...

所以这是2上面列表中的解决方案——“用一些非 Raku 正则表达式方言编写正则表达式”。这就导致了我列出的子问题。

VS Code 还允许扩展通过语义令牌提供程序提供令牌化。

听起来可能第一种方法,在 Raku 特定语言服务器中使用 Rakudo。我认为至少在短期内,这几乎不可能足够快地实现基本语法突出显示,但也许我错了。

语义提供者通常由对源文件有更深入理解的语言服务器实现......语义突出显示位于语法突出显示之上。由于语言服务器可能需要一段时间来加载和分析项目,因此语义标记突出显示可能会在短暂的延迟后出现。

两个注意问题:

  • 他们说他们的设计是这样的:这种方法“位于”方法 2之上,但有延迟。因此,即使 Rakudo速度很快,这种方法似乎也不适用于大多数 PL 的基本突出显示。

  • 他们将延迟描述为“短暂”。这显然是有点模糊——允许 PL 具有快速/增量解析器,但也允许没有它们的 PL——但我怀疑他们没有考虑到 Raku(do) 解析有多慢,尤其是 Raku 代码!

脚注

[1] LSP =语言服务器协议