[TxMt] Python bundle question/possible bug...

Alexander Ross alex.j.ross at gmail.com
Mon Mar 19 22:57:56 UTC 2007


Hey Nick,

A somewhat simpler (and safer) fix is to move the "endCaptures"
pattern into the outer rule.

I'm the Python bundle maintainer, so I'm glad someone is combing over
the Python grammar looking for bugs.  Please be sure to continue to
note anything funny to the list, or just e-mail me directly.

–Alex

On 3/19/07, Fabry Nicholas F. <nick at superb-sublime.com> wrote:
>
> > Looking at the diff, the b was previously a <, so the intent was to
> > convert \< to \b (because of a change in the regexp library), but
> > accidentally all <'s where converted to b's.
> >
> > I have now reverted this part of r976, better late than never :)
>
> Excellent!  My first bug report and fix!  Most exciting.  Please forgive my
> enthusiasm; I only came to programming in a serious way about a year ago.  I
> was 'inspired' to do so by a custom program my company rolled out that was
> so astonishingly awful that I felt that I had to demonstrate that better
> could be done.  So, a year later, with 20+ newly purchased yet well worn
> O'Reilly titles on my shelf, it's nice to be able to start contributing back
> to projects I like.
>
> In addition, I have found another small problem with the Python bundle - it
> has to do with the way it scopes 'meta.item-access.python' sections.
>
> In particular, it gets confused by the end ], and does not recognize it as
> 'punctuation.definition.arguments.end.python', although it
> recognizes the lead [ correctly as
> 'punctuation.definition.arguments.start.python'.  For
> instance, put the following in TextMate as Python, and note the
> scopes/coloring of the []'s.
>
> pairing_name = findNextWord(packet[row])[0]
>
> The regexes responsible are below, along with my explanation of the problem
> and proposed fix:
>
> { name = 'meta.item-access.python';
>  begin =
> '(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)';
>  end = '(\])';
>  patterns = (
>  { begin =
> '(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\[)';
>  end = '(?=\s*\[)';
>  patterns = ( { include = '#dotted_name'; } );
>  },
>  { begin = '(\[)';
>  end = '(?=\])';
>  beginCaptures = { 1 = { name =
> 'punctuation.definition.arguments.begin.python'; }; };
>  endCaptures = { 1 = { name =
> 'punctuation.definition.arguments.end.python'; }; };
>  patterns = ( { include = '$base'; } );
>  contentName = 'meta.item-access.arguments.python';
>  },
>
>
>
> The problem is that the 'meta.item-access.python' begin regex tags a
> LOCATION, specifically the location of the beginning of the first legit
> Python dotted name followed by a [, thus correctly allowing the [ itself to
> be matched within by
> 'punctuation.definition.arguments.begin.python'.  However,
> the 'meta.item-access.python' end regex tags not the LOCATION of the end ],
> but the end ] itself, thus preventing
> 'punctuation.definition.arguments.end.python' from
> selecting the end ] as it should.  In addition, the regex for
> 'punctuation.definition.arguments.end.python', instead of
> selecting the end ], selects the LOCATION followed by an end ], which gives
> it no characters in its scope!
>
> My proposed fix swaps the two; both the start and end
> 'meta.item-access.python' regexes select for LOCATION, and both
> 'punctuation.definition.arguments.begin.python' and
> 'punctuation.definition.arguments.end.python' select for
> the actual CHARACTERS [ and ].  The code is below, and I have tested that it
> properly scopes the Python constructs now.
>
> { name = 'meta.item-access.python';
>  begin =
> '(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*\s*\[)';
>  end = '(?<=\])';
>  patterns = (
>  { begin =
> '(?=[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*\s*\[)';
>  end = '(?=\s*\[)';
>  patterns = ( { include = '#dotted_name'; } );
>  },
>  { begin = '(\[)';
>  end = '(\])';
>  beginCaptures = { 1 = { name =
> 'punctuation.definition.arguments.begin.python'; }; };
>  endCaptures = { 1 = { name =
> 'punctuation.definition.arguments.end.python'; }; };
>  patterns = ( { include = '$base'; } );
>  contentName = 'meta.item-access.arguments.python';
>  },
>  );
> },
>
> Hope this is helpful - I am (slowly!) looking through the rest of the Python
> language definition to see if there are any other glitches I can spot.
> Cheers,
>
> Nick
>
> ______________________________________________________________________
> For new threads USE THIS: textmate at lists.macromates.com
> (threading gets destroyed and the universe will collapse if you don't)
> http://lists.macromates.com/mailman/listinfo/textmate
>


More information about the textmate mailing list