3

在我制作的一个简单的待办事项列表语言语法中,一些范围在它们的正则表达式规则中重叠,所以某些范围根本没有被识别。我想优先考虑这些范围,以便在另一个范围内识别它们。

目前它看起来像这样:

在此处输入图像描述

范围是:

  • XXam/pm紧急(红色;以or开头的行*
  • 等待(黄色;以 开头的行`
  • 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>

那么,即使在紧急和等待范围内,标签和 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>

此解决方法的限制是标签和 URL 必须位于行尾,否则正常文本会出现在不应出现的位置:

在此处输入图像描述

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

4

0 回答 0