[TxMt] Re: Grammar injection. Main grammar taking priority?

Daniel Rodríguez Troitiño notzcoolx at yahoo.es
Wed Jun 1 07:39:12 UTC 2016


Thanks. The recommendations worked. Adding L:(…) around all the injections selector does the trick. I don’t know why it didn’t work for me then, but probably because of the second problem. Simplifying the other selectors and not trying to follow the ERB syntax makes everything a little bit easier to understand (and correctly syntax highlight both languages in the same file).

Thanks a lot for the help!

El lunes, 30 de mayo de 2016 a las 14:36, textmate-request at lists.macromates.com (mailto:textmate-request at lists.macromates.com) escribió:
> On 16 May 2016, at 17:29, Daniel Rodr?guez Troiti?o wrote:
>  
> > A simple version of my grammar looks like this:
> > [?]
> > 'source.swift.gyb - (meta.embedded.block.gyb)' = {
> The injection scope selector should use L:(?) so your injected rules  
> go before Swift?s (as you also write yourself).
>  
> > { begin = '(^|\s*)(?=%\{(?![^\}]*\}%))';
> This seems to be the problem, this rule doesn?t actually match  
> anything as it?s a ?begin of line? assertion and then a ?look  
> ahead? assertion.
>  
> So while the rule ?matches? when you have `%{` at the beginning of a  
> line, no characters are consumed, so we descend into the rule?s  
> patterns, but here we also have the Swift rules, and the L:(?) only  
> affects the priority of the root rules injected (not their children), so  
> the Swift rule will consume the `%` character because it was not  
> consumed by the parent rule?s begin pattern.
>  
> A minimal version of your grammar that works would be this:
>  
> { injections = {
> 'L:(source.swift.gyb - meta.embedded.block.gyb)' = {
> patterns = (
> { name = 'meta.embedded.block.gyb';
> begin = '%\{';
> end = '\}%';
> contentName = 'source.python';
> patterns = ( { include = 'source.python'; } );
> },
> );
> };
> };
> patterns = ( { include = 'source.swift'; } );
> }
>  
> I understand you wanted to scope the leading/trailing whitespace and  
> then re-use the actual matching of %{ and %}, but I don?t think this  
> is possible, though I think it will be simpler to add optional matches  
> like this:
>  
> begin = '(^\s*)?%\{';
> end = '\}%(\s*$)?';
>  
> Then name these captures for  
> `punctuation.whitespace.embedded.[leading|trailing].gyb`.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macromates.com/textmate/attachments/20160601/cc46e251/attachment.html>


More information about the textmate mailing list