我正在为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:=value
或var:=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
所以多亏了@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)。
知道如何解决吗?