blob: e3aee1200d21d9cf7173dd27d9ca53e51c349718 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaarc6249bb2006-04-15 20:25:09 +00002" Language: Ruby
3" Maintainer: Doug Kearns <dougkearns@gmail.com>
Bram Moolenaar1d689522010-05-28 20:54:39 +02004" Last Change: 2009 Dec 2
Bram Moolenaarc6249bb2006-04-15 20:25:09 +00005" URL: http://vim-ruby.rubyforge.org
6" Anon CVS: See above site
7" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
Bram Moolenaar6b730e12005-09-16 21:47:57 +00008" ----------------------------------------------------------------------------
9"
Bram Moolenaar071d4272004-06-13 20:20:40 +000010" Previous Maintainer: Mirko Nasato
Bram Moolenaar071d4272004-06-13 20:20:40 +000011" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
Bram Moolenaar6b730e12005-09-16 21:47:57 +000012" ----------------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000014if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
17
Bram Moolenaar6b730e12005-09-16 21:47:57 +000018if has("folding") && exists("ruby_fold")
19 setlocal foldmethod=syntax
20endif
21
Bram Moolenaar1d689522010-05-28 20:54:39 +020022syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyExceptional,rubyMethodExceptional,rubyTodo
Bram Moolenaarc236c162008-07-13 17:41:49 +000023
Bram Moolenaar6b730e12005-09-16 21:47:57 +000024if 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
31endif
32
Bram Moolenaar9964e462007-05-05 17:54:07 +000033" Operators
34if exists("ruby_operators")
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000035 syn match rubyOperator "\%([~!^&|*/%+-]\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@<!>\|\*\*\|\.\.\.\|\.\.\|::\)"
36 syn match rubyPseudoOperator "\%(-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!=\)"
Bram Moolenaarc236c162008-07-13 17:41:49 +000037 syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop
Bram Moolenaar9964e462007-05-05 17:54:07 +000038endif
39
Bram Moolenaar071d4272004-06-13 20:20:40 +000040" Expression Substitution and Backslash Notation
Bram Moolenaar1d689522010-05-28 20:54:39 +020041syn match rubyStringEscape "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}" contained display
42syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display
43syn match rubyQuoteEscape "\\[\\']" contained display
Bram Moolenaar9964e462007-05-05 17:54:07 +000044
Bram Moolenaarc236c162008-07-13 17:41:49 +000045syn region rubyInterpolation matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
Bram Moolenaar1d689522010-05-28 20:54:39 +020046syn match rubyInterpolation "#\%(\$\|@@\=\)\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable
Bram Moolenaar9964e462007-05-05 17:54:07 +000047syn match rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
Bram Moolenaar1d689522010-05-28 20:54:39 +020048syn match rubyInterpolation "#\$\%(-\w\|\W\)" display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000049syn match rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)" display contained
Bram Moolenaar1d689522010-05-28 20:54:39 +020050syn region rubyNoInterpolation start="\\#{" end="}" contained
Bram Moolenaar9964e462007-05-05 17:54:07 +000051syn match rubyNoInterpolation "\\#{" display contained
52syn match rubyNoInterpolation "\\#\%(\$\|@@\=\)\w\+" display contained
Bram Moolenaar1d689522010-05-28 20:54:39 +020053syn match rubyNoInterpolation "\\#\$\W" display contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +000054
55syn match rubyDelimEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE
56
Bram Moolenaar1d689522010-05-28 20:54:39 +020057syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" matchgroup=rubyString end=")" transparent contained
58syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" matchgroup=rubyString end="}" transparent contained
59syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" matchgroup=rubyString end=">" transparent contained
60syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]" transparent contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +000061
Bram Moolenaarc236c162008-07-13 17:41:49 +000062" These are mostly Oniguruma ready
Bram Moolenaar1d689522010-05-28 20:54:39 +020063syn region rubyRegexpComment matchgroup=rubyRegexpSpecial start="(?#" skip="\\)" end=")" contained
64syn region rubyRegexpParens matchgroup=rubyRegexpSpecial start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\)" end=")" contained transparent contains=@rubyRegexpSpecial
65syn region rubyRegexpBrackets matchgroup=rubyRegexpCharClass start="\[\^\=" skip="\\\]" end="\]" contained transparent contains=rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass oneline
66syn match rubyRegexpCharClass "\\[DdHhSsWw]" contained display
67syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]" contained
68syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained
69syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display
70syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
71syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display
72syn match rubyRegexpDot "\." contained display
73syn match rubyRegexpSpecial "|" contained display
74syn match rubyRegexpSpecial "\\[1-9]\d\=\d\@!" contained display
Bram Moolenaarc236c162008-07-13 17:41:49 +000075syn match rubyRegexpSpecial "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
76syn match rubyRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
77syn match rubyRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
78syn match rubyRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
79
Bram Moolenaar1d689522010-05-28 20:54:39 +020080syn cluster rubyStringSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape
81syn cluster rubyExtendedStringSpecial contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
82syn cluster rubyRegexpSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment
Bram Moolenaar071d4272004-06-13 20:20:40 +000083
84" Numbers and ASCII Codes
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000085syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
Bram Moolenaar1d689522010-05-28 20:54:39 +020086syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*\>" display
87syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>" display
88syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*\>" display
89syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*\>" display
90syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>" display
91syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
Bram Moolenaar071d4272004-06-13 20:20:40 +000092
Bram Moolenaar6b730e12005-09-16 21:47:57 +000093" Identifiers
94syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
95syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent
Bram Moolenaar071d4272004-06-13 20:20:40 +000096
Bram Moolenaar1d689522010-05-28 20:54:39 +020097syn match rubyConstant "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
98syn match rubyClassVariable "@@\h\w*" display
99syn match rubyInstanceVariable "@\h\w*" display
100syn match rubyGlobalVariable "$\%(\h\w*\|-.\)"
101syn match rubySymbol "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
102syn match rubySymbol "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
103syn match rubySymbol "[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
104syn match rubySymbol "[]})\"':]\@<!:\h\w*\%([?!=]>\@!\)\="
105syn match rubySymbol "\%([{(,]\_s*\)\@<=\l\w*[!?]\=::\@!"he=e-1
106syn match rubySymbol "[]})\"':]\@<!\h\w*[!?]\=:\s\@="he=e-1
107syn region rubySymbol start="[]})\"':]\@<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape fold
108syn region rubySymbol start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109
Bram Moolenaar1d689522010-05-28 20:54:39 +0200110syn match rubyBlockParameter "\h\w*" contained
111syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000112
Bram Moolenaar1d689522010-05-28 20:54:39 +0200113syn match rubyInvalidVariable "$[^ A-Za-z_-]"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000114syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
Bram Moolenaar1e015462005-09-25 22:16:38 +0000115syn match rubyPredefinedVariable "$_\>" display
116syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>" display
117syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>" display
118syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000119syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
120syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\|RUBY_PLATFORM\|RUBY_RELEASE_DATE\)\>\%(\s*(\)\@!"
121syn 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\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125
126" Normal Regular Expression
Bram Moolenaarc236c162008-07-13 17:41:49 +0000127syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,[>]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial keepend fold
128syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
129
130" Generalized Regular Expression
Bram Moolenaar1d689522010-05-28 20:54:39 +0200131syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
132syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial fold
133syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
134syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial fold
135syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial fold
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000136
137" Normal String and Shell Command Output
Bram Moolenaar9964e462007-05-05 17:54:07 +0000138syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
Bram Moolenaar1d689522010-05-28 20:54:39 +0200139syn region rubyString matchgroup=rubyStringDelimiter start="'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape fold
Bram Moolenaar9964e462007-05-05 17:54:07 +0000140syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial fold
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000141
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000142" Generalized Single Quoted String, Symbol and Array of Strings
Bram Moolenaar1d689522010-05-28 20:54:39 +0200143syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
144syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape
145syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape
146syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape
147syn region rubyString matchgroup=rubyStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape
148syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
149syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape
150syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape
151syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape
152syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000153
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
156syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
157syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
Bram Moolenaar1d689522010-05-28 20:54:39 +0200158syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
159syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000160syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
Bram Moolenaar1d689522010-05-28 20:54:39 +0200161syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000162
163" Here Document
Bram Moolenaar1d689522010-05-28 20:54:39 +0200164syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
Bram Moolenaarc236c162008-07-13 17:41:49 +0000165syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
166syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
167syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168
Bram Moolenaar1d689522010-05-28 20:54:39 +0200169syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
170syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
171syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart fold keepend
172syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000173
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000174syn 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
175syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
176syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-'\z([^']*\)'\ze+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
177syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-`\z([^`]*\)`\ze+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000178
179if exists('main_syntax') && main_syntax == 'eruby'
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000180 let b:ruby_no_expensive = 1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000181end
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182
Bram Moolenaar1d689522010-05-28 20:54:39 +0200183syn match rubyAliasDeclaration "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
184syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
185syn match rubyMethodDeclaration "[^[:space:];#(]\+" contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
186syn match rubyClassDeclaration "[^[:space:];#<]\+" contained contains=rubyConstant,rubyOperator
187syn match rubyModuleDeclaration "[^[:space:];#<]\+" contained contains=rubyConstant,rubyOperator
188syn match rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:]_.:?!=]\@!" contained containedin=rubyMethodDeclaration
Bram Moolenaar9964e462007-05-05 17:54:07 +0000189syn match rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
190syn match rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|==\|=\~\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000191
Bram Moolenaar1d689522010-05-28 20:54:39 +0200192syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter
193
194" Keywords
195" Note: the following keywords have already been defined:
196" begin case class def do end for if module unless until while
197syn match rubyControl "\<\%(and\|break\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
198syn match rubyOperator "\<defined?" display
199syn match rubyKeyword "\<\%(super\|yield\)\>[?!]\@!"
200syn match rubyBoolean "\<\%(true\|false\)\>[?!]\@!"
201syn match rubyPseudoVariable "\<\%(nil\|self\|__FILE__\|__LINE__\)\>[?!]\@!"
202syn match rubyBeginEnd "\<\%(BEGIN\|END\)\>[?!]\@!"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000203
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000204" Expensive Mode - match 'end' with the appropriate opening keyword for syntax
205" based folding and special highlighting of module/class/method definitions
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000206if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
Bram Moolenaar1d689522010-05-28 20:54:39 +0200207 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
212
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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000217 " modifiers
Bram Moolenaar1d689522010-05-28 20:54:39 +0200218 syn match rubyConditionalModifier "\<\%(if\|unless\)\>" display
219 syn match rubyRepeatModifier "\<\%(while\|until\)\>" display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220
Bram Moolenaar1d689522010-05-28 20:54:39 +0200221 syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000222 " curly bracket block or hash literal
Bram Moolenaar1d689522010-05-28 20:54:39 +0200223 syn region rubyCurlyBlock start="{" end="}" contains=ALLBUT,@rubyNotTop fold
Bram Moolenaarc236c162008-07-13 17:41:49 +0000224 syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000226 " statements without 'do'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000227 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230
Bram Moolenaar1d689522010-05-28 20:54:39 +0200231 syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!" contained containedin=rubyCaseExpression
Bram Moolenaarc236c162008-07-13 17:41:49 +0000232 syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233
Bram Moolenaar1d689522010-05-28 20:54:39 +0200234 syn match rubyExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyBlockExpression
235 syn match rubyMethodExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyMethodBlock
236
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000237 " statements with optional 'do'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000238 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000240
241 if !exists("ruby_minlines")
242 let ruby_minlines = 50
243 endif
244 exec "syn sync minlines=" . ruby_minlines
245
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000246else
Bram Moolenaar1d689522010-05-28 20:54:39 +0200247 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\)\>[?!]\@!"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000252endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000254" Special Methods
255if !exists("ruby_no_special_methods")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000256 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\)\>[?!]\@!\)"
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000261 syn keyword rubyEval eval class_eval instance_eval module_eval
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000262 syn keyword rubyException raise fail catch throw
Bram Moolenaarc236c162008-07-13 17:41:49 +0000263 " false positive with 'include?'
264 syn match rubyInclude "\<include\>[?!]\@!"
265 syn keyword rubyInclude autoload extend load require
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000266 syn keyword rubyKeyword callcc caller lambda proc
267endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268
269" Comments and Documentation
Bram Moolenaar1d689522010-05-28 20:54:39 +0200270syn match rubySharpBang "\%^#!.*" display
271syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE XXX contained
272syn match rubyComment "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
Bram Moolenaar9964e462007-05-05 17:54:07 +0000273if !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
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000275 syn region rubyDocumentation start="^=begin\ze\%(\s.*\)\=$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell fold
Bram Moolenaar9964e462007-05-05 17:54:07 +0000276else
277 syn region rubyDocumentation start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
278endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000280" Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
Bram Moolenaar1d689522010-05-28 20:54:39 +0200281syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>" transparent contains=NONE
282syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>" transparent contains=NONE
283syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>" transparent contains=NONE
284syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>" transparent contains=NONE
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000285
Bram Moolenaar1d689522010-05-28 20:54:39 +0200286syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE
287syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE
Bram Moolenaarc236c162008-07-13 17:41:49 +0000288
Bram Moolenaar1d689522010-05-28 20:54:39 +0200289syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>" transparent contains=NONE
290syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>" transparent contains=NONE
291syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>" transparent contains=NONE
292syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>" transparent contains=NONE
293syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>" transparent contains=NONE
294syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>" transparent contains=NONE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295
296" __END__ Directive
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000297syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000299hi def link rubyClass rubyDefine
300hi def link rubyModule rubyDefine
Bram Moolenaar1d689522010-05-28 20:54:39 +0200301hi def link rubyMethodExceptional rubyDefine
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000302hi def link rubyDefine Define
303hi def link rubyFunction Function
304hi def link rubyConditional Conditional
305hi def link rubyConditionalModifier rubyConditional
Bram Moolenaar1d689522010-05-28 20:54:39 +0200306hi def link rubyExceptional rubyConditional
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000307hi def link rubyRepeat Repeat
308hi def link rubyRepeatModifier rubyRepeat
309hi def link rubyOptionalDo rubyRepeat
310hi def link rubyControl Statement
311hi def link rubyInclude Include
312hi def link rubyInteger Number
313hi def link rubyASCIICode Character
314hi def link rubyFloat Float
315hi def link rubyBoolean Boolean
316hi def link rubyException Exception
317if !exists("ruby_no_identifiers")
318 hi def link rubyIdentifier Identifier
319else
320 hi def link rubyIdentifier NONE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321endif
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000322hi def link rubyClassVariable rubyIdentifier
323hi def link rubyConstant Type
324hi def link rubyGlobalVariable rubyIdentifier
325hi def link rubyBlockParameter rubyIdentifier
326hi def link rubyInstanceVariable rubyIdentifier
327hi def link rubyPredefinedIdentifier rubyIdentifier
328hi def link rubyPredefinedConstant rubyPredefinedIdentifier
329hi def link rubyPredefinedVariable rubyPredefinedIdentifier
330hi def link rubySymbol Constant
331hi def link rubyKeyword Keyword
332hi def link rubyOperator Operator
333hi def link rubyPseudoOperator rubyOperator
334hi def link rubyBeginEnd Statement
335hi def link rubyAccess Statement
336hi def link rubyAttribute Statement
337hi def link rubyEval Statement
338hi def link rubyPseudoVariable Constant
339
340hi def link rubyComment Comment
341hi def link rubyData Comment
342hi def link rubyDataDirective Delimiter
343hi def link rubyDocumentation Comment
Bram Moolenaarc236c162008-07-13 17:41:49 +0000344hi def link rubyTodo Todo
345
Bram Moolenaar1d689522010-05-28 20:54:39 +0200346hi def link rubyQuoteEscape rubyStringEscape
Bram Moolenaarc236c162008-07-13 17:41:49 +0000347hi def link rubyStringEscape Special
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000348hi def link rubyInterpolationDelimiter Delimiter
349hi def link rubyNoInterpolation rubyString
350hi def link rubySharpBang PreProc
351hi def link rubyRegexpDelimiter rubyStringDelimiter
Bram Moolenaarc236c162008-07-13 17:41:49 +0000352hi def link rubySymbolDelimiter rubyStringDelimiter
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000353hi def link rubyStringDelimiter Delimiter
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000354hi def link rubyString String
Bram Moolenaarc236c162008-07-13 17:41:49 +0000355hi def link rubyRegexpEscape rubyRegexpSpecial
356hi def link rubyRegexpQuantifier rubyRegexpSpecial
357hi def link rubyRegexpAnchor rubyRegexpSpecial
358hi def link rubyRegexpDot rubyRegexpCharClass
359hi def link rubyRegexpCharClass rubyRegexpSpecial
360hi def link rubyRegexpSpecial Special
361hi def link rubyRegexpComment Comment
362hi def link rubyRegexp rubyString
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000363
364hi def link rubyInvalidVariable Error
365hi def link rubyError Error
366hi def link rubySpaceError rubyError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367
368let b:current_syntax = "ruby"
369
Bram Moolenaarc236c162008-07-13 17:41:49 +0000370" vim: nowrap sw=2 sts=2 ts=8 noet: