blob: f82b4c2cb74f7b32430ac2bfdc168bc82b5d71f1 [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 Moolenaar5c736222010-01-06 20:54:52 +01004" Info: $Id: ruby.vim,v 1.152 2008/06/29 04:33:41 tpope Exp $
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 Moolenaarc236c162008-07-13 17:41:49 +000022syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyTodo
23
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 Moolenaarc236c162008-07-13 17:41:49 +000041syn 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
Bram Moolenaar9964e462007-05-05 17:54:07 +000043
Bram Moolenaarc236c162008-07-13 17:41:49 +000044syn region rubyInterpolation matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
Bram Moolenaar9964e462007-05-05 17:54:07 +000045syn match rubyInterpolation "#\%(\$\|@@\=\)\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable
46syn match rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000047syn match rubyInterpolation "#\$\%(-\w\|\W\)" display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
48syn match rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)" display contained
Bram Moolenaar9964e462007-05-05 17:54:07 +000049syn region rubyNoInterpolation start="\\#{" end="}" contained
50syn match rubyNoInterpolation "\\#{" display contained
51syn match rubyNoInterpolation "\\#\%(\$\|@@\=\)\w\+" display contained
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000052syn match rubyNoInterpolation "\\#\$\W" display contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +000053
54syn match rubyDelimEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE
55
Bram Moolenaarc236c162008-07-13 17:41:49 +000056syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" matchgroup=rubyString end=")" transparent contained
57syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" matchgroup=rubyString end="}" transparent contained
58syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" matchgroup=rubyString end=">" transparent contained
59syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]" transparent contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +000060
Bram Moolenaarc236c162008-07-13 17:41:49 +000061" These are mostly Oniguruma ready
62syn region rubyRegexpComment matchgroup=rubyRegexpSpecial start="(?#" skip="\\)" end=")" contained
63syn region rubyRegexpParens matchgroup=rubyRegexpSpecial start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\)" end=")" contained transparent contains=@rubyRegexpSpecial
64syn region rubyRegexpBrackets matchgroup=rubyRegexpCharClass start="\[\^\=" skip="\\\]" end="\]" contained transparent contains=rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass oneline
65syn match rubyRegexpCharClass "\\[DdHhSsWw]" contained display
66syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]" contained
67syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained display
68syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display
69syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
70syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display
71syn match rubyRegexpDot "\." contained display
72syn match rubyRegexpSpecial "|" contained display
73syn match rubyRegexpSpecial "\\[1-9]\d\=\d\@!" contained display
74syn match rubyRegexpSpecial "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
75syn match rubyRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
76syn match rubyRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
77syn match rubyRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
78
79syn cluster rubyStringSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape
Bram Moolenaar6b730e12005-09-16 21:47:57 +000080syn cluster rubyExtendedStringSpecial contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
Bram Moolenaarc236c162008-07-13 17:41:49 +000081syn cluster rubyRegexpSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
83" Numbers and ASCII Codes
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000084syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
Bram Moolenaar6b730e12005-09-16 21:47:57 +000085syn match rubyInteger "\<0[xX]\x\+\%(_\x\+\)*\>" display
86syn match rubyInteger "\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>" display
87syn match rubyInteger "\<0[oO]\=\o\+\%(_\o\+\)*\>" display
88syn match rubyInteger "\<0[bB][01]\+\%(_[01]\+\)*\>" display
89syn match rubyFloat "\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>" display
90syn match rubyFloat "\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
Bram Moolenaar071d4272004-06-13 20:20:40 +000091
Bram Moolenaar6b730e12005-09-16 21:47:57 +000092" Identifiers
93syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
94syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent
Bram Moolenaar071d4272004-06-13 20:20:40 +000095
Bram Moolenaar9964e462007-05-05 17:54:07 +000096syn match rubyConstant "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
Bram Moolenaar6b730e12005-09-16 21:47:57 +000097syn match rubyClassVariable "@@\h\w*" display
98syn match rubyInstanceVariable "@\h\w*" display
99syn match rubyGlobalVariable "$\%(\h\w*\|-.\)"
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000100syn match rubySymbol "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
101syn match rubySymbol "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
102syn match rubySymbol "[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000103syn match rubySymbol "[]})\"':]\@<!:\h\w*\%([?!=]>\@!\)\="
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000104syn region rubySymbol start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\""
105syn region rubySymbol start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000107syn match rubyBlockParameter "\h\w*" contained
108syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
109
Bram Moolenaarc236c162008-07-13 17:41:49 +0000110syn match rubyInvalidVariable "$[^ A-Za-z_-]"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000111syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
Bram Moolenaar1e015462005-09-25 22:16:38 +0000112syn match rubyPredefinedVariable "$_\>" display
113syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>" display
114syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>" display
115syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000116syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
117syn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\|RUBY_PLATFORM\|RUBY_RELEASE_DATE\)\>\%(\s*(\)\@!"
118syn 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\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122
123" Normal Regular Expression
Bram Moolenaarc236c162008-07-13 17:41:49 +0000124syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,[>]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial keepend fold
125syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
126
127" Generalized Regular Expression
128syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
129syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial fold
130syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
131syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial fold
132syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial fold
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000133
134" Normal String and Shell Command Output
Bram Moolenaar9964e462007-05-05 17:54:07 +0000135syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
136syn region rubyString matchgroup=rubyStringDelimiter start="'" end="'" skip="\\\\\|\\'" fold
137syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial fold
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000138
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000139" Generalized Single Quoted String, Symbol and Array of Strings
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000140syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
141syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape
142syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape
143syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape
144syn region rubyString matchgroup=rubyStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape
Bram Moolenaarc236c162008-07-13 17:41:49 +0000145syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
146syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape
147syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape
148syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape
149syn region rubySymbol matchgroup=rubySymbolDelimiter start="%[s](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000150
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
153syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
154syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
155syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
156syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
157syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
158syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000159
160" Here Document
Bram Moolenaarc236c162008-07-13 17:41:49 +0000161syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
162syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
163syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
164syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000166syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
167syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
168syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart fold keepend
169syn 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 +0000170
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000171syn 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
172syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
173syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-'\z([^']*\)'\ze+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
174syn 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 +0000175
176if exists('main_syntax') && main_syntax == 'eruby'
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000177 let b:ruby_no_expensive = 1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000178end
Bram Moolenaar071d4272004-06-13 20:20:40 +0000179
Bram Moolenaar9964e462007-05-05 17:54:07 +0000180syn match rubyAliasDeclaration "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
181syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
182syn match rubyMethodDeclaration "[^[:space:];#(]\+" contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
Bram Moolenaarc236c162008-07-13 17:41:49 +0000183syn match rubyClassDeclaration "[^[:space:];#<]\+" contained contains=rubyConstant,rubyOperator
184syn match rubyModuleDeclaration "[^[:space:];#<]\+" contained contains=rubyConstant,rubyOperator
Bram Moolenaar9964e462007-05-05 17:54:07 +0000185syn match rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:].:?!=]\@!" contained containedin=rubyMethodDeclaration
186syn match rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
187syn match rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|==\|=\~\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000188
Bram Moolenaarc236c162008-07-13 17:41:49 +0000189syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter
190
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000191" Expensive Mode - match 'end' with the appropriate opening keyword for syntax
192" based folding and special highlighting of module/class/method definitions
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000193if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000194 syn match rubyDefine "\<alias\>" nextgroup=rubyAliasDeclaration skipwhite skipnl
195 syn match rubyDefine "\<def\>" nextgroup=rubyMethodDeclaration skipwhite skipnl
Bram Moolenaarc236c162008-07-13 17:41:49 +0000196 syn match rubyDefine "\<undef\>" nextgroup=rubyFunction skipwhite skipnl
Bram Moolenaar9964e462007-05-05 17:54:07 +0000197 syn match rubyClass "\<class\>" nextgroup=rubyClassDeclaration skipwhite skipnl
198 syn match rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
Bram Moolenaarc236c162008-07-13 17:41:49 +0000199 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000202
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000203 " modifiers
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000204 syn match rubyConditionalModifier "\<\%(if\|unless\)\>" display
205 syn match rubyRepeatModifier "\<\%(while\|until\)\>" display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000206
Bram Moolenaarc236c162008-07-13 17:41:49 +0000207 syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000208 " curly bracket block or hash literal
Bram Moolenaarc236c162008-07-13 17:41:49 +0000209 syn region rubyCurlyBlock start="{" end="}" contains=ALLBUT,@rubyNotTop fold
210 syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000212 " statements without 'do'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000213 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216
Bram Moolenaarc236c162008-07-13 17:41:49 +0000217 syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!" contained containedin=rubyCaseExpression
218 syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000219
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000220 " statements with optional 'do'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000221 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223
224 if !exists("ruby_minlines")
225 let ruby_minlines = 50
226 endif
227 exec "syn sync minlines=" . ruby_minlines
228
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000229else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000230 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\)\>[?!]\@!"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000235endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236
237" Keywords
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000238" Note: the following keywords have already been defined:
239" begin case class def do end for if module unless until while
Bram Moolenaarc236c162008-07-13 17:41:49 +0000240syn match rubyControl "\<\%(and\|break\|ensure\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000241syn match rubyOperator "\<defined?" display
Bram Moolenaarc236c162008-07-13 17:41:49 +0000242syn match rubyKeyword "\<\%(super\|yield\)\>[?!]\@!"
243syn match rubyBoolean "\<\%(true\|false\)\>[?!]\@!"
244syn match rubyPseudoVariable "\<\%(nil\|self\|__FILE__\|__LINE__\)\>[?!]\@!"
245syn match rubyBeginEnd "\<\%(BEGIN\|END\)\>[?!]\@!"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000246
247" Special Methods
248if !exists("ruby_no_special_methods")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000249 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\)\>[?!]\@!\)"
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000254 syn keyword rubyEval eval class_eval instance_eval module_eval
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000255 syn keyword rubyException raise fail catch throw
Bram Moolenaarc236c162008-07-13 17:41:49 +0000256 " false positive with 'include?'
257 syn match rubyInclude "\<include\>[?!]\@!"
258 syn keyword rubyInclude autoload extend load require
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000259 syn keyword rubyKeyword callcc caller lambda proc
260endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
262" Comments and Documentation
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000263syn match rubySharpBang "\%^#!.*" display
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000264syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE XXX contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000265syn match rubyComment "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
Bram Moolenaar9964e462007-05-05 17:54:07 +0000266if !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
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000268 syn region rubyDocumentation start="^=begin\ze\%(\s.*\)\=$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell fold
Bram Moolenaar9964e462007-05-05 17:54:07 +0000269else
270 syn region rubyDocumentation start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
271endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000272
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000273" Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
274syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>" transparent contains=NONE
275syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>" transparent contains=NONE
276syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>" transparent contains=NONE
277syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>" transparent contains=NONE
278
Bram Moolenaarc236c162008-07-13 17:41:49 +0000279syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE
280syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE
281
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000282syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>" transparent contains=NONE
283syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>" transparent contains=NONE
284syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>" transparent contains=NONE
285syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>" transparent contains=NONE
286syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>" transparent contains=NONE
287syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>" transparent contains=NONE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288
289" __END__ Directive
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000290syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000292hi def link rubyClass rubyDefine
293hi def link rubyModule rubyDefine
294hi def link rubyDefine Define
295hi def link rubyFunction Function
296hi def link rubyConditional Conditional
297hi def link rubyConditionalModifier rubyConditional
298hi def link rubyRepeat Repeat
299hi def link rubyRepeatModifier rubyRepeat
300hi def link rubyOptionalDo rubyRepeat
301hi def link rubyControl Statement
302hi def link rubyInclude Include
303hi def link rubyInteger Number
304hi def link rubyASCIICode Character
305hi def link rubyFloat Float
306hi def link rubyBoolean Boolean
307hi def link rubyException Exception
308if !exists("ruby_no_identifiers")
309 hi def link rubyIdentifier Identifier
310else
311 hi def link rubyIdentifier NONE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312endif
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000313hi def link rubyClassVariable rubyIdentifier
314hi def link rubyConstant Type
315hi def link rubyGlobalVariable rubyIdentifier
316hi def link rubyBlockParameter rubyIdentifier
317hi def link rubyInstanceVariable rubyIdentifier
318hi def link rubyPredefinedIdentifier rubyIdentifier
319hi def link rubyPredefinedConstant rubyPredefinedIdentifier
320hi def link rubyPredefinedVariable rubyPredefinedIdentifier
321hi def link rubySymbol Constant
322hi def link rubyKeyword Keyword
323hi def link rubyOperator Operator
324hi def link rubyPseudoOperator rubyOperator
325hi def link rubyBeginEnd Statement
326hi def link rubyAccess Statement
327hi def link rubyAttribute Statement
328hi def link rubyEval Statement
329hi def link rubyPseudoVariable Constant
330
331hi def link rubyComment Comment
332hi def link rubyData Comment
333hi def link rubyDataDirective Delimiter
334hi def link rubyDocumentation Comment
Bram Moolenaarc236c162008-07-13 17:41:49 +0000335hi def link rubyTodo Todo
336
337hi def link rubyStringEscape Special
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000338hi def link rubyInterpolationDelimiter Delimiter
339hi def link rubyNoInterpolation rubyString
340hi def link rubySharpBang PreProc
341hi def link rubyRegexpDelimiter rubyStringDelimiter
Bram Moolenaarc236c162008-07-13 17:41:49 +0000342hi def link rubySymbolDelimiter rubyStringDelimiter
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000343hi def link rubyStringDelimiter Delimiter
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000344hi def link rubyString String
Bram Moolenaarc236c162008-07-13 17:41:49 +0000345hi def link rubyRegexpEscape rubyRegexpSpecial
346hi def link rubyRegexpQuantifier rubyRegexpSpecial
347hi def link rubyRegexpAnchor rubyRegexpSpecial
348hi def link rubyRegexpDot rubyRegexpCharClass
349hi def link rubyRegexpCharClass rubyRegexpSpecial
350hi def link rubyRegexpSpecial Special
351hi def link rubyRegexpComment Comment
352hi def link rubyRegexp rubyString
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000353
354hi def link rubyInvalidVariable Error
355hi def link rubyError Error
356hi def link rubySpaceError rubyError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357
358let b:current_syntax = "ruby"
359
Bram Moolenaarc236c162008-07-13 17:41:49 +0000360" vim: nowrap sw=2 sts=2 ts=8 noet: