Merge commit 'svn-vim' into vim and update runtime files
[MacVim.git] / runtime / syntax / ruby.vim
blobf82b4c2cb74f7b32430ac2bfdc168bc82b5d71f1
1 " Vim syntax file
2 " Language:             Ruby
3 " Maintainer:           Doug Kearns <dougkearns@gmail.com>
4 " Info:                 $Id: ruby.vim,v 1.152 2008/06/29 04:33:41 tpope Exp $
5 " URL:                  http://vim-ruby.rubyforge.org
6 " Anon CVS:             See above site
7 " Release Coordinator:  Doug Kearns <dougkearns@gmail.com>
8 " ----------------------------------------------------------------------------
10 " Previous Maintainer:  Mirko Nasato
11 " Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
12 " ----------------------------------------------------------------------------
14 if exists("b:current_syntax")
15   finish
16 endif
18 if has("folding") && exists("ruby_fold")
19   setlocal foldmethod=syntax
20 endif
22 syn cluster rubyNotTop                  contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyTodo
24 if exists("ruby_space_errors")
25   if !exists("ruby_no_trail_space_error")
26     syn match rubySpaceError display excludenl "\s\+$"
27   endif
28   if !exists("ruby_no_tab_space_error")
29     syn match rubySpaceError display " \+\t"me=e-1
30   endif
31 endif
33 " Operators
34 if exists("ruby_operators")
35   syn match  rubyOperator        "\%([~!^&|*/%+-]\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@<!>\|\*\*\|\.\.\.\|\.\.\|::\)"
36   syn match  rubyPseudoOperator  "\%(-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!=\)"
37   syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop
38 endif
40 " Expression Substitution and Backslash Notation
41 syn match rubyStringEscape      "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}"                                                   contained display
42 syn match rubyStringEscape      "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display
44 syn region rubyInterpolation          matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
45 syn match  rubyInterpolation          "#\%(\$\|@@\=\)\w\+"    display contained  contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable
46 syn match  rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
47 syn match  rubyInterpolation          "#\$\%(-\w\|\W\)"       display contained  contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
48 syn match  rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)"    display contained
49 syn region rubyNoInterpolation        start="\\#{" end="}"    contained
50 syn match  rubyNoInterpolation        "\\#{"                  display contained
51 syn match  rubyNoInterpolation        "\\#\%(\$\|@@\=\)\w\+"  display contained
52 syn match  rubyNoInterpolation        "\\#\$\W"               display contained
54 syn match rubyDelimEscape       "\\[(<{\[)>}\]]" transparent display contained contains=NONE
56 syn region rubyNestedParentheses        start="("       skip="\\\\\|\\)"        matchgroup=rubyString end=")"   transparent contained
57 syn region rubyNestedCurlyBraces        start="{"       skip="\\\\\|\\}"        matchgroup=rubyString end="}"   transparent contained
58 syn region rubyNestedAngleBrackets      start="<"       skip="\\\\\|\\>"        matchgroup=rubyString end=">"   transparent contained
59 syn region rubyNestedSquareBrackets     start="\["      skip="\\\\\|\\\]"       matchgroup=rubyString end="\]"  transparent contained
61 " These are mostly Oniguruma ready
62 syn region rubyRegexpComment    matchgroup=rubyRegexpSpecial   start="(?#"                                                                      skip="\\)"  end=")"  contained
63 syn region rubyRegexpParens     matchgroup=rubyRegexpSpecial   start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)"       skip="\\)"  end=")"  contained transparent contains=@rubyRegexpSpecial
64 syn region rubyRegexpBrackets   matchgroup=rubyRegexpCharClass start="\[\^\="                                                                   skip="\\\]" end="\]" contained transparent contains=rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass oneline
65 syn match  rubyRegexpCharClass  "\\[DdHhSsWw]"          contained display
66 syn match  rubyRegexpCharClass  "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]"             contained
67 syn match  rubyRegexpEscape     "\\[].*?+^$|\\/(){}[]"  contained display
68 syn match  rubyRegexpQuantifier "[*?+][?+]\="           contained display
69 syn match  rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\="  contained display
70 syn match  rubyRegexpAnchor     "[$^]\|\\[ABbGZz]"      contained display
71 syn match  rubyRegexpDot        "\."                    contained display
72 syn match  rubyRegexpSpecial    "|"                     contained display
73 syn match  rubyRegexpSpecial    "\\[1-9]\d\=\d\@!"      contained display
74 syn match  rubyRegexpSpecial    "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
75 syn match  rubyRegexpSpecial    "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
76 syn match  rubyRegexpSpecial    "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
77 syn match  rubyRegexpSpecial    "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
79 syn cluster rubyStringSpecial           contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape
80 syn cluster rubyExtendedStringSpecial   contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
81 syn cluster rubyRegexpSpecial           contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment
83 " Numbers and ASCII Codes
84 syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
85 syn match rubyInteger   "\<0[xX]\x\+\%(_\x\+\)*\>"                                                              display
86 syn match rubyInteger   "\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>"                                           display
87 syn match rubyInteger   "\<0[oO]\=\o\+\%(_\o\+\)*\>"                                                            display
88 syn match rubyInteger   "\<0[bB][01]\+\%(_[01]\+\)*\>"                                                          display
89 syn match rubyFloat     "\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>"                                      display
90 syn match rubyFloat     "\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
92 " Identifiers
93 syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
94 syn match rubyBlockArgument         "&[_[:lower:]][_[:alnum:]]"          contains=NONE display transparent
96 syn match  rubyConstant                 "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
97 syn match  rubyClassVariable            "@@\h\w*" display
98 syn match  rubyInstanceVariable         "@\h\w*"  display
99 syn match  rubyGlobalVariable           "$\%(\h\w*\|-.\)"
100 syn match  rubySymbol                   "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
101 syn match  rubySymbol                   "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
102 syn match  rubySymbol                   "[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
103 syn match  rubySymbol                   "[]})\"':]\@<!:\h\w*\%([?!=]>\@!\)\="
104 syn region rubySymbol                   start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\""
105 syn region rubySymbol                   start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
107 syn match  rubyBlockParameter           "\h\w*" contained
108 syn region rubyBlockParameterList       start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
110 syn match rubyInvalidVariable    "$[^ A-Za-z_-]"
111 syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
112 syn match rubyPredefinedVariable "$_\>"                                                                                    display
113 syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>"                                                                       display
114 syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>"                                           display
115 syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
116 syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
117 syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\|RUBY_PLATFORM\|RUBY_RELEASE_DATE\)\>\%(\s*(\)\@!"
118 syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(RUBY_VERSION\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
119 "Obsolete Global Constants
120 "syn match rubyPredefinedConstant "\%(::\)\=\zs\%(PLATFORM\|RELEASE_DATE\|VERSION\)\>"
121 "syn match rubyPredefinedConstant "\%(::\)\=\zs\%(NotImplementError\)\>"
123 " Normal Regular Expression
124 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,[>]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial keepend fold
125 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
127 " Generalized Regular Expression
128 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*"     skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
129 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{"                                end="}[iomxneus]*"       skip="\\\\\|\\}"   contains=@rubyRegexpSpecial fold
130 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<"                                end=">[iomxneus]*"       skip="\\\\\|\\>"   contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
131 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\["                               end="\][iomxneus]*"      skip="\\\\\|\\\]"  contains=@rubyRegexpSpecial fold
132 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r("                                end=")[iomxneus]*"       skip="\\\\\|\\)"   contains=@rubyRegexpSpecial fold
134 " Normal String and Shell Command Output
135 syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
136 syn region rubyString matchgroup=rubyStringDelimiter start="'"  end="'"  skip="\\\\\|\\'"                              fold
137 syn region rubyString matchgroup=rubyStringDelimiter start="`"  end="`"  skip="\\\\\|\\`"  contains=@rubyStringSpecial fold
139 " Generalized Single Quoted String, Symbol and Array of Strings
140 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"  end="\z1" skip="\\\\\|\\\z1" fold
141 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{"                                 end="}"   skip="\\\\\|\\}"   fold   contains=rubyNestedCurlyBraces,rubyDelimEscape
142 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<"                                 end=">"   skip="\\\\\|\\>"   fold   contains=rubyNestedAngleBrackets,rubyDelimEscape
143 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\["                                end="\]"  skip="\\\\\|\\\]"  fold   contains=rubyNestedSquareBrackets,rubyDelimEscape
144 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]("                                 end=")"   skip="\\\\\|\\)"   fold   contains=rubyNestedParentheses,rubyDelimEscape
145 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"   end="\z1" skip="\\\\\|\\\z1" fold
146 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]{"                                  end="}"   skip="\\\\\|\\}"   fold   contains=rubyNestedCurlyBraces,rubyDelimEscape
147 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]<"                                  end=">"   skip="\\\\\|\\>"   fold   contains=rubyNestedAngleBrackets,rubyDelimEscape
148 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\["                                 end="\]"  skip="\\\\\|\\\]"  fold   contains=rubyNestedSquareBrackets,rubyDelimEscape
149 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]("                                  end=")"   skip="\\\\\|\\)"   fold   contains=rubyNestedParentheses,rubyDelimEscape
151 " Generalized Double Quoted String and Array of Strings and Shell Command Output
152 " Note: %= is not matched here as the beginning of a double quoted string
153 syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)"       end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
154 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
155 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={"                              end="}"   skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
156 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<"                              end=">"   skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
157 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\["                             end="\]"  skip="\\\\\|\\\]"  contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
158 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=("                              end=")"   skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
160 " Here Document
161 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+   end=+$+ oneline contains=ALLBUT,@rubyNotTop
162 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
163 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
164 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
166 syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2    matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
167 syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
168 syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart                  fold keepend
169 syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
171 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-\z(\h\w*\)\ze+hs=s+3    matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
172 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
173 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-'\z([^']*\)'\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart                    fold keepend
174 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-`\z([^`]*\)`\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
176 if exists('main_syntax') && main_syntax == 'eruby'
177   let b:ruby_no_expensive = 1
180 syn match  rubyAliasDeclaration    "[^[:space:];#.()]\+"  contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
181 syn match  rubyAliasDeclaration2   "[^[:space:];#.()]\+"  contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
182 syn match  rubyMethodDeclaration   "[^[:space:];#(]\+"    contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
183 syn match  rubyClassDeclaration    "[^[:space:];#<]\+"    contained contains=rubyConstant,rubyOperator
184 syn match  rubyModuleDeclaration   "[^[:space:];#<]\+"    contained contains=rubyConstant,rubyOperator
185 syn match  rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:].:?!=]\@!" contained containedin=rubyMethodDeclaration
186 syn match  rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
187 syn match  rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|==\|=\~\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
189 syn cluster rubyDeclaration     contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter
191 " Expensive Mode - match 'end' with the appropriate opening keyword for syntax
192 " based folding and special highlighting of module/class/method definitions
193 if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
194   syn match  rubyDefine "\<alias\>"             nextgroup=rubyAliasDeclaration  skipwhite skipnl
195   syn match  rubyDefine "\<def\>"               nextgroup=rubyMethodDeclaration skipwhite skipnl
196   syn match  rubyDefine "\<undef\>"             nextgroup=rubyFunction skipwhite skipnl
197   syn match  rubyClass  "\<class\>"             nextgroup=rubyClassDeclaration  skipwhite skipnl
198   syn match  rubyModule "\<module\>"            nextgroup=rubyModuleDeclaration skipwhite skipnl
199   syn region rubyBlock start="\<def\>"          matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
200   syn region rubyBlock start="\<class\>"        matchgroup=rubyClass  end="\<end\>" contains=ALLBUT,@rubyNotTop fold
201   syn region rubyBlock start="\<module\>"       matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop fold
203   " modifiers
204   syn match  rubyConditionalModifier "\<\%(if\|unless\)\>"   display
205   syn match  rubyRepeatModifier      "\<\%(while\|until\)\>" display
207   syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
208   " curly bracket block or hash literal
209   syn region rubyCurlyBlock   start="{" end="}" contains=ALLBUT,@rubyNotTop fold
210   syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
212   " statements without 'do'
213   syn region rubyBlockExpression       matchgroup=rubyControl     start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
214   syn region rubyCaseExpression        matchgroup=rubyConditional start="\<case\>"  end="\<end\>" contains=ALLBUT,@rubyNotTop fold
215   syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
217   syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!"  contained containedin=rubyCaseExpression
218   syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression
220   " statements with optional 'do'
221   syn region rubyOptionalDoLine   matchgroup=rubyRepeat start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\%(\<do\>\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
222   syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold
224   if !exists("ruby_minlines")
225     let ruby_minlines = 50
226   endif
227   exec "syn sync minlines=" . ruby_minlines
229 else
230   syn match   rubyControl "\<def\>[?!]\@!"      nextgroup=rubyMethodDeclaration skipwhite skipnl
231   syn match   rubyControl "\<class\>[?!]\@!"    nextgroup=rubyClassDeclaration  skipwhite skipnl
232   syn match   rubyControl "\<module\>[?!]\@!"   nextgroup=rubyModuleDeclaration skipwhite skipnl
233   syn match   rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|then\|when\|end\)\>[?!]\@!"
234   syn match   rubyKeyword "\<\%(alias\|undef\)\>[?!]\@!"
235 endif
237 " Keywords
238 " Note: the following keywords have already been defined:
239 " begin case class def do end for if module unless until while
240 syn match   rubyControl         "\<\%(and\|break\|ensure\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
241 syn match   rubyOperator        "\<defined?" display
242 syn match   rubyKeyword         "\<\%(super\|yield\)\>[?!]\@!"
243 syn match   rubyBoolean         "\<\%(true\|false\)\>[?!]\@!"
244 syn match   rubyPseudoVariable  "\<\%(nil\|self\|__FILE__\|__LINE__\)\>[?!]\@!"
245 syn match   rubyBeginEnd        "\<\%(BEGIN\|END\)\>[?!]\@!"
247 " Special Methods
248 if !exists("ruby_no_special_methods")
249   syn keyword rubyAccess    public protected private module_function
250   " attr is a common variable name
251   syn match   rubyAttribute "\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!"
252   syn keyword rubyAttribute attr_accessor attr_reader attr_writer
253   syn match   rubyControl   "\<\%(exit!\|\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>[?!]\@!\)"
254   syn keyword rubyEval      eval class_eval instance_eval module_eval
255   syn keyword rubyException raise fail catch throw
256   " false positive with 'include?'
257   syn match   rubyInclude   "\<include\>[?!]\@!"
258   syn keyword rubyInclude   autoload extend load require
259   syn keyword rubyKeyword   callcc caller lambda proc
260 endif
262 " Comments and Documentation
263 syn match   rubySharpBang     "\%^#!.*" display
264 syn keyword rubyTodo          FIXME NOTE TODO OPTIMIZE XXX contained
265 syn match   rubyComment       "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
266 if !exists("ruby_no_comment_fold")
267   syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
268   syn region rubyDocumentation    start="^=begin\ze\%(\s.*\)\=$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell fold
269 else
270   syn region rubyDocumentation    start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
271 endif
273 " Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
274 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>"                  transparent contains=NONE
275 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>"                      transparent contains=NONE
276 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>"                  transparent contains=NONE
277 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>"       transparent contains=NONE
279 syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]"              transparent contains=NONE
280 syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]"              transparent contains=NONE
282 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>"       transparent contains=NONE
283 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>"           transparent contains=NONE
284 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>"     transparent contains=NONE
285 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>"                    transparent contains=NONE
286 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>"                   transparent contains=NONE
287 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>"                    transparent contains=NONE
289 " __END__ Directive
290 syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
292 hi def link rubyClass                   rubyDefine
293 hi def link rubyModule                  rubyDefine
294 hi def link rubyDefine                  Define
295 hi def link rubyFunction                Function
296 hi def link rubyConditional             Conditional
297 hi def link rubyConditionalModifier     rubyConditional
298 hi def link rubyRepeat                  Repeat
299 hi def link rubyRepeatModifier          rubyRepeat
300 hi def link rubyOptionalDo              rubyRepeat
301 hi def link rubyControl                 Statement
302 hi def link rubyInclude                 Include
303 hi def link rubyInteger                 Number
304 hi def link rubyASCIICode               Character
305 hi def link rubyFloat                   Float
306 hi def link rubyBoolean                 Boolean
307 hi def link rubyException               Exception
308 if !exists("ruby_no_identifiers")
309   hi def link rubyIdentifier            Identifier
310 else
311   hi def link rubyIdentifier            NONE
312 endif
313 hi def link rubyClassVariable           rubyIdentifier
314 hi def link rubyConstant                Type
315 hi def link rubyGlobalVariable          rubyIdentifier
316 hi def link rubyBlockParameter          rubyIdentifier
317 hi def link rubyInstanceVariable        rubyIdentifier
318 hi def link rubyPredefinedIdentifier    rubyIdentifier
319 hi def link rubyPredefinedConstant      rubyPredefinedIdentifier
320 hi def link rubyPredefinedVariable      rubyPredefinedIdentifier
321 hi def link rubySymbol                  Constant
322 hi def link rubyKeyword                 Keyword
323 hi def link rubyOperator                Operator
324 hi def link rubyPseudoOperator          rubyOperator
325 hi def link rubyBeginEnd                Statement
326 hi def link rubyAccess                  Statement
327 hi def link rubyAttribute               Statement
328 hi def link rubyEval                    Statement
329 hi def link rubyPseudoVariable          Constant
331 hi def link rubyComment                 Comment
332 hi def link rubyData                    Comment
333 hi def link rubyDataDirective           Delimiter
334 hi def link rubyDocumentation           Comment
335 hi def link rubyTodo                    Todo
337 hi def link rubyStringEscape            Special
338 hi def link rubyInterpolationDelimiter  Delimiter
339 hi def link rubyNoInterpolation         rubyString
340 hi def link rubySharpBang               PreProc
341 hi def link rubyRegexpDelimiter         rubyStringDelimiter
342 hi def link rubySymbolDelimiter         rubyStringDelimiter
343 hi def link rubyStringDelimiter         Delimiter
344 hi def link rubyString                  String
345 hi def link rubyRegexpEscape            rubyRegexpSpecial
346 hi def link rubyRegexpQuantifier        rubyRegexpSpecial
347 hi def link rubyRegexpAnchor            rubyRegexpSpecial
348 hi def link rubyRegexpDot               rubyRegexpCharClass
349 hi def link rubyRegexpCharClass         rubyRegexpSpecial
350 hi def link rubyRegexpSpecial           Special
351 hi def link rubyRegexpComment           Comment
352 hi def link rubyRegexp                  rubyString
354 hi def link rubyInvalidVariable         Error
355 hi def link rubyError                   Error
356 hi def link rubySpaceError              rubyError
358 let b:current_syntax = "ruby"
360 " vim: nowrap sw=2 sts=2 ts=8 noet: