I have the following language grammar defined for Java Properties files. This grammar works as expected in TM-1, however, there are two separate problems when using this grammar with TM-2.
1. The end capture for a 'Property Definition' does not properly skip a newline preceded by a backslash and thus does not recognize continued lines. 2. The pattern '{\d+}' is not being recognized to set the 'entity.name.variable.java-props' scope. This pattern does match properly in a simple grammar where it is the only pattern however. (This pattern is not part of java properties but I'm using the property files to store strings that will be used with the java.text formatters.)
Perhaps there is a better way to describe this grammar, I'm no expert. But since it does work correctly in TM-1 I wanted to report it as potential defects in TM-2.
Thanks, Curt
{ scopeName = 'source.java-props'; fileTypes = ( 'properties' ); patterns = ( { name = 'comment.line.number-sign.java-props'; match = '^\s*([#!])(.+)?$\n?'; captures = { 1 = { name = 'punctuation.definition.comment.java-props'; }; }; }, { comment = 'Empty Property Definition'; match = '^\s*((?:\:|\=|[^:=\s])+)\s*([:=])\s*$'; captures = { 1 = { name = 'keyword.other.java-props'; }; 2 = { name = 'punctuation.separator.key-value.java-props'; }; }; }, { comment = 'Property Definition'; begin = '^\s*((?:\:|\=|[^:=\s])+)\s*([:=])\s*'; end = '(?<!\{1})$\n?'; beginCaptures = { 1 = { name = 'keyword.other.java-props'; }; 2 = { name = 'punctuation.separator.key-value.java-props'; }; }; patterns = ( { name = 'entity.name.variable.java-props'; match = '{\d+}'; }, { comment = 'Leading space on a continued line is ignored'; match = '^\s*'; }, { name = 'punctuation.separator.continuation.java-props'; match = '(\)(?=$\n)'; }, { name = 'constant.character.escape.java-props'; match = '\(?:[\nt"'']|u[0-9A-Fa-f]{4})'; }, { name = 'invalid.illegal.character.escape.java-props'; match = '\.'; }, { name = 'string.java-props'; match = '.'; }, ); }, { comment = 'Ignore blank lines'; match = '^\s*$'; }, { name = 'invalid.illegal.java-props'; comment = 'Anything else is illegal'; match = '.*'; }, ); }