0

I'm confused how nested patterns work in tmLanguage.json When I have the following code:

{
  "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
  "name": "myexample",
  "scopeName": "source.myexample",
  "patterns": [
    {
      "begin": "^(foo):",
      "end": "$",
      "beginCaptures": {
        "1" : {"name": "myfoo"}
      },
      "patterns": [
        {
          "match": "^(bar)",
          "captures": {
            "1" : {"name": "mybar"}
          }
        }
      ]
    }
  ]
}

I'd expect it to match this text:

foo:bar:bar

and capture word foo and first bar but not the second bar However, it only matches foo and nothing else.

If I remove ^ from ^(bar) it matches both bar, but if I replace it with : it matches only second bar

So how do I make sure it captures only first occurrence of bar in the line, but only if it follows after foo: or if it's at the beginning of the entire line?:

foo:bar:bar -> should match
bar:bar -> should match
blah:bar:bar -> should not match

The foo: is optional it may or may not be present and I'd like to avoid duplicating the pattern with something like ^(?!foo:)bar

As I understand from TextMate grammar manual that nested patterns will use text that matched between begin and end of it's parent patterns, which confuses me why using ^ doesn't work or : captures only second occurrence...

Xyu
  • 56
  • 3

0 Answers0