xref: /vim-8.2.3635/runtime/syntax/ruby.vim (revision 6b730e11)
1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:	Ruby
3*6b730e11SBram Moolenaar" Maintainer:	Doug Kearns <djkea2 at gus.gscit.monash.edu.au>
4*6b730e11SBram Moolenaar" Info:		$Id$
5*6b730e11SBram Moolenaar" URL:		http://vim-ruby.sourceforge.net
6*6b730e11SBram Moolenaar" Anon CVS:	See above site
7*6b730e11SBram Moolenaar" Licence:	GPL (http://www.gnu.org)
8*6b730e11SBram Moolenaar" Disclaimer:
9*6b730e11SBram Moolenaar"    This program is distributed in the hope that it will be useful,
10*6b730e11SBram Moolenaar"    but WITHOUT ANY WARRANTY; without even the implied warranty of
11*6b730e11SBram Moolenaar"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*6b730e11SBram Moolenaar"    GNU General Public License for more details.
13*6b730e11SBram Moolenaar" ----------------------------------------------------------------------------
14*6b730e11SBram Moolenaar"
15071d4279SBram Moolenaar" Previous Maintainer:	Mirko Nasato
16071d4279SBram Moolenaar" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
17*6b730e11SBram Moolenaar" ----------------------------------------------------------------------------
18071d4279SBram Moolenaar
19071d4279SBram Moolenaar" For version 5.x: Clear all syntax items
20071d4279SBram Moolenaar" For version 6.x: Quit when a syntax file was already loaded
21071d4279SBram Moolenaarif version < 600
22071d4279SBram Moolenaar  syntax clear
23071d4279SBram Moolenaarelseif exists("b:current_syntax")
24071d4279SBram Moolenaar  finish
25071d4279SBram Moolenaarendif
26071d4279SBram Moolenaar
27*6b730e11SBram Moolenaarif has("folding") && exists("ruby_fold")
28*6b730e11SBram Moolenaar  setlocal foldmethod=syntax
29*6b730e11SBram Moolenaarendif
30*6b730e11SBram Moolenaar
31*6b730e11SBram Moolenaarif exists("ruby_space_errors")
32*6b730e11SBram Moolenaar  if !exists("ruby_no_trail_space_error")
33*6b730e11SBram Moolenaar    syn match rubySpaceError display excludenl "\s\+$"
34*6b730e11SBram Moolenaar  endif
35*6b730e11SBram Moolenaar  if !exists("ruby_no_tab_space_error")
36*6b730e11SBram Moolenaar    syn match rubySpaceError display " \+\t"me=e-1
37*6b730e11SBram Moolenaar  endif
38*6b730e11SBram Moolenaarendif
39*6b730e11SBram Moolenaar
40071d4279SBram Moolenaar" Expression Substitution and Backslash Notation
41*6b730e11SBram Moolenaarsyn match rubyEscape		"\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}"								contained display
42*6b730e11SBram Moolenaarsyn match rubyEscape		"\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)"	contained display
43*6b730e11SBram Moolenaarsyn match rubyInterpolation	"#{[^}]*}"				contained
44*6b730e11SBram Moolenaarsyn match rubyInterpolation	"#\%(\$\|@@\=\)\w\+"			contained display
45*6b730e11SBram Moolenaarsyn match rubyNoInterpolation	"\\#{[^}]*}"				contained
46*6b730e11SBram Moolenaarsyn match rubyNoInterpolation	"\\#\%(\$\|@@\=\)\w\+"			contained display
47*6b730e11SBram Moolenaar
48*6b730e11SBram Moolenaarsyn match rubyDelimEscape	"\\[(<{\[)>}\]]" transparent display contained contains=NONE
49*6b730e11SBram Moolenaar
50*6b730e11SBram Moolenaarsyn region rubyNestedParentheses	start="("	end=")"		skip="\\\\\|\\)"	transparent contained contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape
51*6b730e11SBram Moolenaarsyn region rubyNestedCurlyBraces	start="{"	end="}"		skip="\\\\\|\\}"	transparent contained contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape
52*6b730e11SBram Moolenaarsyn region rubyNestedAngleBrackets	start="<"	end=">"		skip="\\\\\|\\>"	transparent contained contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape
53*6b730e11SBram Moolenaarsyn region rubyNestedSquareBrackets	start="\["	end="\]"	skip="\\\\\|\\\]"	transparent contained contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape
54*6b730e11SBram Moolenaar
55*6b730e11SBram Moolenaarsyn cluster rubyStringSpecial		contains=rubyInterpolation,rubyNoInterpolation,rubyEscape
56*6b730e11SBram Moolenaarsyn cluster rubyExtendedStringSpecial	contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
57071d4279SBram Moolenaar
58071d4279SBram Moolenaar" Numbers and ASCII Codes
59*6b730e11SBram Moolenaarsyn match rubyASCIICode	"\w\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
60*6b730e11SBram Moolenaarsyn match rubyInteger	"\<0[xX]\x\+\%(_\x\+\)*\>"								display
61*6b730e11SBram Moolenaarsyn match rubyInteger	"\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>"						display
62*6b730e11SBram Moolenaarsyn match rubyInteger	"\<0[oO]\=\o\+\%(_\o\+\)*\>"								display
63*6b730e11SBram Moolenaarsyn match rubyInteger	"\<0[bB][01]\+\%(_[01]\+\)*\>"								display
64*6b730e11SBram Moolenaarsyn match rubyFloat	"\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>"					display
65*6b730e11SBram Moolenaarsyn match rubyFloat	"\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>"	display
66071d4279SBram Moolenaar
67*6b730e11SBram Moolenaar" Identifiers
68*6b730e11SBram Moolenaarsyn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
69*6b730e11SBram Moolenaarsyn match rubyBlockArgument	    "&[_[:lower:]][_[:alnum:]]"		 contains=NONE display transparent
70071d4279SBram Moolenaar
71*6b730e11SBram Moolenaarsyn match  rubyConstant			"\%(\%(\.\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\>\%(\s*(\)\@!"
72*6b730e11SBram Moolenaarsyn match  rubyClassVariable		"@@\h\w*" display
73*6b730e11SBram Moolenaarsyn match  rubyInstanceVariable		"@\h\w*"  display
74*6b730e11SBram Moolenaarsyn match  rubyGlobalVariable		"$\%(\h\w*\|-.\)"
75*6b730e11SBram Moolenaarsyn match  rubySymbol			":\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
76*6b730e11SBram Moolenaarsyn match  rubySymbol			":\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
77*6b730e11SBram Moolenaarsyn match  rubySymbol			":\@<!:\%(\$\|@@\=\)\=\h\w*[?!=]\="
78*6b730e11SBram Moolenaarsyn region rubySymbol			start=":\@<!:\"" end="\"" skip="\\\\\|\\\""
79*6b730e11SBram Moolenaarsyn match  rubyBlockParameter		"\%(\%(\<do\>\|{\)\s*\)\@<=|\s*\zs[( ,a-zA-Z0-9_*)]\+\ze\s*|" display
80071d4279SBram Moolenaar
81*6b730e11SBram Moolenaarsyn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
82*6b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$_\>"								display
83*6b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$-[0FIKadilpvw]\>"						display
84*6b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>"		display
85*6b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOAD_PATH\|SAFE\|VERBOSE\)\>"	display
86*6b730e11SBram Moolenaarsyn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
87*6b730e11SBram Moolenaarsyn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\|RUBY_PLATFORM\|RUBY_RELEASE_DATE\)\>\%(\s*(\)\@!"
88*6b730e11SBram Moolenaarsyn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(RUBY_VERSION\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
89071d4279SBram Moolenaar"Obsolete Global Constants
90*6b730e11SBram Moolenaar"syn match rubyPredefinedConstant "\%(::\)\=\zs\%(PLATFORM\|RELEASE_DATE\|VERSION\)\>"
91*6b730e11SBram Moolenaar"syn match rubyPredefinedConstant "\%(::\)\=\zs\%(NotImplementError\)\>"
92071d4279SBram Moolenaar
93071d4279SBram Moolenaar" Normal Regular Expression
94*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\)\|[\~=!|&(,[]\)\s*\)\@<=/" end="/[iomx]*" skip="\\\\\|\\/" contains=@rubyStringSpecial
95*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="\%(\<\%(split\|scan\|gsub\|sub\)\s*\)\@<=/" end="/[iomx]*" skip="\\\\\|\\/" contains=@rubyStringSpecial
96*6b730e11SBram Moolenaar
97*6b730e11SBram Moolenaar" Normal String and Shell Command Output
98*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
99*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="'"  end="'"  skip="\\\\\|\\'"
100*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="`"  end="`"  skip="\\\\\|\\`"  contains=@rubyStringSpecial
101*6b730e11SBram Moolenaar
102*6b730e11SBram Moolenaar" Generalized Regular Expression
103*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"	end="\z1[iomx]*" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
104*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%r{"				end="}[iomx]*"	 skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
105*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%r<"				end=">[iomx]*"	 skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
106*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%r\["				end="\][iomx]*"	 skip="\\\\\|\\\]"  contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
107*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%r("				end=")[iomx]*"	 skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
108*6b730e11SBram Moolenaar
109*6b730e11SBram Moolenaar" Generalized Single Quoted String, Symbol and Array of Strings
110*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qsw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
111*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qsw]{"				    end="}"   skip="\\\\\|\\}"	 fold	contains=rubyNestedCurlyBraces,rubyDelimEscape
112*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qsw]<"				    end=">"   skip="\\\\\|\\>"	 fold	contains=rubyNestedAngleBrackets,rubyDelimEscape
113*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qsw]\["				    end="\]"  skip="\\\\\|\\\]"	 fold	contains=rubyNestedSquareBrackets,rubyDelimEscape
114*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qsw]("				    end=")"   skip="\\\\\|\\)"	 fold	contains=rubyNestedParentheses,rubyDelimEscape
115*6b730e11SBram Moolenaar
116*6b730e11SBram Moolenaar" Generalized Double Quoted String and Array of Strings and Shell Command Output
117*6b730e11SBram Moolenaar" Note: %= is not matched here as the beginning of a double quoted string
118*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)"	    end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
119*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
120*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={"				    end="}"   skip="\\\\\|\\}"	 contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
121*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<"				    end=">"   skip="\\\\\|\\>"	 contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
122*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\["				    end="\]"  skip="\\\\\|\\\]"	 contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
123*6b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=("				    end=")"   skip="\\\\\|\\)"	 contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
124071d4279SBram Moolenaar
125071d4279SBram Moolenaar" Here Document
126*6b730e11SBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-\=\zs\%(\h\w*\)+   end=+$+ oneline contains=TOP
127*6b730e11SBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=TOP
128*6b730e11SBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=TOP
129*6b730e11SBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=TOP
130071d4279SBram Moolenaar
131*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<\z(\h\w*\)\ze+hs=s+2    matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial nextgroup=rubyFunction fold keepend
132*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<"\z([^"]*\)"\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial nextgroup=rubyFunction fold keepend
133*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<'\z([^']*\)'\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart		      nextgroup=rubyFunction fold keepend
134*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<`\z([^`]*\)`\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial nextgroup=rubyFunction fold keepend
135*6b730e11SBram Moolenaar
136*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-\z(\h\w*\)\ze+hs=s+3    matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial nextgroup=rubyFunction fold keepend
137*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial nextgroup=rubyFunction fold keepend
138*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-'\z([^']*\)'\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart		     nextgroup=rubyFunction fold keepend
139*6b730e11SBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%(\.\|::\)\)\_s*\)\@<!<<-`\z([^`]*\)`\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial nextgroup=rubyFunction fold keepend
140*6b730e11SBram Moolenaar
141*6b730e11SBram Moolenaarif exists('main_syntax') && main_syntax == 'eruby'
142*6b730e11SBram Moolenaar  let ruby_no_expensive = 1
143*6b730e11SBram Moolenaarend
144071d4279SBram Moolenaar
145071d4279SBram Moolenaar" Expensive Mode - colorize *end* according to opening statement
146071d4279SBram Moolenaarif !exists("ruby_no_expensive")
147*6b730e11SBram Moolenaar  syn region rubyFunction matchgroup=rubyDefine start="\<def\s\+"    end="\ze\%(\s\|(\|;\|$\)" oneline
148*6b730e11SBram Moolenaar  syn region rubyClass    matchgroup=rubyDefine start="\<class\s\+"  end="\ze\%(\s\|<\|;\|$\)" oneline
149*6b730e11SBram Moolenaar  syn match  rubyDefine   "\<class\ze<<"
150*6b730e11SBram Moolenaar  syn region rubyModule   matchgroup=rubyDefine start="\<module\s\+" end="\ze\%(\s\|;\|$\)"    oneline
151071d4279SBram Moolenaar
152*6b730e11SBram Moolenaar  syn region rubyBlock start="\<def\>"    matchgroup=rubyDefine end="\<end\>" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo nextgroup=rubyFunction fold
153*6b730e11SBram Moolenaar  syn region rubyBlock start="\<class\>"  matchgroup=rubyDefine end="\<end\>" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo nextgroup=rubyClass    fold
154*6b730e11SBram Moolenaar  syn region rubyBlock start="\<module\>" matchgroup=rubyDefine end="\<end\>" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo nextgroup=rubyModule   fold
155071d4279SBram Moolenaar
156*6b730e11SBram Moolenaar  " modifiers
157*6b730e11SBram Moolenaar  syn match  rubyControl "\<\%(if\|unless\|while\|until\)\>" display
158071d4279SBram Moolenaar
159071d4279SBram Moolenaar  " *do* requiring *end*
160*6b730e11SBram Moolenaar  syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo fold
161071d4279SBram Moolenaar
162071d4279SBram Moolenaar  " *{* requiring *}*
163*6b730e11SBram Moolenaar  syn region rubyCurlyBlock start="{" end="}" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo fold
164071d4279SBram Moolenaar
165071d4279SBram Moolenaar  " statements without *do*
166*6b730e11SBram Moolenaar  syn region rubyNoDoBlock matchgroup=rubyControl start="\<\%(case\|begin\)\>" start="\%(^\|\.\.\.\=\|[,;=([<>~\*/%!&^|+-]\)\s*\zs\%(if\|unless\)\>" end="\<end\>" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo fold
167071d4279SBram Moolenaar
168071d4279SBram Moolenaar  " statement with optional *do*
169*6b730e11SBram Moolenaar  syn region rubyOptDoLine matchgroup=rubyControl start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[,;=([<>~\*/%!&^|+-]\)\s*\)\@<=\<\%(until\|while\)\>" end="\%(\<do\>\|:\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo
170*6b730e11SBram Moolenaar  syn region rubyOptDoBlock start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[,;=([<>~\*/%!&^|+-]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyControl end="\<end\>" contains=ALLBUT,@rubyExtendedStringSpecial,rubyTodo nextgroup=rubyOptDoLine fold
171071d4279SBram Moolenaar
172071d4279SBram Moolenaar  if !exists("ruby_minlines")
173071d4279SBram Moolenaar    let ruby_minlines = 50
174071d4279SBram Moolenaar  endif
175071d4279SBram Moolenaar  exec "syn sync minlines=" . ruby_minlines
176071d4279SBram Moolenaar
177*6b730e11SBram Moolenaarelse
178*6b730e11SBram Moolenaar  syn region  rubyFunction matchgroup=rubyControl start="\<def\s\+"    end="\ze\%(\s\|(\|;\|$\)" oneline
179*6b730e11SBram Moolenaar  syn region  rubyClass    matchgroup=rubyControl start="\<class\s\+"  end="\ze\%(\s\|<\|;\|$\)" oneline
180*6b730e11SBram Moolenaar  syn match   rubyControl  "\<class\ze<<"
181*6b730e11SBram Moolenaar  syn region  rubyModule   matchgroup=rubyControl start="\<module\s\+" end="\ze\%(\s\|;\|$\)"    oneline
182071d4279SBram Moolenaar  syn keyword rubyControl case begin do for if unless while until end
183*6b730e11SBram Moolenaarendif
184071d4279SBram Moolenaar
185071d4279SBram Moolenaar" Keywords
186*6b730e11SBram Moolenaar" Note: the following keywords have already been defined:
187*6b730e11SBram Moolenaar" begin case class def do end for if module unless until while
188*6b730e11SBram Moolenaarsyn keyword rubyControl		and break else elsif ensure in next not or redo rescue retry return then when
189*6b730e11SBram Moolenaarsyn match   rubyOperator	"\<defined?" display
190*6b730e11SBram Moolenaarsyn keyword rubyKeyword		alias super undef yield
191*6b730e11SBram Moolenaarsyn keyword rubyBoolean		true false
192*6b730e11SBram Moolenaarsyn keyword rubyPseudoVariable	nil self __FILE__ __LINE__
193071d4279SBram Moolenaarsyn keyword rubyBeginEnd	BEGIN END
194071d4279SBram Moolenaar
195*6b730e11SBram Moolenaar" Special Methods
196*6b730e11SBram Moolenaarif !exists("ruby_no_special_methods")
197*6b730e11SBram Moolenaar  syn keyword rubyAccess    public protected private
198*6b730e11SBram Moolenaar  syn keyword rubyAttribute attr attr_accessor attr_reader attr_writer
199*6b730e11SBram Moolenaar  syn keyword rubyControl   abort at_exit exit fork loop trap
200*6b730e11SBram Moolenaar  syn keyword rubyEval      eval class_eval instance_eval module_eval
201*6b730e11SBram Moolenaar  syn keyword rubyException raise fail catch throw
202*6b730e11SBram Moolenaar  syn keyword rubyInclude   autoload extend include load require
203*6b730e11SBram Moolenaar  syn keyword rubyKeyword   callcc caller lambda proc
204071d4279SBram Moolenaarendif
205071d4279SBram Moolenaar
206*6b730e11SBram Moolenaar" Comments and Documentation
207*6b730e11SBram Moolenaarsyn match   rubySharpBang     "\%^#!.*" display
208*6b730e11SBram Moolenaarsyn keyword rubyTodo          FIXME NOTE TODO XXX contained
209*6b730e11SBram Moolenaarsyn match   rubyComment       "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
210*6b730e11SBram Moolenaarsyn region  rubyDocumentation start="^=begin" end="^=end.*$" contains=rubySpaceError,rubyTodo,@Spell fold
211*6b730e11SBram Moolenaar
212*6b730e11SBram Moolenaar" Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
213*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>"			transparent contains=NONE
214*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>"			transparent contains=NONE
215*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>"			transparent contains=NONE
216*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>"	transparent contains=NONE
217*6b730e11SBram Moolenaar
218*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>"	transparent contains=NONE
219*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>"		transparent contains=NONE
220*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>"	transparent contains=NONE
221*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>"			transparent contains=NONE
222*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>"			transparent contains=NONE
223*6b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>"			transparent contains=NONE
224071d4279SBram Moolenaar
225071d4279SBram Moolenaar" __END__ Directive
226*6b730e11SBram Moolenaarsyn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
227071d4279SBram Moolenaar
228071d4279SBram Moolenaar" Define the default highlighting.
229071d4279SBram Moolenaar" For version 5.7 and earlier: only when not done already
230071d4279SBram Moolenaar" For version 5.8 and later: only when an item doesn't have highlighting yet
231071d4279SBram Moolenaarif version >= 508 || !exists("did_ruby_syntax_inits")
232071d4279SBram Moolenaar  if version < 508
233071d4279SBram Moolenaar    let did_ruby_syntax_inits = 1
234071d4279SBram Moolenaar    command -nargs=+ HiLink hi link <args>
235071d4279SBram Moolenaar  else
236071d4279SBram Moolenaar    command -nargs=+ HiLink hi def link <args>
237071d4279SBram Moolenaar  endif
238071d4279SBram Moolenaar
239071d4279SBram Moolenaar  HiLink rubyDefine			Define
240071d4279SBram Moolenaar  HiLink rubyFunction			Function
241071d4279SBram Moolenaar  HiLink rubyControl			Statement
242071d4279SBram Moolenaar  HiLink rubyInclude			Include
243*6b730e11SBram Moolenaar  HiLink rubyInteger			Number
244*6b730e11SBram Moolenaar  HiLink rubyASCIICode			rubyInteger
245*6b730e11SBram Moolenaar  HiLink rubyFloat			Float
246*6b730e11SBram Moolenaar  HiLink rubyBoolean			rubyPseudoVariable
247071d4279SBram Moolenaar  HiLink rubyException			Exception
248*6b730e11SBram Moolenaar  HiLink rubyClass			Type
249*6b730e11SBram Moolenaar  HiLink rubyModule			Type
250*6b730e11SBram Moolenaar  if !exists("ruby_no_identifiers")
251071d4279SBram Moolenaar    HiLink rubyIdentifier		Identifier
252*6b730e11SBram Moolenaar  else
253*6b730e11SBram Moolenaar    HiLink rubyIdentifier		NONE
254*6b730e11SBram Moolenaar  endif
255071d4279SBram Moolenaar  HiLink rubyClassVariable		rubyIdentifier
256071d4279SBram Moolenaar  HiLink rubyConstant			rubyIdentifier
257071d4279SBram Moolenaar  HiLink rubyGlobalVariable		rubyIdentifier
258*6b730e11SBram Moolenaar  HiLink rubyBlockParameter		rubyIdentifier
259071d4279SBram Moolenaar  HiLink rubyInstanceVariable		rubyIdentifier
260071d4279SBram Moolenaar  HiLink rubyPredefinedIdentifier	rubyIdentifier
261071d4279SBram Moolenaar  HiLink rubyPredefinedConstant		rubyPredefinedIdentifier
262071d4279SBram Moolenaar  HiLink rubyPredefinedVariable		rubyPredefinedIdentifier
263071d4279SBram Moolenaar  HiLink rubySymbol			rubyIdentifier
264071d4279SBram Moolenaar  HiLink rubyKeyword			Keyword
265*6b730e11SBram Moolenaar  HiLink rubyOperator			Operator
266071d4279SBram Moolenaar  HiLink rubyBeginEnd			Statement
267*6b730e11SBram Moolenaar  HiLink rubyAccess			Statement
268*6b730e11SBram Moolenaar  HiLink rubyAttribute			Statement
269*6b730e11SBram Moolenaar  HiLink rubyEval			Statement
270*6b730e11SBram Moolenaar  HiLink rubyPseudoVariable		Constant
271071d4279SBram Moolenaar
272071d4279SBram Moolenaar  HiLink rubyComment			Comment
273071d4279SBram Moolenaar  HiLink rubyData			Comment
274071d4279SBram Moolenaar  HiLink rubyDataDirective		Delimiter
275*6b730e11SBram Moolenaar  HiLink rubyDocumentation		Comment
276*6b730e11SBram Moolenaar  HiLink rubyEscape			Special
277*6b730e11SBram Moolenaar  HiLink rubyInterpolation		Special
278*6b730e11SBram Moolenaar  HiLink rubyNoInterpolation		rubyString
279*6b730e11SBram Moolenaar  HiLink rubySharpBang			PreProc
280*6b730e11SBram Moolenaar  HiLink rubyStringDelimiter		Delimiter
281*6b730e11SBram Moolenaar  HiLink rubyString			String
282*6b730e11SBram Moolenaar  HiLink rubyTodo			Todo
283*6b730e11SBram Moolenaar
284*6b730e11SBram Moolenaar  HiLink rubyError			Error
285*6b730e11SBram Moolenaar  HiLink rubySpaceError			rubyError
286071d4279SBram Moolenaar
287071d4279SBram Moolenaar  delcommand HiLink
288071d4279SBram Moolenaarendif
289071d4279SBram Moolenaar
290071d4279SBram Moolenaarlet b:current_syntax = "ruby"
291071d4279SBram Moolenaar
292*6b730e11SBram Moolenaar" vim: nowrap sw=2 sts=2 ts=8 ff=unix:
293