2 <!DOCTYPE MODE SYSTEM "xmode.dtd">
3 <!-- Ruby mode by Ian Maclean (Ruby edit mode v0.7.4) -->
4 <!-- tweakage by Chris Morris - clabs.org -->
5 <!-- further tweakage by Christophe Grandsire -->
6 <!-- further tweakage by Robert McKinnon 2004 -->
7 <!-- Major overhaul by Karl von Laudermann -->
8 <!-- More tweakage by Jim Morris (wolfmanjm), adds electric unindent for else, elsif, rescue, end -->
9 <!-- More tweakage by Jim Morris (wolfmanjm), fixed when statements for most cases -->
10 <!-- recommended mode catalog entry:
11 <MODE NAME="ruby" FILE="ruby.xml" FILE_NAME_GLOB="*.{rb,rbw}" FIRST_LINE_GLOB="#!*/*ruby*" /> -->
14 <PROPERTY NAME="indentOpenBrackets" VALUE="{"/>
15 <PROPERTY NAME="indentCloseBrackets" VALUE="}"/>
16 <PROPERTY NAME="unalignedOpenBrackets" VALUE="("/>
17 <PROPERTY NAME="unalignedCloseBrackets" VALUE=")"/>
18 <PROPERTY NAME="lineUpClosingBracket" VALUE="true"/>
19 <PROPERTY NAME="commentStart" VALUE="=begin"/>
20 <PROPERTY NAME="commentEnd" VALUE="=end"/>
21 <PROPERTY NAME="lineComment" VALUE="#"/>
22 <PROPERTY NAME="indentNextLines"
23 VALUE="[^#]*\s+do(\s*|(\s+\|.+\|\s*))|\s*(if\s+.*|elsif.*|else.*|do(\s*|\s+.*)|case\s+.*|when\s+.*|while\s+.*|for\s+.*|until\s+.*|loop\s+.*|def\s+.*|class\s+.*|module\s+.*|begin.*|unless\s+.*|rescue.*|ensure.*)+"/>
24 <PROPERTY NAME="unindentThisLine" VALUE="^\s*(else.*|end\s*|elsif.*|rescue.*|when.*|ensure.*)$"/>
25 <PROPERTY NAME="unindentNextLines" VALUE="^\s*(end\s*|else.*|rescue.*|elsif.*|when.*|ensure.*)$"/>
26 <PROPERTY NAME="indentNextLine"
27 VALUE="^[^#]*([^$](:|\+|~|\*|-|%|<|>|&|\^|\.|=)|\s(/|\!|\?|\|)|\b(not|and|or)|\\)\s*$"/>
28 <PROPERTY NAME="electricKeys" VALUE="edfn"/>
30 <RULES IGNORE_CASE="FALSE" HIGHLIGHT_DIGITS="TRUE"
31 DIGIT_RE="(0b[01]([01_]*[01])?)|(0x[\p{XDigit}]([\p{XDigit}_]*[\p{XDigit}])?)|(0([0-7_]*[0-7])?)|(0d[0-9]([0-9_]*[0-9])?)|([1-9]([0-9_]*[0-9])?)|([0-9]([0-9_]*[0-9])?[Ee]([0-9]([0-9_]*[0-9])?)?)">
32 <!-- ^ Binary literal | ^ Hex literal | ^ Octal literal | ^ "0d" Style Dec lit | ^ Normal Dec literal | ^ Float literal w/out dec point, with exp. -->
34 <!-- Ruby comment (Inline Documentation ) -->
35 <SPAN TYPE="COMMENT2">
37 <END AT_LINE_START="TRUE">=end</END>
40 <!-- Class and instance vars -->
41 <MARK_FOLLOWING TYPE="KEYWORD4">@</MARK_FOLLOWING>
43 <!-- Method, class and modules names -->
44 <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1">\bdef\b</MARK_FOLLOWING>
45 <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1">\bundef\b</MARK_FOLLOWING>
46 <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1">\bclass\b</MARK_FOLLOWING>
47 <MARK_FOLLOWING TYPE="FUNCTION" MATCH_TYPE="KEYWORD1">\bmodule\b</MARK_FOLLOWING>
49 <!-- String literals -->
50 <SPAN TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
55 <SPAN TYPE="LITERAL1" ESCAPE="\">
60 <!-- %Q(Hello world) %(Hello world)-->
61 <SPAN_REGEXP HASH_CHAR="%" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
66 <!-- %q(Hello world) -->
67 <SPAN TYPE="LITERAL1" ESCAPE="\">
72 <!-- %Q{Hello world} %{Hello world} -->
73 <SPAN_REGEXP HASH_CHAR="%" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
78 <!-- %q{Hello world} -->
79 <SPAN TYPE="LITERAL1" ESCAPE="\">
84 <!-- %Q[Hello world] %[Hello world] -->
85 <SPAN_REGEXP HASH_CHAR="%" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
90 <!-- %q[Hello world] -->
91 <SPAN TYPE="LITERAL1" ESCAPE="\">
96 <!-- %Q<Hello world> %<Hello world> -->
97 <SPAN_REGEXP HASH_CHAR="%" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
98 <BEGIN>%Q?<</BEGIN>
102 <!-- %q<Hello world> -->
103 <SPAN TYPE="LITERAL1" ESCAPE="\">
104 <BEGIN>%q<</BEGIN>
108 <!-- I made the next three forms as three instead of two, because the
109 first two actually support whitespace as a delimiter, and the third
111 <!-- %Q$Hello world$ -->
112 <SPAN_REGEXP HASH_CHAR="%Q" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
113 <BEGIN>%Q([^\p{Alnum}])</BEGIN>
117 <!-- %q$Hello world$ -->
118 <SPAN_REGEXP HASH_CHAR="%q" TYPE="LITERAL1" ESCAPE="\">
119 <BEGIN>%q([^\p{Alnum}])</BEGIN>
123 <!-- %$Hello world$ -->
124 <SPAN_REGEXP HASH_CHAR="%" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
125 <BEGIN>%([^\p{Alnum}\p{Space}])</BEGIN>
129 <!-- %W(Array of strings) -->
130 <SPAN TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
135 <!-- %w(Array of strings) -->
136 <SPAN TYPE="LITERAL1" ESCAPE="\">
141 <!-- %W{Array of strings} -->
142 <SPAN TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
147 <!-- %w{Array of strings} -->
148 <SPAN TYPE="LITERAL1" ESCAPE="\">
153 <!-- %W[Array of strings] -->
154 <SPAN TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
159 <!-- %w[Array of strings] -->
160 <SPAN TYPE="LITERAL1" ESCAPE="\">
165 <!-- %W<Array of strings> -->
166 <SPAN TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
167 <BEGIN>%W<</BEGIN>
171 <!-- %w<Array of strings> -->
172 <SPAN TYPE="LITERAL1" ESCAPE="\">
173 <BEGIN>%w<</BEGIN>
177 <!-- %W$Array of strings$ -->
178 <SPAN_REGEXP HASH_CHAR="%W" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
179 <BEGIN>%W([^\p{Alnum}\p{Space}])</BEGIN>
183 <!-- %w@Array of strings@ -->
184 <SPAN_REGEXP HASH_CHAR="%w" TYPE="LITERAL1" ESCAPE="\">
185 <BEGIN>%w([^\p{Alnum}\p{Space}])</BEGIN>
189 <!-- Here documents <<"FOO" <<-"FOO" -->
190 <!-- Unfortunately, in a SPAN_REGEXP element only the <BEGIN> tag takes
191 a regex, not the <END> tag. So an instance of FOO anywhere in the here
192 document will terminate highlighting; I couldn't make it smarter. -->
193 <SPAN_REGEXP HASH_CHAR="<<" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
194 <BEGIN><<-?"([\p{Graph}]+)"</BEGIN>
195 <END REGEXP="TRUE">^\S*$1$</END>
198 <!-- Here documents <<'FOO' <<-'FOO' -->
199 <!-- Unfortunately, in a SPAN_REGEXP element only the <BEGIN> tag takes
200 a regex, not the <END> tag. So an instance of FOO anywhere in the here
201 document will terminate highlighting; I couldn't make it smarter. -->
202 <SPAN_REGEXP HASH_CHAR="<<" TYPE="LITERAL1">
203 <BEGIN><<-?'([\p{Graph}]+)'</BEGIN>
204 <END REGEXP="TRUE">^\S*$1$</END>
207 <!-- Here documents <<FOO <<-FOO -->
208 <!-- Unfortunately, in a SPAN_REGEXP element only the <BEGIN> tag takes
209 a regex, not the <END> tag. So an instance of FOO anywhere in the here
210 document will terminate highlighting; I couldn't make it smarter. -->
211 <SPAN_REGEXP HASH_CHAR="<<" TYPE="LITERAL1" DELEGATE="doubleQuoteLiteral">
212 <BEGIN><<-?([A-Za-z_]+)</BEGIN>
213 <END REGEXP="TRUE">^\S*$1$</END>
216 <!-- Shell command strings -->
219 <SPAN TYPE="LITERAL2" DELEGATE="BackquoteLiteral">
224 <!-- %x(echo foo) -->
225 <SPAN TYPE="LITERAL2" DELEGATE="BackquoteLiteral">
230 <!-- %x{echo foo} -->
231 <SPAN TYPE="LITERAL2" DELEGATE="BackquoteLiteral">
236 <!-- %x[echo foo] -->
237 <SPAN TYPE="LITERAL2" DELEGATE="BackquoteLiteral">
242 <!-- %x<echo foo> -->
243 <SPAN TYPE="LITERAL2" DELEGATE="BackquoteLiteral">
244 <BEGIN>%x<</BEGIN>
248 <!-- %x$echo foo$ -->
249 <SPAN_REGEXP HASH_CHAR="%x" TYPE="LITERAL2" DELEGATE="BackquoteLiteral">
250 <BEGIN>%x([^\p{Alnum}\p{Space}])</BEGIN>
254 <!-- Regular expressions -->
257 <!-- If a regexp begins with a whitespace (including a newline),
258 the beginning "/" is wrongly treated as a division operator.
259 But such regexp is rare enough and one can use %r notations
260 or write like "/\ ..." to force jEdit to treat it as a
262 <SEQ_REGEXP HASH_CHAR="/" TYPE="OPERATOR">/=?($|\s)</SEQ_REGEXP>
263 <!-- AT_WORD_START is TRUE not to handle "a/b/c". -->
264 <SPAN AT_WORD_START="TRUE" TYPE="LITERAL3" DELEGATE="RegexpLiteral">
270 <SPAN TYPE="LITERAL3" DELEGATE="RegexpLiteral">
276 <SPAN TYPE="LITERAL3" DELEGATE="RegexpLiteral">
282 <SPAN TYPE="LITERAL3" DELEGATE="RegexpLiteral">
288 <SPAN TYPE="LITERAL3" DELEGATE="RegexpLiteral">
289 <BEGIN>%r<</BEGIN>
294 <SPAN_REGEXP HASH_CHAR="%r" TYPE="LITERAL3" DELEGATE="RegexpLiteral">
295 <BEGIN>%r([^\p{Alnum}\p{Space}])</BEGIN>
300 <EOL_SPAN TYPE="COMMENT1">#</EOL_SPAN>
302 <!-- Predefined global variables -->
303 <SEQ_REGEXP HASH_CHAR="$-" TYPE="KEYWORD3" AT_WORD_START="TRUE">\$-[0adFiIKlpvw](?![\p{Alnum}_])
306 <SEQ_REGEXP HASH_CHAR="$" TYPE="KEYWORD3" AT_WORD_START="TRUE">\$[0-9!@&\+`'=~/\\,\.;<>_\*"\$\?\:F](?![\p{Alnum}_])</SEQ_REGEXP>
308 <!-- Because of the ? char, this can't be done as a KEYWORD element -->
309 <SEQ TYPE="KEYWORD1" AT_WORD_START="TRUE">defined?</SEQ>
311 <!-- Highlight "include" but not "include?" -->
312 <SEQ_REGEXP HASH_CHAR="include" TYPE="KEYWORD2" AT_WORD_START="TRUE">include(?![\p{Alnum}_\?])
315 <!-- Not Operators but like the syntax highlight to match operators -->
316 <SEQ TYPE="OPERATOR">{</SEQ>
317 <SEQ TYPE="OPERATOR">}</SEQ>
318 <SEQ TYPE="OPERATOR">(</SEQ>
319 <SEQ TYPE="OPERATOR">)</SEQ>
321 <!-- Arithmetic operators -->
322 <SEQ TYPE="OPERATOR">::</SEQ>
323 <SEQ TYPE="OPERATOR">===</SEQ>
324 <SEQ TYPE="OPERATOR">=</SEQ>
325 <SEQ TYPE="OPERATOR">>></SEQ>
326 <SEQ TYPE="OPERATOR"><<</SEQ>
327 <SEQ TYPE="OPERATOR"><=</SEQ>
328 <SEQ TYPE="OPERATOR">+</SEQ>
329 <SEQ TYPE="OPERATOR">-</SEQ>
330 <SEQ TYPE="OPERATOR">/</SEQ>
332 <SEQ TYPE="OPERATOR">**</SEQ>
333 <SEQ TYPE="OPERATOR">*</SEQ>
335 <SEQ TYPE="OPERATOR">%</SEQ>
337 <!-- Logical Operators -->
338 <SEQ TYPE="OPERATOR">&</SEQ>
339 <SEQ TYPE="OPERATOR">|</SEQ>
340 <SEQ TYPE="OPERATOR">!</SEQ>
341 <SEQ TYPE="OPERATOR">></SEQ>
342 <SEQ TYPE="OPERATOR"><</SEQ>
343 <SEQ TYPE="OPERATOR">^</SEQ>
344 <SEQ TYPE="OPERATOR">~</SEQ>
346 <!-- Range operators -->
347 <SEQ TYPE="OPERATOR">...</SEQ>
348 <SEQ TYPE="OPERATOR">..</SEQ>
350 <SEQ TYPE="OPERATOR">]</SEQ>
351 <SEQ TYPE="OPERATOR">[</SEQ>
352 <SEQ TYPE="OPERATOR">?</SEQ>
355 <SEQ_REGEXP AT_WORD_START="TRUE" HASH_CHAR=":" TYPE="LITERAL4">:[\p{Alpha}_][\p{Alnum}_]*[?]?</SEQ_REGEXP>
356 <SPAN AT_WORD_START="TRUE" TYPE="LITERAL4">
357 <BEGIN>:'</BEGIN> <END>'</END>
360 :"hello world#{bang}" -->
361 <SPAN AT_WORD_START="TRUE" TYPE="LITERAL4" DELEGATE="doubleQuoteSymbol">
362 <BEGIN>:"</BEGIN> <END>"</END>
365 <!-- %s$Hello world$ -->
366 <SPAN_REGEXP HASH_CHAR="%s" TYPE="LITERAL4">
367 <BEGIN>%s([^\p{Alnum}])</BEGIN>
371 <KEYWORD1>BEGIN</KEYWORD1>
372 <KEYWORD1>END</KEYWORD1>
373 <KEYWORD1>alias</KEYWORD1>
374 <KEYWORD1>begin</KEYWORD1>
375 <KEYWORD1>break</KEYWORD1>
376 <KEYWORD1>case</KEYWORD1>
377 <KEYWORD1>class</KEYWORD1>
378 <KEYWORD1>def</KEYWORD1>
379 <KEYWORD1>do</KEYWORD1>
380 <KEYWORD1>else</KEYWORD1>
381 <KEYWORD1>elsif</KEYWORD1>
382 <KEYWORD1>end</KEYWORD1>
383 <KEYWORD1>ensure</KEYWORD1>
384 <KEYWORD1>for</KEYWORD1>
385 <KEYWORD1>if</KEYWORD1>
386 <KEYWORD1>in</KEYWORD1>
387 <KEYWORD1>module</KEYWORD1>
388 <KEYWORD1>next</KEYWORD1>
389 <KEYWORD1>print</KEYWORD1>
390 <KEYWORD1>puts</KEYWORD1>
391 <KEYWORD1>redo</KEYWORD1>
392 <KEYWORD1>rescue</KEYWORD1>
393 <KEYWORD1>retry</KEYWORD1>
394 <KEYWORD1>return</KEYWORD1>
395 <KEYWORD1>then</KEYWORD1>
396 <KEYWORD1>undef</KEYWORD1>
397 <KEYWORD1>unless</KEYWORD1>
398 <KEYWORD1>until</KEYWORD1>
399 <KEYWORD1>when</KEYWORD1>
400 <KEYWORD1>while</KEYWORD1>
401 <KEYWORD1>yield</KEYWORD1>
403 <KEYWORD2>load</KEYWORD2>
404 <KEYWORD2>require</KEYWORD2>
405 <KEYWORD2>initialize</KEYWORD2>
407 <OPERATOR>and</OPERATOR>
408 <OPERATOR>not</OPERATOR>
409 <OPERATOR>or</OPERATOR>
411 <KEYWORD3>false</KEYWORD3>
412 <KEYWORD3>nil</KEYWORD3>
413 <KEYWORD3>self</KEYWORD3>
414 <KEYWORD3>super</KEYWORD3>
415 <KEYWORD3>true</KEYWORD3>
417 <KEYWORD3>$defout</KEYWORD3>
418 <KEYWORD3>$deferr</KEYWORD3>
419 <KEYWORD3>$stderr</KEYWORD3>
420 <KEYWORD3>$stdin</KEYWORD3>
421 <KEYWORD3>$stdout</KEYWORD3>
422 <KEYWORD3>$DEBUG</KEYWORD3>
423 <KEYWORD3>$FILENAME</KEYWORD3>
424 <KEYWORD3>$LOAD_PATH</KEYWORD3>
425 <KEYWORD3>$SAFE</KEYWORD3>
426 <KEYWORD3>$VERBOSE</KEYWORD3>
427 <KEYWORD3>__FILE__</KEYWORD3>
428 <KEYWORD3>__LINE__</KEYWORD3>
429 <KEYWORD3>ARGF</KEYWORD3>
430 <KEYWORD3>ARGV</KEYWORD3>
431 <KEYWORD3>ENV</KEYWORD3>
432 <KEYWORD3>DATA</KEYWORD3>
433 <KEYWORD3>FALSE</KEYWORD3>
434 <KEYWORD3>NIL</KEYWORD3>
435 <KEYWORD3>RUBY_PLATFORM</KEYWORD3>
436 <KEYWORD3>RUBY_RELEASE_DATE</KEYWORD3>
437 <KEYWORD3>RUBY_VERSION</KEYWORD3>
438 <KEYWORD3>STDERR</KEYWORD3>
439 <KEYWORD3>STDIN</KEYWORD3>
440 <KEYWORD3>STDOUT</KEYWORD3>
441 <KEYWORD3>SCRIPT_LINES__</KEYWORD3>
442 <KEYWORD3>TOPLEVEL_BINDING</KEYWORD3>
443 <KEYWORD3>TRUE</KEYWORD3>
447 <!-- Delegate contents of #{} expression in double quotes to MAIN so that
448 it will be syntax highlighted as well -->
449 <RULES DEFAULT="LITERAL1" SET="doubleQuoteLiteral" ESCAPE="\">
450 <SPAN DELEGATE="MAIN" TYPE="OPERATOR">
454 <MARK_FOLLOWING TYPE="KEYWORD4">#@@</MARK_FOLLOWING>
455 <MARK_FOLLOWING TYPE="KEYWORD4">#@</MARK_FOLLOWING>
456 <MARK_FOLLOWING TYPE="NULL">#$</MARK_FOLLOWING>
458 <!-- Delegate contents of #{} expression in a double quoted symbol to MAIN so that
459 it will be syntax highlighted as well -->
460 <RULES DEFAULT="LITERAL4" SET="doubleQuoteSymbol" ESCAPE="\">
461 <SPAN DELEGATE="MAIN" TYPE="OPERATOR">
465 <MARK_FOLLOWING TYPE="KEYWORD4">#@@</MARK_FOLLOWING>
466 <MARK_FOLLOWING TYPE="KEYWORD4">#@</MARK_FOLLOWING>
467 <MARK_FOLLOWING TYPE="NULL">#$</MARK_FOLLOWING>
470 <!-- Delegate contents of #{} expression in backquotes to MAIN so that
471 it will be syntax highlighted as well -->
472 <RULES DEFAULT="LITERAL2" SET="BackquoteLiteral" ESCAPE="\">
473 <SPAN DELEGATE="MAIN" TYPE="OPERATOR">
477 <MARK_FOLLOWING TYPE="KEYWORD4">#@@</MARK_FOLLOWING>
478 <MARK_FOLLOWING TYPE="KEYWORD4">#@</MARK_FOLLOWING>
479 <MARK_FOLLOWING TYPE="NULL">#$</MARK_FOLLOWING>
482 <!-- Delegate contents of #{} expression in a regexp to MAIN so that
483 it will be syntax highlighted as well -->
484 <RULES DEFAULT="LITERAL3" SET="RegexpLiteral" ESCAPE="\">
485 <SPAN DELEGATE="MAIN" TYPE="OPERATOR">
489 <MARK_FOLLOWING TYPE="KEYWORD4">#@@</MARK_FOLLOWING>
490 <MARK_FOLLOWING TYPE="KEYWORD4">#@</MARK_FOLLOWING>
491 <MARK_FOLLOWING TYPE="NULL">#$</MARK_FOLLOWING>