neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

ruby.vim (41845B)


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