当前位置: 首页 > 知识库问答 >
问题:

VSCode语法突出显示问题:正后视不适用于空格

夏侯臻
2023-03-14

我正在为VSCode开发一个自定义语言语法高亮扩展。我遇到了一个问题,lookbehinds在空白旁边使用时行为异常。

我想强调的代码示例:

variableName :=thisValueShouldHighlight;
variableName := thisValueShouldHighlight;
variableName := thisValueShouldAlsoHighlight,

我尝试使用的代码示例(在tpl.tmLanguage.json中):

"end_variable_assignment": {
    "comment": "Covers ending assignment of a value to a variable. IN PROGRESS",
    "match": "(?<=:=)\\s*(\\w+)(;|,)$",
    "name": "punctuation.accessor.tpl",
    "captures": {
        "1": {
            "name": "entity.name.type.tpl"
        },
        "2": {
            "name": "punctuation.accessor.tpl"
        }
    }
}

此模式包含在(另一个模式中,该模式存在于整个文件中):

{
    "include": "#end_variable_assignment"
}

症结在于正则表达式的\\s*部分。您应该能够执行var:=valuevar:=value:=value之间的任意数量的空格,不管有多少。但是,当我尝试使用它时,我得到了这个:

variableName :=thisHighlightsProperly;
variableName := thisFails;

我也试过< code>\\s和< code>\\s ,但都不起作用。我尝试了一些愚蠢的例子,通过使用一些占位符来确保我的逻辑有效,比如< code >(?

我不明白为什么这是一个问题,因为我在其他地方使用了\\s*没有任何问题(只是不同的情况)。我不认为这是一个属性问题,因为它适用于除空格之外的所有内容。

附加信息:我已经在正则表达式教练和 Regex101.com 上对此进行了测试,它在那里工作。

出于测试目的,我还包括了一个代码的测试示例,应该在这里突出显示:https://drive.google.com/open?id=1yoDXVxW3LFYjejW1wps8ENWUQ4iCal9w

这是我能提供的代码的最小示例:

tpl 1.15 module Pattern_Module_Name;
pattern Pattern_name 1.0
    triggers
        on si := SoftwareInstace created, confirmed where name matches "(?i)SomeRegex";
    end triggers;
    body
        // RE: STACKOVERFLOW PROBLEM
        // As you can see, these aren't highlighting properly

        var_name :=thisShouldHighlight;
        var_name := thisShouldHighlightButDoesnt;
        var_name := thisShouldHighlightButDoesnt,
    end body;
end pattern;

我所有的自定义语言代码都可以在我的GitHub上找到:https://github.com/cdpautsch/vscode-tpl

共有1个答案

巢德华
2023-03-14

所以多亏了@Gama11,我才知道问题出在哪里。另一种模式干扰了第一种模式,但不是以一种我马上就能看到的方式。

有问题的模式应该是变量赋值的结束部分(实际上是赋值),所以它不适用于使用函数或字符串(如预期的那样)。它应该只适用于给有问题的变量赋值数字和其他变量的值。变量赋值的开始部分(获取变量名称并为其赋值)是用单独的块完成的。

乍一看,我并不认为这是个问题,因为已经包含了另一个模式(< code>var_assign),它与< code>:=匹配。< code > begin _ variable _ assignment 模式的问题是它与< code>\\:\\=\\s*匹配。尾随的< code>\\s*就是问题所在。移除它会导致问题再次出现。

简而言之,以下单独模式的匹配都可以和平共处:

":="

"^\\s*(\\w+)\\s*(\\:\\=)"

"(?<=:=)\\s*(\\w+)(;|,)$"

但这将不兼容:

"^\\s*(\\w+)\\s*(\\:\\=)\\s*"

所有这一切都纯粹是通过观察/测试。显然,问题在于重叠,可能是可变长度匹配。

 类似资料:
  • 我环顾四周,找不到一种自动完成这项工作的方法。所以: 我在vim中内置了一些语法高亮,我想转移到vscode。我至少有两个部分卡住了。 到目前为止,我的情况是这样的:我已经构建了一个vscode语言扩展——设置了一些基本的语法规则,并将其复制到vscode config文件夹中。 我遇到麻烦的部分-我可以在某些字段的含义中澄清一下-命名约定。 和语法的嵌套解析,这些东西只出现在其他元素中。 下面是

  • 无论出于什么原因,当我复制/粘贴带有语法高亮的代码时,VSCode正在复制不间断的空格。只要我在VSCode中工作,这就没问题,但在VSCode中复制/粘贴内容时,这是一场噩梦。 我在使用MSWord时,激活了“隐藏字符”功能,这是了解正在发生的事情的一种简单方法。我可以这样复制: 在VSCode中创建一个新文件(无扩展名,未保存),键入一些文本,全选并在MSWord中复制/粘贴- 有什么想法吗?

  • 这在我处理项目时创建了一个新文件后突然发生。几乎所有字符都是简单的白色文本(括号除外,因为我启用了括号对着色) 我已经尝试重置我的配置,检查我的配置(全局和在我的工作区中),并尝试了这个提供替代语法突出显示的扩展(有效,但我更喜欢使用 Visual Studio Code )。

  • 这是我在一个项目中创建新文件后突然发生的。几乎所有的字符都是空白的(括号除外,因为我启用了括号对着色) 点tsx高亮不起作用 点ts突出显示不起作用 点js突出显示不起作用 我已经尝试重置我的配置,检查我的配置(全局地和在我的工作区中),尝试这个提供可选语法突出显示的扩展(这很有效,但是我更喜欢使用VS代码1)

  • 这在我在处理项目时创建了一个新文件后突然发生。几乎所有字符都是简单的白色文本(括号除外,因为我启用了括号对着色) 我已经尝试了重置我的配置,检查了我的配置(包括全局配置和工作区配置),尝试了这个提供可选语法高亮显示的扩展(这很有效,但我更喜欢使用VS Code 1)。