私が作成した単純な to-do リスト言語の文法では、一部のスコープが正規表現規則で重複しているため、特定のスコープがまったく認識されません。これらのスコープを優先して、別のスコープ内で認識されるようにしたいと思います。
現在、次のようになっています。
スコープは次のとおりです。
XXam/pm緊急 (赤、またはで始まる行*)- 待機中 (黄色; で始まる行
`) - url (紫; で始まる単語
http) - タグ (青; で始まる単語
@)
緊急や待機中の行でもタグやURLに色をつけてほしいのですが、現状Scope and Token Inspectorを見ると、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>
では、tag と 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 の後でも緊急スコープまたは待機スコープを継続できます。

