[TxMt] lang grammar regex and complex language constructs
Allan Odgaard
throw-away-1 at macromates.com
Sun May 21 09:17:08 UTC 2006
On 21/5/2006, at 0:23, marios buttner wrote:
> You can see the pref snippet that I used to test the above below.:
>
> Sample.:
> { name = 'keyword.control.txp';
> match =
> '(["|\s]?<txp:.+\s/>["|\s]?|["|\s]*?<txp:.+>["|\s]*?|["|\s]?</txp:.
> +>["|\s]?)';
> },
> (works, but not with the complex constructs, like mentioned above.)
>
> Problem.: Some of these instances make it difficult to construct the
> regular expressions.
> Possible Solution.: Could be excluded with negates whenever occurs
> (That would be rather hackyish and not elegant)
I don’t have a good sense of the language, but another option is to
split up the fragment into multiple parts and use begin/end matches.
Similar to how HTML tags are matched, where there is both a name,
attributes, and potential embedded Ruby, PHP, etc.
> 2) Furthermore the reason, why I opted for a "source txp.scope"
> rather
> then the other easier and integrable solution and attempt everything
> from scratch, is that there is not a real hierarchy between html
> and txp
> forms and pages, so I thought it would be more expandable and
> extensible
> in that way.
> Question: Is that so ?
> Or am I terribly wrong ?
There are two types of inheritance in TextMate.
First there is simply including another language grammar in the new
one. E.g. C++ includes the C grammar and thereby inherit all the C
rules. Here the including grammar can override rules included, simply
by matching the same stuff but before doing the include.
The other type is in scope name. This has nothing to do with the
actual language grammar matching, but it is instead used in the
context of scope selecotrs.
For example there is a `table` snippet which inserts an HTML table.
The scope selector for this is `text.html` and all languages which
have a scope name starting with `text.html` will provide this snippet
(e.g. `text.html.markdown`) -- one can override such inheritance by
creating a new item which use the same key equivalent / tab trigger,
but give it a more specific scope.
For Textpattern, you do want a scope name of `text.html.textpattern`
if the functionality in the HTML bundle is useful in the context of
txp (like converting to/from entities, creating tags, inserting HTML
snippets, etc.).
Even if only a subset is useful, it still makes sense to inherit the
scope name, as one can always override the functionality which is
different for the inheriting scope, and/or ignore that it exists.
Though should you decide to keep your new scope, you should inherit
from text rather than source, if this is markup.
> 3)Question: Is the p.list format going to change to a xml format
> for the
> Language grammars. ?
Not inside the language editor. It is however stored as XML on-disk
(and actually binary plists in the default bundles).
> 4) I made two variants of a preliminary bundle for the Grammar,
> would it
> make sense to submit those to repository, once they reach an
> acceptable
> stage ?
If others may find it useful, yes.
> 5) [...] Is it correct to suspect that the element names themselves
> are
> irrelevant for the inner functioning of the language grammar ?
Yes -- only the scope selector means something.
More information about the textmate
mailing list