xref: /vim-8.2.3635/runtime/syntax/ruby.vim (revision ade0d394)
1" Vim syntax file
2" Language:		Ruby
3" Maintainer:		Doug Kearns <[email protected]>
4" URL:			https://github.com/vim-ruby/vim-ruby
5" Release Coordinator:	Doug Kearns <[email protected]>
6" Last Change:		2019 Jul 13
7" ----------------------------------------------------------------------------
8"
9" Previous Maintainer:	Mirko Nasato
10" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
11" ----------------------------------------------------------------------------
12
13" Prelude {{{1
14if exists("b:current_syntax")
15  finish
16endif
17
18" this file uses line continuations
19let s:cpo_sav = &cpo
20set cpo&vim
21
22" eRuby Config {{{1
23if exists('main_syntax') && main_syntax == 'eruby'
24  let b:ruby_no_expensive = 1
25endif
26
27" Folding Config {{{1
28if has("folding") && exists("ruby_fold")
29  setlocal foldmethod=syntax
30endif
31
32let s:foldable_groups = split(
33      \	  get(
34      \	    b:,
35      \	    'ruby_foldable_groups',
36      \	    get(g:, 'ruby_foldable_groups', 'ALL')
37      \	  )
38      \	)
39
40function! s:foldable(...) abort
41  if index(s:foldable_groups, 'NONE') > -1
42    return 0
43  endif
44
45  if index(s:foldable_groups, 'ALL') > -1
46    return 1
47  endif
48
49  for l:i in a:000
50    if index(s:foldable_groups, l:i) > -1
51      return 1
52    endif
53  endfor
54
55  return 0
56endfunction
57
58function! s:run_syntax_fold(args) abort
59  let [_0, _1, groups, cmd; _] = matchlist(a:args, '\(["'']\)\(.\{-}\)\1\s\+\(.*\)')
60  if call('s:foldable', split(groups))
61    let cmd .= ' fold'
62  endif
63  exe cmd
64endfunction
65
66com! -nargs=* SynFold call s:run_syntax_fold(<q-args>)
67
68" Not-Top Cluster {{{1
69syn cluster rubyNotTop contains=@rubyCommentNotTop,@rubyStringNotTop,@rubyRegexpSpecial,@rubyDeclaration,@rubyExceptionHandler,@rubyClassOperator,rubyConditional,rubyModuleName,rubyClassName,rubySymbolDelimiter,rubyParentheses
70
71" Whitespace Errors {{{1
72if exists("ruby_space_errors")
73  if !exists("ruby_no_trail_space_error")
74    syn match rubySpaceError display excludenl "\s\+$"
75  endif
76  if !exists("ruby_no_tab_space_error")
77    syn match rubySpaceError display " \+\t"me=e-1
78  endif
79endif
80
81" Operators {{{1
82
83syn match rubyEnglishBooleanOperator "\<\%(and\|or\|not\)\>"
84
85if exists("ruby_operators") || exists("ruby_pseudo_operators")
86  syn match rubyDotOperator	   "\.\|&\."
87
88  syn match rubyTernaryOperator    "\%(\w\|[^\x00-\x7F]\)\@1<!?\|:"
89  syn match rubyArithmeticOperator "\*\*\|[*/%+]\|->\@!"
90  syn match rubyComparisonOperator "<=>\|<=\|<\|>=\|[-=]\@1<!>"
91  syn match rubyBitwiseOperator    "[~^|]\|&\.\@!\|<<\|>>"
92  syn match rubyBooleanOperator    "\%(\w\|[^\x00-\x7F]\)\@1<!!\|&&\|||"
93  syn match rubyRangeOperator	   "\.\.\.\="
94  syn match rubyAssignmentOperator "=>\@!\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|||=\||=\|%=\|+=\|>>=\|<<=\|\^="
95  syn match rubyAssignmentOperator "=>\@!" containedin=rubyBlockParameterList " TODO: this is inelegant
96  syn match rubyEqualityOperator   "===\|==\|!=\|!\~\|=\~"
97
98  syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<=\[" end="]" contains=ALLBUT,@rubyNotTop
99
100  syn match rubyScopeOperator	    "::"
101  syn match rubySuperClassOperator  "<"	 contained
102  syn match rubyEigenClassOperator  "<<" contained
103  syn match rubyLambdaOperator	    "->"
104  syn match rubySplatOperator	    "\%([[{(|,=]\_s*\)\@<=\*"
105  syn match rubySplatOperator	    "\%(^\|\s\)\@1<=\*\%(\h\|[^\x00-\x7F]\|[:$@[]\)\@="
106  syn match rubyDoubleSplatOperator "\%([{(|,]\_s*\)\@<=\*\*"
107  syn match rubyDoubleSplatOperator "\s\@1<=\*\*\%(\h\|[^\x00-\x7F]\|[:$@{]\)\@="
108  syn match rubyProcOperator	    "\%([[(|,]\_s*\)\@<=&"
109  syn match rubyProcOperator	    "\s\@1<=&\%(\h\|[^\x00-\x7F]\|[:$@]\|->\)\@="
110
111  syn cluster rubyProperOperator contains=rubyTernaryOperator,rubyArithmeticOperator,rubyComparisonOperator,rubyBitwiseOperator,rubyBooleanOperator,rubyRangeOperator,rubyAssignmentOperator,rubyEqualityOperator,rubyDefinedOperator,rubyEnglishBooleanOperator
112  syn cluster rubyClassOperator  contains=rubyEigenClassOperator,rubySuperClassOperator
113  syn cluster rubyPseudoOperator contains=rubyDotOperator,rubyScopeOperator,rubyEigenClassOperator,rubySuperClassOperator,rubyLambdaOperator,rubySplatOperator,rubyDoubleSplatOperator,rubyProcOperator
114  syn cluster rubyOperator	 contains=ruby.*Operator
115endif
116
117" String Interpolation and Backslash Notation {{{1
118syn region rubyInterpolation	      matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
119syn match  rubyInterpolation	      "#\$\%(-\w\|[!$&"'*+,./0:;<>?@\`~_]\|\w\+\)" display contained contains=rubyInterpolationDelimiter,@rubyGlobalVariable
120syn match  rubyInterpolation	      "#@@\=\w\+"				   display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable
121syn match  rubyInterpolationDelimiter "#\ze[$@]"				   display contained
122
123syn match rubyStringEscape "\\\_."											   contained display
124syn match rubyStringEscape "\\\o\{1,3}\|\\x\x\{1,2}"									   contained display
125syn match rubyStringEscape "\\u\%(\x\{4}\|{\x\{1,6}\%(\s\+\x\{1,6}\)*}\)"						   contained display
126syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=.\)" contained display
127
128syn match rubyBackslashEscape "\\\\" contained display
129syn match rubyQuoteEscape     "\\'"  contained display
130syn match rubySpaceEscape     "\\ "  contained display
131
132syn match rubyParenthesisEscape	  "\\[()]"  contained display
133syn match rubyCurlyBraceEscape	  "\\[{}]"  contained display
134syn match rubyAngleBracketEscape  "\\[<>]"  contained display
135syn match rubySquareBracketEscape "\\[[\]]" contained display
136
137syn region rubyNestedParentheses    start="("  skip="\\\\\|\\)"  matchgroup=rubyString end=")"	transparent contained
138syn region rubyNestedCurlyBraces    start="{"  skip="\\\\\|\\}"  matchgroup=rubyString end="}"	transparent contained
139syn region rubyNestedAngleBrackets  start="<"  skip="\\\\\|\\>"  matchgroup=rubyString end=">"	transparent contained
140syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]"	transparent contained
141
142syn cluster rubySingleCharEscape contains=rubyBackslashEscape,rubyQuoteEscape,rubySpaceEscape,rubyParenthesisEscape,rubyCurlyBraceEscape,rubyAngleBracketEscape,rubySquareBracketEscape
143syn cluster rubyNestedBrackets	 contains=rubyNested.\+
144syn cluster rubyStringSpecial	 contains=rubyInterpolation,rubyStringEscape
145syn cluster rubyStringNotTop	 contains=@rubyStringSpecial,@rubyNestedBrackets,@rubySingleCharEscape
146
147" Regular Expression Metacharacters {{{1
148syn region rubyRegexpComment	  matchgroup=rubyRegexpSpecial	 start="(?#"								    skip="\\\\\|\\)"  end=")"  contained
149syn region rubyRegexpParens	  matchgroup=rubyRegexpSpecial	 start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\\\\|\\)"  end=")"  contained transparent contains=@rubyRegexpSpecial
150syn region rubyRegexpBrackets	  matchgroup=rubyRegexpCharClass start="\[\^\="								    skip="\\\\\|\\\]" end="\]" contained transparent contains=rubyRegexpBrackets,rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass,rubyRegexpIntersection oneline
151syn match  rubyRegexpCharClass	  "\\[DdHhRSsWw]"	 contained display
152syn match  rubyRegexpCharClass	  "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|xdigit\):\]" contained
153syn match  rubyRegexpCharClass	  "\\[pP]{^\=.\{-}}"	 contained display
154syn match  rubyRegexpEscape	  "\\[].*?+^$|\\/(){}[]" contained " see commit e477f10
155syn match  rubyRegexpQuantifier	  "[*?+][?+]\="		 contained display
156syn match  rubyRegexpQuantifier	  "{\d\+\%(,\d*\)\=}?\=" contained display
157syn match  rubyRegexpAnchor	  "[$^]\|\\[ABbGZz]"	 contained display
158syn match  rubyRegexpDot	  "\.\|\\X"		 contained display
159syn match  rubyRegexpIntersection "&&"			 contained display
160syn match  rubyRegexpSpecial	  "\\K"			 contained display
161syn match  rubyRegexpSpecial	  "|"			 contained display
162syn match  rubyRegexpSpecial	  "\\[1-9]\d\=\d\@!"	 contained display
163syn match  rubyRegexpSpecial	  "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
164syn match  rubyRegexpSpecial	  "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
165syn match  rubyRegexpSpecial	  "\\g<\%([a-z_]\w*\|-\=\d\+\)>"		contained display
166syn match  rubyRegexpSpecial	  "\\g'\%([a-z_]\w*\|-\=\d\+\)'"		contained display
167
168syn cluster rubyRegexpSpecial contains=@rubyStringSpecial,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment,rubyRegexpIntersection
169
170" Numbers {{{1
171syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>"							       display
172syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>"					       display
173syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>"							       display
174syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>"						       display
175syn match rubyFloat   "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>"				       display
176syn match rubyFloat   "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)i\=\>" display
177
178" Identifiers {{{1
179syn match rubyClassName	       "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
180syn match rubyModuleName       "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
181syn match rubyConstant	       "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!"
182syn match rubyClassVariable    "@@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
183syn match rubyInstanceVariable "@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*"  display
184syn match rubyGlobalVariable   "$\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\|-.\)"
185syn match rubySymbolDelimiter  ":" contained
186syn match rubySymbol	       "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" contains=rubySymbolDelimiter
187syn match rubySymbol	       "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"			    contains=rubySymbolDelimiter
188syn match rubySymbol	       "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*"  contains=rubySymbolDelimiter
189syn match rubySymbol	       "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\=" contains=rubySymbolDelimiter
190
191SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'"  end="'"  skip="\\\\\|\\'"  contains=rubyQuoteEscape,rubyBackslashEscape
192SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
193
194syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@="
195
196syn region rubyParentheses	  start="("				 end=")" contains=ALLBUT,@rubyNotTop containedin=rubyBlockParameterList
197syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" end="|" contains=ALLBUT,@rubyNotTop,@rubyProperOperator
198
199if exists('ruby_global_variable_error')
200  syn match rubyGlobalVariableError "$[^A-Za-z_]"	display
201  syn match rubyGlobalVariableError "$-[^0FIKWadilpvw]" display
202endif
203
204syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<>?@\`~]#
205syn match rubyPredefinedVariable "$\d\+"									    display
206syn match rubyPredefinedVariable "$_\>"										    display
207syn match rubyPredefinedVariable "$-[0FIWadilpvw]\>"								    display
208syn match rubyPredefinedVariable "$\%(stderr\|stdin\|stdout\)\>"						    display
209syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
210syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\)\>\%(\s*(\)\@!"
211syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
212
213" Deprecated/removed in 1.9
214syn match rubyPredefinedVariable "$="
215syn match rubyPredefinedVariable "$-K\>"		  display
216syn match rubyPredefinedVariable "$\%(deferr\|defout\)\>" display
217syn match rubyPredefinedVariable "$KCODE\>"		  display
218" Deprecated/removed in 2.4
219syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(FALSE\|NIL\|TRUE\)\>\%(\s*(\)\@!"
220
221syn cluster rubyGlobalVariable contains=rubyGlobalVariable,rubyPredefinedVariable,rubyGlobalVariableError
222
223" Normal Regular Expressions {{{1
224SynFold '/' syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
225SynFold '/' syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\s\+\)\@<=/\%(=\|\_s\)\@!"					   end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
226
227" Generalized Regular Expressions {{{1
228SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
229SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r{"				   end="}[iomxneus]*"	skip="\\\\\|\\}"   contains=@rubyRegexpSpecial
230SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r<"				   end=">[iomxneus]*"	skip="\\\\\|\\>"   contains=@rubyRegexpSpecial,rubyNestedAngleBrackets
231SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\["				   end="\][iomxneus]*"	skip="\\\\\|\\\]"  contains=@rubyRegexpSpecial
232SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r("				   end=")[iomxneus]*"	skip="\\\\\|\\)"   contains=@rubyRegexpSpecial
233SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\z(\s\)"			   end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
234
235" Characters {{{1
236syn match rubyCharacter "\%(\w\|[^\x00-\x7F]\|[]})\"'/]\)\@1<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\[[:space:]]\|\\\=[^[:space:]]\)\)"
237syn match rubyCharacter "\%(\w\|[^\x00-\x7F]\|[]})\"'/]\)\@1<!?\\u\%(\x\{4}\|{\x\{1,6}}\)"
238
239" Normal Strings {{{1
240let s:spell_cluster = exists('ruby_spellcheck_strings') ? ',@Spell' : ''
241let s:fold_arg	    = s:foldable('string')		? ' fold'   : ''
242exe 'syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\""  contains=@rubyStringSpecial'		       . s:spell_cluster . s:fold_arg
243exe 'syn region rubyString matchgroup=rubyStringDelimiter start="''" end="''" skip="\\\\\|\\''"  contains=rubyQuoteEscape,rubyBackslashEscape' . s:spell_cluster . s:fold_arg
244unlet s:spell_cluster s:fold_arg
245
246" Shell Command Output {{{1
247SynFold 'string' syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial
248
249" Generalized Single Quoted Strings, Symbols, Array of Strings and Array of Symbols {{{1
250
251" Non-bracket punctuation delimiters {{{2
252let s:names = { '~': 'Tilde', '`': 'BackQuote', '!': 'Bang', '@': 'At', '#': 'Hash', '$': 'Dollar', '%': 'Percent', '^': 'Caret',
253      \		'&': 'Ampersand', '*': 'Asterix', '_': 'Underscore', '-': 'Dash', '+': 'Plus', '=': 'Equals', '|': 'Bar',
254      \		'\': 'Backslash', ':': 'Colon', ';': 'Semicolon', '"': 'DoubleQuote', "'": 'Quote', ',': 'Comma', '.': 'Period',
255      \		'?': 'QuestionMark', '/': 'ForwardSlash' }
256
257for s:delimiter in keys(s:names)
258  let s:group = 'ruby' . s:names[s:delimiter] . 'Escape'
259
260  if s:delimiter =~ '[\"]'
261    let s:delimiter = '\' . s:delimiter
262  endif
263
264  exe 'syn match ' . s:group . ' "\V\\' . s:delimiter . '" contained display'
265  exe 'syn cluster rubySingleCharEscape add=' . s:group
266  exe 'SynFold ''%'' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\V%q' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,'		 . s:group . ' nextgroup=@rubyModifier skipwhite'
267  exe 'SynFold ''%'' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\V%w' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,rubySpaceEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
268  exe 'SynFold ''%'' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="\V%s' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,'		 . s:group . ' nextgroup=@rubyModifier skipwhite'
269  exe 'SynFold ''%'' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="\V%i' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,rubySpaceEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
270  exe 'hi def link ' . s:group . ' rubyStringEscape'
271endfor
272
273unlet s:delimiter s:group s:names
274" }}}2
275
276SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q{"	  end="}"   skip="\\\\\|\\}"   contains=rubyBackslashEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
277SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q<"	  end=">"   skip="\\\\\|\\>"   contains=rubyBackslashEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
278SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q\["	  end="\]"  skip="\\\\\|\\\]"  contains=rubyBackslashEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
279SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q("	  end=")"   skip="\\\\\|\\)"   contains=rubyBackslashEscape,rubyParenthesisEscape,rubyNestedParentheses
280SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=rubyBackslashEscape,rubySpaceEscape
281
282SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w{"	  end="}"   skip="\\\\\|\\}"   contains=rubyBackslashEscape,rubySpaceEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
283SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w<"	  end=">"   skip="\\\\\|\\>"   contains=rubyBackslashEscape,rubySpaceEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
284SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w\["	  end="\]"  skip="\\\\\|\\\]"  contains=rubyBackslashEscape,rubySpaceEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
285SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w("	  end=")"   skip="\\\\\|\\)"   contains=rubyBackslashEscape,rubySpaceEscape,rubyParenthesisEscape,rubyNestedParentheses
286
287SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s{"	  end="}"   skip="\\\\\|\\}"   contains=rubyBackslashEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
288SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s<"	  end=">"   skip="\\\\\|\\>"   contains=rubyBackslashEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
289SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s\["	  end="\]"  skip="\\\\\|\\\]"  contains=rubyBackslashEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
290SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s("	  end=")"   skip="\\\\\|\\)"   contains=rubyBackslashEscape,rubyParenthesisEscape,rubyNestedParentheses
291SynFold '%' syn region rubyString matchgroup=rubyPercentSymbolDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=rubyBackslashEscape,rubySpaceEscape
292
293SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i{"	  end="}"   skip="\\\\\|\\}"   contains=rubyBackslashEscape,rubySpaceEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
294SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i<"	  end=">"   skip="\\\\\|\\>"   contains=rubyBackslashEscape,rubySpaceEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
295SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i\["	  end="\]"  skip="\\\\\|\\\]"  contains=rubyBackslashEscape,rubySpaceEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
296SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i("	  end=")"   skip="\\\\\|\\)"   contains=rubyBackslashEscape,rubySpaceEscape,rubyParenthesisEscape,rubyNestedParentheses
297
298" Generalized Double Quoted Strings, Array of Strings, Array of Symbols and Shell Command Output {{{1
299SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\%(\%(\w\|[^\x00-\x7F]\|]\)\s*\)\@<!%=" end="="	 skip="\\\\\|\\="   contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
300SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)"       end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
301SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
302SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\={"			       end="}"	 skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces
303SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=<"			       end=">"	 skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets
304SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=\["			       end="\]"  skip="\\\\\|\\\]"  contains=@rubyStringSpecial,rubyNestedSquareBrackets
305SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=("			       end=")"	 skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses
306SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[Qx]\z(\s\)"			       end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
307
308SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
309SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I{"				   end="}"   skip="\\\\\|\\}"	contains=@rubyStringSpecial,rubyNestedCurlyBraces
310SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I<"				   end=">"   skip="\\\\\|\\>"	contains=@rubyStringSpecial,rubyNestedAngleBrackets
311SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I\["				   end="\]"  skip="\\\\\|\\\]"	contains=@rubyStringSpecial,rubyNestedSquareBrackets
312SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I("				   end=")"   skip="\\\\\|\\)"	contains=@rubyStringSpecial,rubyNestedParentheses
313
314" Here Documents {{{1
315syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
316
317syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs"\%([^"]*\)"+					   end=+$+ oneline contains=ALLBUT,@rubyNotTop
318syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs'\%([^']*\)'+					   end=+$+ oneline contains=ALLBUT,@rubyNotTop
319syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs`\%([^`]*\)`+					   end=+$+ oneline contains=ALLBUT,@rubyNotTop
320
321SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2  matchgroup=rubyHeredocDelimiter end=+^\z1$+	contains=rubyHeredocStart,@rubyStringSpecial keepend
322SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2				      matchgroup=rubyHeredocDelimiter end=+^\z1$+	contains=rubyHeredocStart,@rubyStringSpecial keepend
323SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2				      matchgroup=rubyHeredocDelimiter end=+^\z1$+	contains=rubyHeredocStart		     keepend
324SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2				      matchgroup=rubyHeredocDelimiter end=+^\z1$+	contains=rubyHeredocStart,@rubyStringSpecial keepend
325
326SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
327SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3				      matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
328SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3				      matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart		     keepend
329SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3				      matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
330
331" Module, Class, Method and Alias Declarations {{{1
332syn match rubyAliasDeclaration	"[^[:space:];#.()]\+" contained contains=rubySymbol,@rubyGlobalVariable nextgroup=rubyAliasDeclaration2 skipwhite
333syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,@rubyGlobalVariable
334syn match rubyMethodDeclaration "[^[:space:];#(]\+"   contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
335syn match rubyClassDeclaration	"[^[:space:];#<]\+"   contained contains=rubyClassName,rubyScopeOperator nextgroup=rubySuperClassOperator skipwhite skipnl
336syn match rubyModuleDeclaration "[^[:space:];#<]\+"   contained contains=rubyModuleName,rubyScopeOperator
337
338syn match rubyMethodName "\<\%([_[:alpha:]]\|[^\x00-\x7F]\)\%([_[:alnum:]]\|[^\x00-\x7F]\)*[?!=]\=\%([[:alnum:]_.:?!=]\|[^\x00-\x7F]\)\@!"			      contained containedin=rubyMethodDeclaration
339syn match rubyMethodName "\%(\s\|^\)\@1<=\%([_[:alpha:]]\|[^\x00-\x7F]\)\%([_[:alnum:]]\|[^\x00-\x7F]\)*[?!=]\=\%(\s\|$\)\@="					      contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
340syn match rubyMethodName "\%([[:space:].]\|^\)\@1<=\%(\[\]=\=\|\*\*\|[-+!~]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
341
342syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyMethodName
343
344" Keywords {{{1
345" TODO: reorganise
346syn match rubyControl	     "\%#=1\<\%(break\|in\|next\|redo\|retry\|return\)\>"
347syn match rubyKeyword	     "\%#=1\<\%(super\|yield\)\>"
348syn match rubyBoolean	     "\%#=1\<\%(true\|false\)\>[?!]\@!"
349syn match rubyPseudoVariable "\%#=1\<\(self\|nil\)\>[?!]\@!"
350syn match rubyPseudoVariable "\%#=1\<__\%(ENCODING\|dir\|FILE\|LINE\|callee\|method\)__\>"
351syn match rubyBeginEnd	     "\%#=1\<\%(BEGIN\|END\)\>"
352
353" Expensive Mode {{{1
354" Match 'end' with the appropriate opening keyword for syntax based folding
355" and special highlighting of module/class/method definitions
356if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
357  syn match rubyDefine "\<alias\>"  nextgroup=rubyAliasDeclaration			  skipwhite skipnl
358  syn match rubyDefine "\<def\>"    nextgroup=rubyMethodDeclaration			  skipwhite skipnl
359  syn match rubyDefine "\<undef\>"  nextgroup=rubyMethodName				  skipwhite skipnl
360  syn match rubyClass  "\<class\>"  nextgroup=rubyClassDeclaration,rubyEigenClassOperator skipwhite skipnl
361  syn match rubyModule "\<module\>" nextgroup=rubyModuleDeclaration			  skipwhite skipnl
362
363  SynFold 'def'    syn region rubyMethodBlock start="\<def\>"	 matchgroup=rubyDefine skip="\<end:\|\%(\<def\_s\+\)\@<=end\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
364  SynFold 'class'  syn region rubyClassBlock  start="\<class\>"  matchgroup=rubyClass  skip="\<end:"			       end="\<end\>" contains=ALLBUT,@rubyNotTop
365  SynFold 'module' syn region rubyModuleBlock start="\<module\>" matchgroup=rubyModule skip="\<end:"			       end="\<end\>" contains=ALLBUT,@rubyNotTop
366
367  " modifiers
368  syn match rubyLineContinuation    "\\$" nextgroup=@rubyModifier skipwhite skipnl
369  syn match rubyConditionalModifier "\<\%(if\|unless\)\>"
370  syn match rubyRepeatModifier	    "\<\%(while\|until\)\>"
371  syn match rubyRescueModifier	    "\<rescue\>"
372
373  syn cluster rubyModifier contains=rubyConditionalModifier,rubyRepeatModifier,rubyRescueModifier
374
375  SynFold 'do' syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
376
377  " curly bracket block or hash literal
378  SynFold '{' syn region rubyCurlyBlock   matchgroup=rubyCurlyBlockDelimiter start="{"						    end="}" contains=ALLBUT,@rubyNotTop
379  SynFold '[' syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter      start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<!\[" end="]" contains=ALLBUT,@rubyNotTop
380
381  " statements without 'do'
382  SynFold 'begin' syn region rubyBlockExpression matchgroup=rubyControl     start="\<begin\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
383  SynFold 'case'  syn region rubyCaseExpression  matchgroup=rubyConditional start="\<case\>"  skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
384
385  SynFold 'if' syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\<then\s\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
386
387  syn match rubyConditional "\<\%(then\|else\|when\)\>"	 contained containedin=rubyCaseExpression
388  syn match rubyConditional "\<\%(then\|else\|elsif\)\>" contained containedin=rubyConditionalExpression
389
390  syn match   rubyExceptionHandler  "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>" contained containedin=rubyBlockExpression,rubyDoBlock
391  syn match   rubyExceptionHandler2 "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>" contained containedin=rubyModuleBlock,rubyClassBlock,rubyMethodBlock
392  syn cluster rubyExceptionHandler  contains=rubyExceptionHandler,rubyExceptionHandler2
393
394  " statements with optional 'do'
395  syn region rubyOptionalDoLine matchgroup=rubyRepeat start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![!?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\<do\>" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
396
397  SynFold 'for' syn region rubyRepeatExpression start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![!?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine
398
399  if !exists("ruby_minlines")
400    let ruby_minlines = 500
401  endif
402  exe "syn sync minlines=" . ruby_minlines
403
404else
405  syn match rubyControl "\<def\>"    nextgroup=rubyMethodDeclaration skipwhite skipnl
406  syn match rubyControl "\<class\>"  nextgroup=rubyClassDeclaration  skipwhite skipnl
407  syn match rubyControl "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
408  syn match rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|rescue\|ensure\|then\|when\|end\)\>"
409  syn match rubyKeyword "\<\%(alias\|undef\)\>"
410endif
411
412" Special Methods {{{1
413if !exists("ruby_no_special_methods")
414  syn match rubyAccess	  "\<\%(public\|protected\|private\)\>" " use re=2
415  syn match rubyAccess	  "\%#=1\<\%(public\|private\)_class_method\>"
416  syn match rubyAccess	  "\%#=1\<\%(public\|private\)_constant\>"
417  syn match rubyAccess	  "\%#=1\<module_function\>"
418  syn match rubyAttribute "\%#=1\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!" " attr is a common variable name
419  syn match rubyAttribute "\%#=1\<attr_\%(accessor\|reader\|writer\)\>"
420  syn match rubyControl   "\%#=1\<\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>"
421  syn match rubyEval	  "\%#=1\<eval\>"
422  syn match rubyEval	  "\%#=1\<\%(class\|instance\|module\)_eval\>"
423  syn match rubyException "\%#=1\<\%(raise\|fail\|catch\|throw\)\>"
424  syn match rubyInclude   "\%#=1\<\%(autoload\|gem\|load\|require\%(_relative\)\=\)\>"
425  syn match rubyKeyword   "\%#=1\<\%(callcc\|caller\|lambda\|proc\)\>"
426  syn match rubyMacro	  "\%#=1\<\%(extend\|include\|prepend\|refine\|using\)\>"
427  syn match rubyMacro	  "\%#=1\<\%(alias\|define\|define_singleton\|remove\|undef\)_method\>"
428endif
429
430" Comments and Documentation {{{1
431syn match   rubySharpBang    "\%^#!.*" display
432syn keyword rubyTodo	     FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained
433syn match   rubyEncoding     "[[:alnum:]-]\+" contained display
434syn match   rubyMagicComment "\c\%<3l#\s*\zs\%(coding\|encoding\):"					contained nextgroup=rubyEncoding skipwhite
435syn match   rubyMagicComment "\c\%<10l#\s*\zs\%(frozen_string_literal\|warn_indent\|warn_past_scope\):" contained nextgroup=rubyBoolean  skipwhite
436syn match   rubyComment	     "#.*" contains=@rubyCommentSpecial,rubySpaceError,@Spell
437
438syn cluster rubyCommentSpecial contains=rubySharpBang,rubyTodo,rubyMagicComment
439syn cluster rubyCommentNotTop  contains=@rubyCommentSpecial,rubyEncoding
440
441if !exists("ruby_no_comment_fold") && s:foldable('#')
442  syn region rubyMultilineComment start="^\s*#.*\n\%(^\s*#\)\@=" end="^\s*#.*\n\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
443  syn region rubyDocumentation	  start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$"      contains=rubySpaceError,rubyTodo,@Spell fold
444else
445  syn region rubyDocumentation	  start="^=begin\s*$"		 end="^=end\s*$"              contains=rubySpaceError,rubyTodo,@Spell
446endif
447
448" {{{1 Useless Line Continuations
449syn match rubyUselessLineContinuation "\%([.:,;{([<>~\*%&^|+=-]\|%(\%(\w\|[^\x00-\x7F]\)\@1<![?!]\)\s*\zs\\$" nextgroup=rubyUselessLineContinuation skipwhite skipempty
450syn match rubyUselessLineContinuation "\\$"								      nextgroup=rubyUselessLineContinuation skipwhite skipempty contained
451
452" Keyword Nobbling {{{1
453" prevent methods with keyword names being highlighted as keywords when called
454syn match rubyKeywordAsMethod "\%(\%(\.\@1<!\.\)\|&\.\|::\)\_s*\%([_[:lower:]][_[:alnum:]]*\|\%(BEGIN\|END\)\>\)" transparent contains=rubyDotOperator,rubyScopeOperator
455
456" Bang and Predicate Methods and Operators {{{1
457syn match rubyBangPredicateMethod "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[?!]"
458
459if !exists("ruby_no_special_methods")
460  syn match rubyControl "\%#=1\<exit!" display
461endif
462syn match rubyDefinedOperator "\%#=1\<defined?" display
463
464" 1.9-style Hash Keys and Keyword Parameters {{{1
465syn match rubySymbol "\%([{(|,]\_s*\)\@<=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[?!]\=::\@!"he=e-1
466syn match rubySymbol "[]})\"':]\@1<!\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],;]\@="he=e-1
467syn match rubySymbol "[[:space:],{(]\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],;]\@="hs=s+1,he=e-1
468
469" __END__ Directive {{{1
470SynFold '__END__' syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$"
471
472" Default Highlighting {{{1
473hi def link rubyClass			rubyDefine
474hi def link rubyModule			rubyDefine
475hi def link rubyExceptionHandler2	rubyDefine
476hi def link rubyDefine			Define
477hi def link rubyAccess			rubyMacro
478hi def link rubyAttribute		rubyMacro
479hi def link rubyMacro			Macro
480hi def link rubyMethodName		rubyFunction
481hi def link rubyFunction		Function
482hi def link rubyConditional		Conditional
483hi def link rubyConditionalModifier	rubyConditional
484hi def link rubyExceptionHandler	rubyConditional
485hi def link rubyRescueModifier		rubyExceptionHandler
486hi def link rubyRepeat			Repeat
487hi def link rubyRepeatModifier		rubyRepeat
488hi def link rubyOptionalDo		rubyRepeat
489hi def link rubyControl			Statement
490hi def link rubyInclude			Include
491hi def link rubyInteger			Number
492hi def link rubyCharacter		Character
493hi def link rubyFloat			Float
494hi def link rubyBoolean			Boolean
495hi def link rubyException		Exception
496if !exists("ruby_no_identifiers")
497  hi def link rubyIdentifier		Identifier
498else
499  hi def link rubyIdentifier		NONE
500endif
501hi def link rubyClassVariable		rubyIdentifier
502hi def link rubyConstant		Type
503hi def link rubyClassName		rubyConstant
504hi def link rubyModuleName		rubyConstant
505hi def link rubyGlobalVariable		rubyIdentifier
506hi def link rubyInstanceVariable	rubyIdentifier
507hi def link rubyPredefinedIdentifier	rubyIdentifier
508hi def link rubyPredefinedConstant	rubyPredefinedIdentifier
509hi def link rubyPredefinedVariable	rubyPredefinedIdentifier
510hi def link rubySymbol			Constant
511hi def link rubyKeyword			Keyword
512
513hi def link rubyOperator		Operator
514hi def link rubyDefinedOperator		rubyOperator
515hi def link rubyEnglishBooleanOperator	rubyOperator
516if exists("ruby_operators")
517  hi def link rubyTernaryOperator	rubyOperator
518  hi def link rubyArithmeticOperator	rubyOperator
519  hi def link rubyComparisonOperator	rubyOperator
520  hi def link rubyBitwiseOperator	rubyOperator
521  hi def link rubyBooleanOperator	rubyOperator
522  hi def link rubyRangeOperator		rubyOperator
523  hi def link rubyAssignmentOperator	rubyOperator
524  hi def link rubyEqualityOperator	rubyOperator
525endif
526
527if exists("ruby_pseudo_operators")
528  hi def link rubyPseudoOperator	Special
529  hi def link rubyDotOperator		rubyPseudoOperator
530  hi def link rubyScopeOperator		rubyPseudoOperator
531  hi def link rubySuperClassOperator	rubyPseudoOperator
532  hi def link rubyEigenClassOperator	rubyPseudoOperator
533  hi def link rubyLambdaOperator	rubyPseudoOperator
534  hi def link rubyDoubleSplatOperator	rubyPseudoOperator
535  hi def link rubySplatOperator		rubyPseudoOperator
536  hi def link rubyProcOperator		rubyPseudoOperator
537endif
538
539hi def link rubyBeginEnd		Statement
540hi def link rubyEval			Statement
541hi def link rubyPseudoVariable		Constant
542hi def link rubyCapitalizedMethod	NONE
543
544hi def link rubyComment			Comment
545hi def link rubyEncoding		Constant
546hi def link rubyMagicComment		SpecialComment
547hi def link rubyData			Comment
548hi def link rubyDataDirective		Delimiter
549hi def link rubyDocumentation		Comment
550hi def link rubyTodo			Todo
551
552hi def link rubyBackslashEscape		rubyStringEscape
553hi def link rubyQuoteEscape		rubyStringEscape
554hi def link rubySpaceEscape		rubyStringEscape
555hi def link rubyParenthesisEscape	rubyStringEscape
556hi def link rubyCurlyBraceEscape	rubyStringEscape
557hi def link rubyAngleBracketEscape	rubyStringEscape
558hi def link rubySquareBracketEscape	rubyStringEscape
559hi def link rubyStringEscape		Special
560
561hi def link rubyInterpolationDelimiter	Delimiter
562hi def link rubySharpBang		PreProc
563hi def link rubyStringDelimiter		Delimiter
564hi def link rubyHeredocDelimiter	rubyStringDelimiter
565hi def link rubyPercentRegexpDelimiter	rubyRegexpDelimiter
566hi def link rubyPercentStringDelimiter	rubyStringDelimiter
567hi def link rubyPercentSymbolDelimiter	rubySymbolDelimiter
568hi def link rubyRegexpDelimiter		rubyStringDelimiter
569hi def link rubySymbolDelimiter		rubySymbol
570hi def link rubyString			String
571hi def link rubyRegexpEscape		rubyRegexpSpecial
572hi def link rubyRegexpQuantifier	rubyRegexpSpecial
573hi def link rubyRegexpAnchor		rubyRegexpSpecial
574hi def link rubyRegexpDot		rubyRegexpCharClass
575hi def link rubyRegexpCharClass		rubyRegexpSpecial
576hi def link rubyRegexpIntersection	rubyRegexpSpecial
577hi def link rubyRegexpSpecial		Special
578hi def link rubyRegexpComment		Comment
579hi def link rubyRegexp			rubyString
580
581hi def link rubyError			Error
582if exists("ruby_line_continuation_error")
583  hi def link rubyUselessLineContinuation rubyError
584endif
585hi def link rubyGlobalVariableError	rubyError
586hi def link rubySpaceError		rubyError
587
588" Postscript {{{1
589let b:current_syntax = "ruby"
590
591let &cpo = s:cpo_sav
592unlet! s:cpo_sav
593
594delc SynFold
595
596" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
597