[TxMt] [PATCH] perl quote-like operators

Grant Hollingworth grant at antiflux.org
Thu Nov 16 06:23:30 UTC 2006


I fixed up the scoping and interpolation of some of Perl's quote-like operators: q//, qq//, qw//, qx//, and m//. s///, tr///, and heredocs still need some work.

Attached is the diff and test script.
-------------- next part --------------
Index: info.plist
===================================================================
--- info.plist	(revision 6150)
+++ info.plist	(working copy)
@@ -44,7 +44,6 @@
 	<key>ordering</key>
 	<array>
 		<string>2F3DB2EF-6B9E-4E5F-87A8-3675680E5C0D</string>
-		<string>02196551-D037-4254-8A2F-7A075A628EF1</string>
 		<string>DA0A5F4B-5F16-11D9-B9C3-000D93589AF6</string>
 		<string>DA0A6096-5F16-11D9-B9C3-000D93589AF6</string>
 		<string>CF2CA4F9-82A7-11D9-8753-000D9332809C</string>
@@ -68,9 +67,9 @@
 		<string>4FB403FC-F441-447F-9AAD-E2BE13AD49ED</string>
 		<string>CEE866A5-FA4B-4C5D-A80C-137A620E825E</string>
 		<string>4F1B9AE2-F90C-4A1B-B7D0-FE59D236B12B</string>
-		<string>A08E9AF5-1D0A-48C9-A7A9-25C1E59B02A7</string>
 		<string>EDBFE125-6B1C-11D9-9189-000D93589AF6</string>
 		<string>C1EE8DC8-117D-4BC6-8E69-97D51EAA58D2</string>
+		<string>1B0FB64D-63C1-469E-B0B6-945477603B01</string>
 	</array>
 	<key>uuid</key>
 	<string>4679B572-6227-11D9-BFB1-000D93589AF6</string>
Index: Syntaxes/Perl.plist
===================================================================
--- Syntaxes/Perl.plist	(revision 6150)
+++ Syntaxes/Perl.plist	(working copy)
@@ -1023,11 +1023,128 @@
 				</dict>
 			</dict>
 			<key>match</key>
