Thanks very much for your help! I appreciate the detailed explanation.
Mike
On Jul 18, 2006, at 5:23 PM, Charilaos Skiadas wrote:
On Jul 18, 2006, at 3:33 PM, Mike Miller wrote:
I am attempting to modify the LaTeX Language Grammar so that I may style superscripts and subscripts distinctly. I tried to add the following: { name = 'constant.superscript.latex'; match = '^(\w{1}|{.*?}|\\w*)'; captures = { 1 = { name = 'meta.supersript.latex'; }; }; }, { name = 'constant.subscript.latex'; match = '_(\w{1}|{.*?}|\\w*)'; captures = { 1 = { name = 'meta.subscript.latex'; }; }; },
However, when I invoke the "show scope" command in the TextMate bundle, neither of these scopes will appear. (For example, if I type "Suppose that ${x_n}$ is a sequence..." and put the caret after the underscore, neither "constant.subscript.latex" nor "meta.subscript.latex" appears in the show scope tooltip.)
Try to have something like that outside of dollar signs. Will it match there?
Let me use this opportunity to explain what happens in general. The way TextMate matches things is that at each location it goes through all the top rules in the LaTeX grammar and tries to match the rule starting at each location. If it can't then it moves on. Now let's look at the LaTeX grammar for a second. The first relevant rules we find are these:
{ name = 'string.other.math.latex'; begin = '\('; end = '\)'; patterns = ( { include = 'source.math.tex'; } ); }, { name = 'string.other.math.latex'; begin = '\['; end = '\]'; patterns = ( { include = 'source.math.tex'; } ); },
These are the ones dealing with other kinds of math environments. Since we'll see the same thing with the dollar sign environment in a moment, I'll talk about it then. The next thing we find is:
{ include = 'source.tex'; },
This means that if none of the previous rules has matched, then we try all the rules in source.tex. That's the TeX grammar. Let's go in there, because that's where the dollar sign rules are: { name = 'string.other.math.tex'; begin = '$'; end = '$'; swallow = '\$'; patterns = ( { include = 'source.math.tex'; }, { include = '$self'; }, ); },
This matches a dollar sign until the next unescaped dollar sign (the swallow rule takes care of that, an escaped dollar signs will be eaten by it. ). Note now the patterns part. This shows *all* the things that can match inside the braces. *NO* other rules will apply in there. So if your two rules are not matched by what those patterns see, then they won't be used.
Now these patterns say that one should include everything from source.math.tex. This is the TeX Math grammar, yet another grammar in the LaTeX bundle. This is where you should put your additions to have them matched inside a math environment. I just tried it, and it works just fine. As far as naming goes, this is the standard source of information: http://macromates.com/textmate/manual/ language_grammars#naming_conventions This would be slightly better when you place in in the TeX Math grammar:
{ name = 'constant.superscript.math.tex'; match = '^(\w{1}|{.*?}|\\w*)'; captures = { 1 = { name = 'meta.supersript.latex'; }; }; }, { name = 'constant.subscript.math.tex'; match = '_(\w{1}|{.*?}|\\w*)'; captures = { 1 = { name = 'meta.subscript.latex'; }; }; },
You could consider the _ and ^ characters as constants, but what goes between the braces is certainly not. For instance imagine you have:
$x_{\sin(y)}$
You would clearly want to match the \sin part as a function. Your method treats everything between the braces in a uniform way. What you really want is to use an include command for that part. The way to do that is to take the _{} out of the above two rules, and create two new rules, that use begin-end together with including $self in the patterns.
I hope this is sort of clear, let me know if some part doesn't make sense. The LaTeX/TeX/TeXMath grammars are a very good example of how things should work, but not very easy for grammar beginners.
I am new to regular expressions, but if I do a find and replace with those expressions, they do seem to find all occurrences of subscripts and superscripts. I think I probably don't understand the LaTeX language grammar, since I have trouble understanding even the shortest of grammars!
Also, are my naming conventions even close to correct?
For reference, I'm using TextMate 1.5.2 (r1180) and revision 4405 of the LaTeX bundle from the repository.
Thanks for your help, Mike Miller
Haris
For new threads USE THIS: textmate@lists.macromates.com (threading gets destroyed and the universe will collapse if you don't) http://lists.macromates.com/mailman/listinfo/textmate