Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex VSCode:更改自定义TextMate语法中规则的优先级?_Regex_Visual Studio Code_Syntax Highlighting_Textmate_Tmlanguage - Fatal编程技术网

Regex VSCode:更改自定义TextMate语法中规则的优先级?

Regex VSCode:更改自定义TextMate语法中规则的优先级?,regex,visual-studio-code,syntax-highlighting,textmate,tmlanguage,Regex,Visual Studio Code,Syntax Highlighting,Textmate,Tmlanguage,在我制作的一个简单的to-do列表语言语法中,一些作用域在它们的正则表达式规则中重叠,因此某些作用域根本无法识别。我想赋予这些作用域优先权,以便它们在另一个作用域中被识别 现在看起来是这样的: 范围包括: 紧急(红色;以XXam/pm或*开头的行) 等待(黄色;以`开头的行) url(紫色;以http开头的单词) 标记(蓝色;以@开头的单词) 我希望标记和URL即使在紧急或等待行中也要着色,但目前范围和令牌检查器显示第2行和第3行的全部内容都是紧急范围,第4行的所有内容都是等待范围,即使这

在我制作的一个简单的to-do列表语言语法中,一些作用域在它们的正则表达式规则中重叠,因此某些作用域根本无法识别。我想赋予这些作用域优先权,以便它们在另一个作用域中被识别

现在看起来是这样的:

范围包括:

  • 紧急(红色;以
    XXam/pm
    *
    开头的行)
  • 等待(黄色;以
    `
    开头的行)
  • url(紫色;以http开头的单词)
  • 标记(蓝色;以
    @
    开头的单词)
我希望标记和URL即使在紧急或等待行中也要着色,但目前范围和令牌检查器显示第2行和第3行的全部内容都是紧急范围,第4行的所有内容都是等待范围,即使这些行中应该有标记和URL

我尝试过颠倒.tmLanguage文件中定义的顺序,但没有任何区别。以下是这些定义:

<dict>
  <key>match</key>
  <string>\B\@\w+</string>
  <key>name</key>
  <string>constant.language.tag.todotxt</string>
</dict>
<dict>
  <key>match</key>
  <string>http.*?( |$)</string>
  <key>name</key>
  <string>constant.language.url.todotxt</string>
</dict>
<dict>
  <key>match</key>
  <string>^`.*$</string>
  <key>name</key>
  <string>constant.language.waiting.todotxt</string>
</dict>
<dict>
  <key>match</key>
  <string>^\*.*$|^\d.{0,5}[ap]m.*$</string>
  <key>name</key>
  <string>constant.language.urgent.todotxt</string>
</dict>

比赛
\B\@\w+
名称
constant.language.tag.todoText
比赛
http.*?(|$)
名称
constant.language.url.todoText
比赛
^`.*$
名称
constant.language.waiting.todoText
比赛
^\*.*$|^\d.{0,5}[ap]m*$
名称
constant.language.emergency.todoText
那么,即使标记和url范围在紧急和等待范围内,要识别它们还需要做哪些更改

更新:不完善的解决方法 我可以通过使用以下正则表达式,在行中遇到标记或url时立即结束紧急和等待作用域(红色和黄色),从而防止作用域重叠:

<key>match</key>
<string>^`.*?(?= @| http|$)</string>
<key>name</key>
<string>constant.language.waiting.todotxt</string>
...
<key>match</key>
<string>(^\*.*?|^\d.{0,5}[ap]m.*?)(?= @| http|$)</string>
<key>name</key>
<string>constant.language.urgent.todotxt</string>
匹配
^`.*(?=@| http |$)
名称
constant.language.waiting.todoText
...
比赛
(^\*.?^\d.{0,5}[ap]m.*)(=@| http |$)
名称
constant.language.emergency.todoText
此解决方案的限制是标记和URL必须位于行的末尾,否则正常文本将出现在不应该出现的位置:


理想情况下,我仍然希望在紧急和等待范围内识别标签和URL,使紧急或等待范围能够继续,即使在行中的标签和/或URL之后。

是否类似于CSS,其中顺序重要,最后一个匹配匹配的选择器?@ GrangHhanpEtha:这也是我所想的,但是颠倒顺序(url和标记定义在底部)没有任何区别。我保持了上述顺序,因为对一个相关问题的回答表明,更接近顶部的定义具有优先权:与您的问题无关,但命名范围的惯例是将整个范围名称(
todotxt
在您的情况下)排在最后。所以,它应该是
constant.language.url.todoText
constant.language.waiting.todoText
,等等@MattDMo谢谢!我已经更新了作用域名称以遵循该约定。这对我来说是全新的,正如你可能知道的:)这就像css一样,顺序很重要,最后一个匹配的选择器会赢吗?@Grahampsheath我也是这么想的,但是颠倒顺序(url和标记定义在底部)没有任何区别。我保持了上述顺序,因为对一个相关问题的回答表明,更接近顶部的定义具有优先权:与您的问题无关,但命名范围的惯例是将整个范围名称(
todotxt
在您的情况下)排在最后。所以,它应该是
constant.language.url.todoText
constant.language.waiting.todoText
,等等@MattDMo谢谢!我已经更新了作用域名称以遵循该约定。这对我来说是全新的,你可能会说:)