-			<string>\b(m)\s*(?<!\\)([^A-Za-z0-9\s])(.*?)(?<!\\)(\\{2})*(\2)</string>
+			<string>\b(m)\s*(?<!\\)([^\[\{\(A-Za-z0-9\s])(.*?)(?<!\\)(\\{2})*(\2)</string>
 			<key>name</key>
 			<string>string.regexp.find-m.perl</string>
 		</dict>
 		<dict>
+			<key>begin</key>
+			<string>\b(m)\s*(?<!\\)\(</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\)</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.regexp.find-m-paren.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#nested_parens_interpolated</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>\b(m)\s*(?<!\\)\{</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\}</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.regexp.find-m-brace.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#nested_braces_interpolated</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>\b(m)\s*(?<!\\)\[</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\]</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.regexp.find-m-bracket.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#nested_brackets_interpolated</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
 			<key>captures</key>
 			<dict>
 				<key>1</key>
@@ -1609,7 +1726,7 @@
 		</dict>
 		<dict>
 			<key>begin</key>
-			<string>\bqq([^\(\{\[])</string>
+			<string>\bqq([^\(\{\[\w\s])</string>
 			<key>beginCaptures</key>
 			<dict>
 				<key>0</key>
@@ -1644,6 +1761,41 @@
 		</dict>
 		<dict>
 			<key>begin</key>
+			<string>\bq[wx]([^'\(\{\[\w\s])</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\1</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.quoted.double.q.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
 			<string>"</string>
 			<key>beginCaptures</key>
 			<dict>
@@ -1679,6 +1831,37 @@
 		</dict>
 		<dict>
 			<key>begin</key>
+			<string>\bq([^\(\{\[\w\s])</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\1</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.quoted.single.q.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
 			<string>'</string>
 			<key>beginCaptures</key>
 			<dict>
@@ -1747,7 +1930,7 @@
 		</dict>
 		<dict>
 			<key>begin</key>
-			<string>\bq[qwx]*\(</string>
+			<string>\bq[qwx]\(</string>
 			<key>beginCaptures</key>
 			<dict>
 				<key>0</key>
@@ -1776,13 +1959,17 @@
 				</dict>
 				<dict>
 					<key>include</key>
-					<string>#nested_parens</string>
+					<string>#nested_parens_interpolated</string>
 				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
 			</array>
 		</dict>
 		<dict>
 			<key>begin</key>
-			<string>\bq[qwx]*\{</string>
+			<string>\bq[qwx]\{</string>
 			<key>beginCaptures</key>
 			<dict>
 				<key>0</key>
@@ -1811,13 +1998,17 @@
 				</dict>
 				<dict>
 					<key>include</key>
-					<string>#nested_braces</string>
+					<string>#nested_braces_interpolated</string>
 				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
 			</array>
 		</dict>
 		<dict>
 			<key>begin</key>
-			<string>\bq[qwx]*\[</string>
+			<string>\bq[qwx]\[</string>
 			<key>beginCaptures</key>
 			<dict>
 				<key>0</key>
@@ -1846,6 +2037,115 @@
 				</dict>
 				<dict>
 					<key>include</key>
+					<string>#nested_brackets_interpolated</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#variable</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>\bq\(</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\)</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.quoted.single.q-paren.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#nested_parens</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>\bq\{</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\}</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.quoted.single.q-brace.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
+					<string>#nested_braces</string>
+				</dict>
+			</array>
+		</dict>
+		<dict>
+			<key>begin</key>
+			<string>\bq\[</string>
+			<key>beginCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.begin.perl</string>
+				</dict>
+			</dict>
+			<key>end</key>
+			<string>\]</string>
+			<key>endCaptures</key>
+			<dict>
+				<key>0</key>
+				<dict>
+					<key>name</key>
+					<string>punctuation.definition.string.end.perl</string>
+				</dict>
+			</dict>
+			<key>name</key>
+			<string>string.quoted.single.q-bracket.perl</string>
+			<key>patterns</key>
+			<array>
+				<dict>
+					<key>include</key>
+					<string>#escaped_char</string>
+				</dict>
+				<dict>
+					<key>include</key>
 					<string>#nested_brackets</string>
 				</dict>
 			</array>
@@ -2310,8 +2610,27 @@
 							<key>name</key>
 							<string>punctuation.definition.variable.perl</string>
 						</dict>
+						<key>2</key>
+						<dict>
+							<key>name</key>
+							<string>punctuation.definition.variable.perl</string>
+						</dict>
 					</dict>
 					<key>match</key>
+					<string>(\$\{)(?:[a-zA-Zx7f-xff\$]|::)(?:[a-zA-Z0-9_x7f-xff\$]|::)*(\})</string>
+					<key>name</key>
+					<string>variable.other.readwrite.global.perl</string>
+				</dict>
+				<dict>
+					<key>captures</key>
+					<dict>
+						<key>1</key>
+						<dict>
+							<key>name</key>
+							<string>punctuation.definition.variable.perl</string>
+						</dict>
+					</dict>
+					<key>match</key>
 					<string>([\$\@\%](#)?)[0-9_]\b</string>
 					<key>name</key>
 					<string>variable.other.readwrite.global.special.perl</string>
-------------- next part --------------
#!/usr/bin/env perl -l

my $foo = "WRONG";
my $bar = 'right';

# variables can have braces
print "** variables with braces";
print ${bar};
print;

# double-quoted -- $bar should be highlighted
print "** double-quoted strings";
print "this is $bar";
print qq{this is $bar};
print qq{some${bar}thing};
print qq~this is $bar~;
print qq(this is $bar);
print qq(this is (this is $bar));
print qx{this is {this is (this is $bar)}};
print qw/this is $bar/;
print qq'this is $bar';
print eval{qqwrongw}; # should not be a string\n
print eval{qq{right}};
print <<END;
this is $bar
END
# END should not be a string
# print << END;
# this is $bar
# END

# single-quoted -- $foo should *not* be highlighted
print "** single-quoted strings";
print 'this is $foo';
print q{this is $foo};
print q~this is $foo~;
print q/this is $foo/;
print q{this is {nested $foo}};
print qx'echo $foo';
print for qw'this is $foo';
print eval{qwrongw}; # should not be a string
print <<'END';
this is $foo
END

# regex
m/bar/;
m{bar};
m(bar);
m[bar];
qr/this is $bar/; # interpolated
qr'this is $foo'; # not interpolated
qr{this is monkey};
qr(this is monkey);
eval{qrthisismonkeyt}; # should not be a regex
s{bar}{this is $bar}; # second part should be a double-quoted string
s'bar'this is $foo';  # second part should be a single-quoted string
s/some$bar/is interpolated/;
s/some$/is not interpolated/;
s/bar/this is $bar/;
s/bar/$m = "monkey"/e; # second part should be an expression
s/bar/foo/;  # ditto
tr{abc}{def}; #too much work

s/bar/foo/ #comment
;
s{bar}{foo} #comment
;


More information about the textmate mailing list