Install vim73
[msysgit/mtrensch.git] / share / vim / vim73 / syntax / ruby.vim
blobe3aee1200d21d9cf7173dd27d9ca53e51c349718
1 " Vim syntax file
2 " Language:             Ruby
3 " Maintainer:           Doug Kearns <dougkearns@gmail.com>
4 " Last Change:          2009 Dec 2
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,rubyExceptional,rubyMethodExceptional,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
43 syn match rubyQuoteEscape  "\\[\\']"                                                                                        contained display
45 syn region rubyInterpolation          matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
46 syn match  rubyInterpolation          "#\%(\$\|@@\=\)\w\+"    display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable
47 syn match  rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
48 syn match  rubyInterpolation          "#\$\%(-\w\|\W\)"       display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
49 syn match  rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)"    display contained
50 syn region rubyNoInterpolation        start="\\#{" end="}"            contained
51 syn match  rubyNoInterpolation        "\\#{"                  display contained
52 syn match  rubyNoInterpolation        "\\#\%(\$\|@@\=\)\w\+"  display contained
53 syn match  rubyNoInterpolation        "\\#\$\W"               display contained
55 syn match rubyDelimEscape       "\\[(<{\[)>}\]]" transparent display contained contains=NONE
57 syn region rubyNestedParentheses    start="("  skip="\\\\\|\\)"  matchgroup=rubyString end=")"  transparent contained
58 syn region rubyNestedCurlyBraces    start="{"  skip="\\\\\|\\}"  matchgroup=rubyString end="}"  transparent contained
59 syn region rubyNestedAngleBrackets  start="<"  skip="\\\\\|\\>"  matchgroup=rubyString end=">"  transparent contained
60 syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]" transparent contained
62 " These are mostly Oniguruma ready
63 syn region rubyRegexpComment    matchgroup=rubyRegexpSpecial   start="(?#"                                                                skip="\\)"  end=")"  contained
64 syn region rubyRegexpParens     matchgroup=rubyRegexpSpecial   start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\)"  end=")"  contained transparent contains=@rubyRegexpSpecial
65 syn region rubyRegexpBrackets   matchgroup=rubyRegexpCharClass start="\[\^\="                                                             skip="\\\]" end="\]" contained transparent contains=rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass oneline
66 syn match  rubyRegexpCharClass  "\\[DdHhSsWw]"         contained display
67 syn match  rubyRegexpCharClass  "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]" contained
68 syn match  rubyRegexpEscape     "\\[].*?+^$|\\/(){}[]" contained
69 syn match  rubyRegexpQuantifier "[*?+][?+]\="          contained display
70 syn match  rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
71 syn match  rubyRegexpAnchor     "[$^]\|\\[ABbGZz]"     contained display
72 syn match  rubyRegexpDot        "\."                   contained display
73 syn match  rubyRegexpSpecial    "|"                    contained display
74 syn match  rubyRegexpSpecial    "\\[1-9]\d\=\d\@!"     contained display
75 syn match  rubyRegexpSpecial    "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
76 syn match  rubyRegexpSpecial    "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
77 syn match  rubyRegexpSpecial    "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
78 syn match  rubyRegexpSpecial    "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
80 syn cluster rubyStringSpecial         contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape
81 syn cluster rubyExtendedStringSpecial contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
82 syn cluster rubyRegexpSpecial         contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment
84 " Numbers and ASCII Codes
85 syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
86 syn match rubyInteger   "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*\>"                                                              display
87 syn match rubyInteger   "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>"                                           display
88 syn match rubyInteger   "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*\>"                                                            display
89 syn match rubyInteger   "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*\>"                                                          display
90 syn match rubyFloat     "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>"                                      display
91 syn match rubyFloat     "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
93 " Identifiers
94 syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
95 syn match rubyBlockArgument         "&[_[:lower:]][_[:alnum:]]"          contains=NONE display transparent
97 syn match  rubyConstant         "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
98 syn match  rubyClassVariable    "@@\h\w*" display
99 syn match  rubyInstanceVariable "@\h\w*"  display
100 syn match  rubyGlobalVariable   "$\%(\h\w*\|-.\)"
101 syn match  rubySymbol           "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
102 syn match  rubySymbol           "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
103 syn match  rubySymbol           "[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
104 syn match  rubySymbol           "[]})\"':]\@<!:\h\w*\%([?!=]>\@!\)\="
105 syn match  rubySymbol           "\%([{(,]\_s*\)\@<=\l\w*[!?]\=::\@!"he=e-1
106 syn match  rubySymbol           "[]})\"':]\@<!\h\w*[!?]\=:\s\@="he=e-1
107 syn region rubySymbol           start="[]})\"':]\@<!:'"  end="'"  skip="\\\\\|\\'"  contains=rubyQuoteEscape fold
108 syn region rubySymbol           start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
110 syn match  rubyBlockParameter     "\h\w*" contained
111 syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
113 syn match rubyInvalidVariable    "$[^ A-Za-z_-]"
114 syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
115 syn match rubyPredefinedVariable "$_\>"                                                                                    display
116 syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>"                                                                       display
117 syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>"                                           display
118 syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
119 syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
120 syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\|RUBY_PLATFORM\|RUBY_RELEASE_DATE\)\>\%(\s*(\)\@!"
121 syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(RUBY_VERSION\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
122 "Obsolete Global Constants
123 "syn match rubyPredefinedConstant "\%(::\)\=\zs\%(PLATFORM\|RELEASE_DATE\|VERSION\)\>"
124 "syn match rubyPredefinedConstant "\%(::\)\=\zs\%(NotImplementError\)\>"
126 " Normal Regular Expression
127 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
128 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
130 " Generalized Regular Expression
131 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
132 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{"                                end="}[iomxneus]*"   skip="\\\\\|\\}"   contains=@rubyRegexpSpecial fold
133 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<"                                end=">[iomxneus]*"   skip="\\\\\|\\>"   contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
134 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\["                               end="\][iomxneus]*"  skip="\\\\\|\\\]"  contains=@rubyRegexpSpecial fold
135 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r("                                end=")[iomxneus]*"   skip="\\\\\|\\)"   contains=@rubyRegexpSpecial fold
137 " Normal String and Shell Command Output
138 syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
139 syn region rubyString matchgroup=rubyStringDelimiter start="'"  end="'"  skip="\\\\\|\\'"  contains=rubyQuoteEscape    fold
140 syn region rubyString matchgroup=rubyStringDelimiter start="`"  end="`"  skip="\\\\\|\\`"  contains=@rubyStringSpecial fold
142 " Generalized Single Quoted String, Symbol and Array of Strings
143 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
144 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{"                                end="}"   skip="\\\\\|\\}"   fold contains=rubyNestedCurlyBraces,rubyDelimEscape
145 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<"                                end=">"   skip="\\\\\|\\>"   fold contains=rubyNestedAngleBrackets,rubyDelimEscape
146 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\["                               end="\]"  skip="\\\\\|\\\]"  fold contains=rubyNestedSquareBrackets,rubyDelimEscape
147 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]("                                end=")"   skip="\\\\\|\\)"   fold contains=rubyNestedParentheses,rubyDelimEscape
148 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"  end="\z1" skip="\\\\\|\\\z1" fold
149 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]{"                                 end="}"   skip="\\\\\|\\}"   fold contains=rubyNestedCurlyBraces,rubyDelimEscape
150 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]<"                                 end=">"   skip="\\\\\|\\>"   fold contains=rubyNestedAngleBrackets,rubyDelimEscape
151 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\["                                end="\]"  skip="\\\\\|\\\]"  fold contains=rubyNestedSquareBrackets,rubyDelimEscape
152 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]("                                 end=")"   skip="\\\\\|\\)"   fold contains=rubyNestedParentheses,rubyDelimEscape
154 " Generalized Double Quoted String and Array of Strings and Shell Command Output
155 " Note: %= is not matched here as the beginning of a double quoted string
156 syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)"       end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
157 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
158 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={"                              end="}"   skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape    fold
159 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<"                              end=">"   skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape  fold
160 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\["                             end="\]"  skip="\\\\\|\\\]"  contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
161 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=("                              end=")"   skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape    fold
163 " Here Document
164 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+   end=+$+ oneline contains=ALLBUT,@rubyNotTop
165 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
166 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
167 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
169 syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2    matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
170 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([^']*\)'\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart                    fold keepend
172 syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
174 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
175 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 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-'\z([^']*\)'\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart                    fold keepend
177 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-`\z([^`]*\)`\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
179 if exists('main_syntax') && main_syntax == 'eruby'
180   let b:ruby_no_expensive = 1
183 syn match  rubyAliasDeclaration    "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
184 syn match  rubyAliasDeclaration2   "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
185 syn match  rubyMethodDeclaration   "[^[:space:];#(]\+"   contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
186 syn match  rubyClassDeclaration    "[^[:space:];#<]\+"   contained contains=rubyConstant,rubyOperator
187 syn match  rubyModuleDeclaration   "[^[:space:];#<]\+"   contained contains=rubyConstant,rubyOperator
188 syn match  rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:]_.:?!=]\@!" contained containedin=rubyMethodDeclaration
189 syn match  rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
190 syn match  rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|==\|=\~\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
192 syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter
194 " Keywords
195 " Note: the following keywords have already been defined:
196 " begin case class def do end for if module unless until while
197 syn match   rubyControl        "\<\%(and\|break\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
198 syn match   rubyOperator       "\<defined?" display
199 syn match   rubyKeyword        "\<\%(super\|yield\)\>[?!]\@!"
200 syn match   rubyBoolean        "\<\%(true\|false\)\>[?!]\@!"
201 syn match   rubyPseudoVariable "\<\%(nil\|self\|__FILE__\|__LINE__\)\>[?!]\@!"
202 syn match   rubyBeginEnd       "\<\%(BEGIN\|END\)\>[?!]\@!"
204 " Expensive Mode - match 'end' with the appropriate opening keyword for syntax
205 " based folding and special highlighting of module/class/method definitions
206 if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
207   syn match  rubyDefine "\<alias\>"  nextgroup=rubyAliasDeclaration  skipwhite skipnl
208   syn match  rubyDefine "\<def\>"    nextgroup=rubyMethodDeclaration skipwhite skipnl
209   syn match  rubyDefine "\<undef\>"  nextgroup=rubyFunction          skipwhite skipnl
210   syn match  rubyClass  "\<class\>"  nextgroup=rubyClassDeclaration  skipwhite skipnl
211   syn match  rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
213   syn region rubyMethodBlock start="\<def\>"    matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
214   syn region rubyBlock       start="\<class\>"  matchgroup=rubyClass  end="\<end\>"                    contains=ALLBUT,@rubyNotTop fold
215   syn region rubyBlock       start="\<module\>" matchgroup=rubyModule end="\<end\>"                    contains=ALLBUT,@rubyNotTop fold
217   " modifiers
218   syn match rubyConditionalModifier "\<\%(if\|unless\)\>"    display
219   syn match rubyRepeatModifier       "\<\%(while\|until\)\>" display
221   syn region rubyDoBlock      matchgroup=rubyControl start="\<do\>" end="\<end\>"                 contains=ALLBUT,@rubyNotTop fold
222   " curly bracket block or hash literal
223   syn region rubyCurlyBlock   start="{" end="}"                                                   contains=ALLBUT,@rubyNotTop fold
224   syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
226   " statements without 'do'
227   syn region rubyBlockExpression       matchgroup=rubyControl     start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
228   syn region rubyCaseExpression        matchgroup=rubyConditional start="\<case\>"  end="\<end\>" contains=ALLBUT,@rubyNotTop fold
229   syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
231   syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!"  contained containedin=rubyCaseExpression
232   syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression
234   syn match rubyExceptional       "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyBlockExpression
235   syn match rubyMethodExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyMethodBlock
237   " statements with optional 'do'
238   syn region rubyOptionalDoLine   matchgroup=rubyRepeat start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\%(\<do\>\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
239   syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold
241   if !exists("ruby_minlines")
242     let ruby_minlines = 50
243   endif
244   exec "syn sync minlines=" . ruby_minlines
246 else
247   syn match rubyControl "\<def\>[?!]\@!"    nextgroup=rubyMethodDeclaration skipwhite skipnl
248   syn match rubyControl "\<class\>[?!]\@!"  nextgroup=rubyClassDeclaration  skipwhite skipnl
249   syn match rubyControl "\<module\>[?!]\@!" nextgroup=rubyModuleDeclaration skipwhite skipnl
250   syn match rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|ensure\|then\|when\|end\)\>[?!]\@!"
251   syn match rubyKeyword "\<\%(alias\|undef\)\>[?!]\@!"
252 endif
254 " Special Methods
255 if !exists("ruby_no_special_methods")
256   syn keyword rubyAccess    public protected private module_function
257   " attr is a common variable name
258   syn match   rubyAttribute "\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!"
259   syn keyword rubyAttribute attr_accessor attr_reader attr_writer
260   syn match   rubyControl   "\<\%(exit!\|\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>[?!]\@!\)"
261   syn keyword rubyEval      eval class_eval instance_eval module_eval
262   syn keyword rubyException raise fail catch throw
263   " false positive with 'include?'
264   syn match   rubyInclude   "\<include\>[?!]\@!"
265   syn keyword rubyInclude   autoload extend load require
266   syn keyword rubyKeyword   callcc caller lambda proc
267 endif
269 " Comments and Documentation
270 syn match   rubySharpBang "\%^#!.*" display
271 syn keyword rubyTodo      FIXME NOTE TODO OPTIMIZE XXX contained
272 syn match   rubyComment   "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
273 if !exists("ruby_no_comment_fold")
274   syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
275   syn region rubyDocumentation    start="^=begin\ze\%(\s.*\)\=$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell fold
276 else
277   syn region rubyDocumentation    start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
278 endif
280 " Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
281 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>"            transparent contains=NONE
282 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>"                transparent contains=NONE
283 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>"            transparent contains=NONE
284 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>" transparent contains=NONE
286 syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE
287 syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE
289 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>"   transparent contains=NONE
290 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>"       transparent contains=NONE
291 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>" transparent contains=NONE
292 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>"                transparent contains=NONE
293 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>"               transparent contains=NONE
294 syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>"                transparent contains=NONE
296 " __END__ Directive
297 syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
299 hi def link rubyClass                   rubyDefine
300 hi def link rubyModule                  rubyDefine
301 hi def link rubyMethodExceptional       rubyDefine
302 hi def link rubyDefine                  Define
303 hi def link rubyFunction                Function
304 hi def link rubyConditional             Conditional
305 hi def link rubyConditionalModifier     rubyConditional
306 hi def link rubyExceptional             rubyConditional
307 hi def link rubyRepeat                  Repeat
308 hi def link rubyRepeatModifier          rubyRepeat
309 hi def link rubyOptionalDo              rubyRepeat
310 hi def link rubyControl                 Statement
311 hi def link rubyInclude                 Include
312 hi def link rubyInteger                 Number
313 hi def link rubyASCIICode               Character
314 hi def link rubyFloat                   Float
315 hi def link rubyBoolean                 Boolean
316 hi def link rubyException               Exception
317 if !exists("ruby_no_identifiers")
318   hi def link rubyIdentifier            Identifier
319 else
320   hi def link rubyIdentifier            NONE
321 endif
322 hi def link rubyClassVariable           rubyIdentifier
323 hi def link rubyConstant                Type
324 hi def link rubyGlobalVariable          rubyIdentifier
325 hi def link rubyBlockParameter          rubyIdentifier
326 hi def link rubyInstanceVariable        rubyIdentifier
327 hi def link rubyPredefinedIdentifier    rubyIdentifier
328 hi def link rubyPredefinedConstant      rubyPredefinedIdentifier
329 hi def link rubyPredefinedVariable      rubyPredefinedIdentifier
330 hi def link rubySymbol                  Constant
331 hi def link rubyKeyword                 Keyword
332 hi def link rubyOperator                Operator
333 hi def link rubyPseudoOperator          rubyOperator
334 hi def link rubyBeginEnd                Statement
335 hi def link rubyAccess                  Statement
336 hi def link rubyAttribute               Statement
337 hi def link rubyEval                    Statement
338 hi def link rubyPseudoVariable          Constant
340 hi def link rubyComment                 Comment
341 hi def link rubyData                    Comment
342 hi def link rubyDataDirective           Delimiter
343 hi def link rubyDocumentation           Comment
344 hi def link rubyTodo                    Todo
346 hi def link rubyQuoteEscape             rubyStringEscape
347 hi def link rubyStringEscape            Special
348 hi def link rubyInterpolationDelimiter  Delimiter
349 hi def link rubyNoInterpolation         rubyString
350 hi def link rubySharpBang               PreProc
351 hi def link rubyRegexpDelimiter         rubyStringDelimiter
352 hi def link rubySymbolDelimiter         rubyStringDelimiter
353 hi def link rubyStringDelimiter         Delimiter
354 hi def link rubyString                  String
355 hi def link rubyRegexpEscape            rubyRegexpSpecial
356 hi def link rubyRegexpQuantifier        rubyRegexpSpecial
357 hi def link rubyRegexpAnchor            rubyRegexpSpecial
358 hi def link rubyRegexpDot               rubyRegexpCharClass
359 hi def link rubyRegexpCharClass         rubyRegexpSpecial
360 hi def link rubyRegexpSpecial           Special
361 hi def link rubyRegexpComment           Comment
362 hi def link rubyRegexp                  rubyString
364 hi def link rubyInvalidVariable         Error
365 hi def link rubyError                   Error
366 hi def link rubySpaceError              rubyError
368 let b:current_syntax = "ruby"
370 " vim: nowrap sw=2 sts=2 ts=8 noet: