xref: /vim-8.2.3635/runtime/syntax/ruby.vim (revision a7241f5f)
1071d4279SBram Moolenaar" Vim syntax file
2071d4279SBram Moolenaar" Language:		Ruby
3c6249bb2SBram Moolenaar" Maintainer:		Doug Kearns <[email protected]>
46b730e11SBram Moolenaar" Info:			$Id$
5a5792f58SBram Moolenaar" URL:			http://vim-ruby.rubyforge.org
66b730e11SBram Moolenaar" Anon CVS:		See above site
7c6249bb2SBram Moolenaar" Release Coordinator:	Doug Kearns <[email protected]>
86b730e11SBram Moolenaar" ----------------------------------------------------------------------------
96b730e11SBram Moolenaar"
10071d4279SBram Moolenaar" Previous Maintainer:	Mirko Nasato
11071d4279SBram Moolenaar" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
126b730e11SBram Moolenaar" ----------------------------------------------------------------------------
13071d4279SBram Moolenaar
14c1762ccbSBram Moolenaarif exists("b:current_syntax")
15071d4279SBram Moolenaar  finish
16071d4279SBram Moolenaarendif
17071d4279SBram Moolenaar
186b730e11SBram Moolenaarif has("folding") && exists("ruby_fold")
196b730e11SBram Moolenaar  setlocal foldmethod=syntax
206b730e11SBram Moolenaarendif
216b730e11SBram Moolenaar
226b730e11SBram Moolenaarif exists("ruby_space_errors")
236b730e11SBram Moolenaar  if !exists("ruby_no_trail_space_error")
246b730e11SBram Moolenaar    syn match rubySpaceError display excludenl "\s\+$"
256b730e11SBram Moolenaar  endif
266b730e11SBram Moolenaar  if !exists("ruby_no_tab_space_error")
276b730e11SBram Moolenaar    syn match rubySpaceError display " \+\t"me=e-1
286b730e11SBram Moolenaar  endif
296b730e11SBram Moolenaarendif
306b730e11SBram Moolenaar
319964e468SBram Moolenaar" Operators
329964e468SBram Moolenaarif exists("ruby_operators")
33c1762ccbSBram Moolenaar  syn match  rubyOperator	 "\%([~!^&|*/%+-]\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@<!>\|\*\*\|\.\.\.\|\.\.\|::\)"
34c1762ccbSBram Moolenaar  syn match  rubyPseudoOperator  "\%(-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!=\)"
35c1762ccbSBram Moolenaar  syn region rubyBracketOperator matchgroup=rubyOperator start="\%([_[:lower:]]\w*[?!=]\=\|[})]\)\@<=\[\s*" end="\s*]" contains=TOP
369964e468SBram Moolenaarendif
379964e468SBram Moolenaar
38071d4279SBram Moolenaar" Expression Substitution and Backslash Notation
396b730e11SBram Moolenaarsyn match rubyEscape	"\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}"							 contained display
406b730e11SBram Moolenaarsyn match rubyEscape	"\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display
419964e468SBram Moolenaar
429964e468SBram Moolenaarsyn region rubyInterpolation	      matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=TOP
439964e468SBram Moolenaarsyn match  rubyInterpolation	      "#\%(\$\|@@\=\)\w\+"    display contained  contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable
449964e468SBram Moolenaarsyn match  rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
45c1762ccbSBram Moolenaarsyn match  rubyInterpolation	      "#\$\%(-\w\|\W\)"       display contained  contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
46c1762ccbSBram Moolenaarsyn match  rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)"    display contained
479964e468SBram Moolenaarsyn region rubyNoInterpolation	      start="\\#{" end="}"    contained
489964e468SBram Moolenaarsyn match  rubyNoInterpolation	      "\\#{"		      display contained
499964e468SBram Moolenaarsyn match  rubyNoInterpolation	      "\\#\%(\$\|@@\=\)\w\+"  display contained
50c1762ccbSBram Moolenaarsyn match  rubyNoInterpolation	      "\\#\$\W"               display contained
516b730e11SBram Moolenaar
526b730e11SBram Moolenaarsyn match rubyDelimEscape	"\\[(<{\[)>}\]]" transparent display contained contains=NONE
536b730e11SBram Moolenaar
546b730e11SBram Moolenaarsyn region rubyNestedParentheses	start="("	end=")"		skip="\\\\\|\\)"	transparent contained contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape
556b730e11SBram Moolenaarsyn region rubyNestedCurlyBraces	start="{"	end="}"		skip="\\\\\|\\}"	transparent contained contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape
566b730e11SBram Moolenaarsyn region rubyNestedAngleBrackets	start="<"	end=">"		skip="\\\\\|\\>"	transparent contained contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape
57c1762ccbSBram Moolenaarif exists("ruby_operators")
586b730e11SBram Moolenaar  syn region rubyNestedSquareBrackets	start="\["	end="\]"	skip="\\\\\|\\\]"	transparent contained contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape
59c1762ccbSBram Moolenaarelse
60c1762ccbSBram Moolenaar  syn region rubyNestedSquareBrackets	start="\["	end="\]"	skip="\\\\\|\\\]"	transparent containedin=rubyArrayLiteral contained contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape
61c1762ccbSBram Moolenaarendif
626b730e11SBram Moolenaar
636b730e11SBram Moolenaarsyn cluster rubyStringSpecial		contains=rubyInterpolation,rubyNoInterpolation,rubyEscape
646b730e11SBram Moolenaarsyn cluster rubyExtendedStringSpecial	contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
65071d4279SBram Moolenaar
66071d4279SBram Moolenaar" Numbers and ASCII Codes
67c1762ccbSBram Moolenaarsyn match rubyASCIICode	"\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
686b730e11SBram Moolenaarsyn match rubyInteger	"\<0[xX]\x\+\%(_\x\+\)*\>"								display
696b730e11SBram Moolenaarsyn match rubyInteger	"\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>"						display
706b730e11SBram Moolenaarsyn match rubyInteger	"\<0[oO]\=\o\+\%(_\o\+\)*\>"								display
716b730e11SBram Moolenaarsyn match rubyInteger	"\<0[bB][01]\+\%(_[01]\+\)*\>"								display
726b730e11SBram Moolenaarsyn match rubyFloat	"\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>"					display
736b730e11SBram Moolenaarsyn match rubyFloat	"\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>"	display
74071d4279SBram Moolenaar
756b730e11SBram Moolenaar" Identifiers
766b730e11SBram Moolenaarsyn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
776b730e11SBram Moolenaarsyn match rubyBlockArgument	    "&[_[:lower:]][_[:alnum:]]"		 contains=NONE display transparent
78071d4279SBram Moolenaar
799964e468SBram Moolenaarsyn match  rubyConstant			"\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
806b730e11SBram Moolenaarsyn match  rubyClassVariable		"@@\h\w*" display
816b730e11SBram Moolenaarsyn match  rubyInstanceVariable		"@\h\w*"  display
826b730e11SBram Moolenaarsyn match  rubyGlobalVariable		"$\%(\h\w*\|-.\)"
83c1762ccbSBram Moolenaarsyn match  rubySymbol			"[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
84c1762ccbSBram Moolenaarsyn match  rubySymbol			"[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
85c1762ccbSBram Moolenaarsyn match  rubySymbol			"[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
86c1762ccbSBram Moolenaarsyn match  rubySymbol			"[]})\"':]\@<!:\h\w*[?!=]\="
87c1762ccbSBram Moolenaarsyn region rubySymbol			start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\""
88c1762ccbSBram Moolenaarsyn region rubySymbol			start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
89071d4279SBram Moolenaar
90c1762ccbSBram Moolenaarsyn match  rubyBlockParameter		"\h\w*" contained
91c1762ccbSBram Moolenaarsyn region rubyBlockParameterList	start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
92c1762ccbSBram Moolenaar
93c1762ccbSBram Moolenaarsyn match rubyInvalidVariable    "$[^ A-Za-z-]"
946b730e11SBram Moolenaarsyn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
956b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$_\>"											   display
966b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$-[0FIKadilpvw]\>"									   display
976b730e11SBram Moolenaarsyn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>"					   display
981e015460SBram Moolenaarsyn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
996b730e11SBram Moolenaarsyn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@!"
1006b730e11SBram Moolenaarsyn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\|RUBY_PLATFORM\|RUBY_RELEASE_DATE\)\>\%(\s*(\)\@!"
1016b730e11SBram Moolenaarsyn match rubyPredefinedConstant "\%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(RUBY_VERSION\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
102071d4279SBram Moolenaar"Obsolete Global Constants
1036b730e11SBram Moolenaar"syn match rubyPredefinedConstant "\%(::\)\=\zs\%(PLATFORM\|RELEASE_DATE\|VERSION\)\>"
1046b730e11SBram Moolenaar"syn match rubyPredefinedConstant "\%(::\)\=\zs\%(NotImplementError\)\>"
105071d4279SBram Moolenaar
106071d4279SBram Moolenaar" Normal Regular Expression
107c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,[>]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyStringSpecial fold
108c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\<\%(split\|scan\|gsub\|sub\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyStringSpecial fold
1096b730e11SBram Moolenaar
1106b730e11SBram Moolenaar" Normal String and Shell Command Output
1119964e468SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
1129964e468SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="'"	end="'"  skip="\\\\\|\\'"			       fold
1139964e468SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="`"	end="`"  skip="\\\\\|\\`"  contains=@rubyStringSpecial fold
1146b730e11SBram Moolenaar
1156b730e11SBram Moolenaar" Generalized Regular Expression
116c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"	end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
117c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{"				end="}[iomxneus]*"	 skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
118c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<"				end=">[iomxneus]*"	 skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
119c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\["				end="\][iomxneus]*"	 skip="\\\\\|\\\]"  contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
120c1762ccbSBram Moolenaarsyn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r("				end=")[iomxneus]*"	 skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
1216b730e11SBram Moolenaar
1226b730e11SBram Moolenaar" Generalized Single Quoted String, Symbol and Array of Strings
123c1762ccbSBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"  end="\z1" skip="\\\\\|\\\z1" fold
124c1762ccbSBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{"				    end="}"   skip="\\\\\|\\}"	 fold	contains=rubyNestedCurlyBraces,rubyDelimEscape
125c1762ccbSBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<"				    end=">"   skip="\\\\\|\\>"	 fold	contains=rubyNestedAngleBrackets,rubyDelimEscape
126c1762ccbSBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\["				    end="\]"  skip="\\\\\|\\\]"	 fold	contains=rubyNestedSquareBrackets,rubyDelimEscape
127c1762ccbSBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[qw]("				    end=")"   skip="\\\\\|\\)"	 fold	contains=rubyNestedParentheses,rubyDelimEscape
128c1762ccbSBram Moolenaarsyn region rubySymbol				     start="%[s]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"   end="\z1" skip="\\\\\|\\\z1" fold
129c1762ccbSBram Moolenaarsyn region rubySymbol				     start="%[s]{"				    end="}"   skip="\\\\\|\\}"	 fold	contains=rubyNestedCurlyBraces,rubyDelimEscape
130c1762ccbSBram Moolenaarsyn region rubySymbol				     start="%[s]<"				    end=">"   skip="\\\\\|\\>"	 fold	contains=rubyNestedAngleBrackets,rubyDelimEscape
131c1762ccbSBram Moolenaarsyn region rubySymbol				     start="%[s]\["				    end="\]"  skip="\\\\\|\\\]"	 fold	contains=rubyNestedSquareBrackets,rubyDelimEscape
132c1762ccbSBram Moolenaarsyn region rubySymbol				     start="%[s]("				    end=")"   skip="\\\\\|\\)"	 fold	contains=rubyNestedParentheses,rubyDelimEscape
1336b730e11SBram Moolenaar
1346b730e11SBram Moolenaar" Generalized Double Quoted String and Array of Strings and Shell Command Output
1356b730e11SBram Moolenaar" Note: %= is not matched here as the beginning of a double quoted string
1366b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)"	    end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
1376b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
1386b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={"				    end="}"   skip="\\\\\|\\}"	 contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
1396b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<"				    end=">"   skip="\\\\\|\\>"	 contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
1406b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\["				    end="\]"  skip="\\\\\|\\\]"	 contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
1416b730e11SBram Moolenaarsyn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=("				    end=")"   skip="\\\\\|\\)"	 contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
142071d4279SBram Moolenaar
143071d4279SBram Moolenaar" Here Document
144c1762ccbSBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+   end=+$+ oneline contains=TOP
145c1762ccbSBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=TOP
146c1762ccbSBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=TOP
147c1762ccbSBram Moolenaarsyn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=TOP
148071d4279SBram Moolenaar
149c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2    matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
150c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
151c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart		      fold keepend
152c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
1536b730e11SBram Moolenaar
154c1762ccbSBram Moolenaarsyn 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
155c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
156c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-'\z([^']*\)'\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart		     fold keepend
157c1762ccbSBram Moolenaarsyn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-`\z([^`]*\)`\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
1586b730e11SBram Moolenaar
1596b730e11SBram Moolenaarif exists('main_syntax') && main_syntax == 'eruby'
160d5cdbeb8SBram Moolenaar  let b:ruby_no_expensive = 1
1616b730e11SBram Moolenaarend
162071d4279SBram Moolenaar
1639964e468SBram Moolenaarsyn match  rubyAliasDeclaration    "[^[:space:];#.()]\+"  contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
1649964e468SBram Moolenaarsyn match  rubyAliasDeclaration2   "[^[:space:];#.()]\+"  contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
1659964e468SBram Moolenaarsyn match  rubyMethodDeclaration   "[^[:space:];#(]\+"	  contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
1669964e468SBram Moolenaarsyn match  rubyClassDeclaration    "[^[:space:];#<]\+"	  contained contains=rubyConstant
1679964e468SBram Moolenaarsyn match  rubyModuleDeclaration   "[^[:space:];#]\+"	  contained contains=rubyConstant
1689964e468SBram Moolenaarsyn match  rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:].:?!=]\@!" contained containedin=rubyMethodDeclaration
1699964e468SBram Moolenaarsyn match  rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
1709964e468SBram Moolenaarsyn match  rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|==\|=\~\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
171c1762ccbSBram Moolenaar
172c1762ccbSBram Moolenaar" Expensive Mode - match 'end' with the appropriate opening keyword for syntax
173c1762ccbSBram Moolenaar" based folding and special highlighting of module/class/method definitions
174d5cdbeb8SBram Moolenaarif !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
1759964e468SBram Moolenaar  syn match  rubyDefine "\<alias\>"		nextgroup=rubyAliasDeclaration	skipwhite skipnl
1769964e468SBram Moolenaar  syn match  rubyDefine "\<def\>"		nextgroup=rubyMethodDeclaration skipwhite skipnl
1779964e468SBram Moolenaar  syn match  rubyClass	"\<class\>"		nextgroup=rubyClassDeclaration	skipwhite skipnl
1789964e468SBram Moolenaar  syn match  rubyModule "\<module\>"		nextgroup=rubyModuleDeclaration skipwhite skipnl
1799964e468SBram Moolenaar  syn region rubyBlock start="\<def\>"		matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=TOP fold
1809964e468SBram Moolenaar  syn region rubyBlock start="\<class\>"	matchgroup=rubyClass  end="\<end\>" contains=TOP fold
1819964e468SBram Moolenaar  syn region rubyBlock start="\<module\>"	matchgroup=rubyModule end="\<end\>" contains=TOP fold
182071d4279SBram Moolenaar
1836b730e11SBram Moolenaar  " modifiers
184c1762ccbSBram Moolenaar  syn match  rubyConditionalModifier "\<\%(if\|unless\)\>"   display
185c1762ccbSBram Moolenaar  syn match  rubyRepeatModifier	     "\<\%(while\|until\)\>" display
186071d4279SBram Moolenaar
1879964e468SBram Moolenaar  syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=TOP fold
188c1762ccbSBram Moolenaar  " curly bracket block or hash literal
1899964e468SBram Moolenaar  syn region rubyCurlyBlock   start="{" end="}" contains=TOP fold
190c1762ccbSBram Moolenaar  syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=TOP fold
191071d4279SBram Moolenaar
192c1762ccbSBram Moolenaar  " statements without 'do'
193c1762ccbSBram Moolenaar  syn region rubyBlockExpression       matchgroup=rubyControl	  start="\<begin\>" end="\<end\>" contains=TOP fold
194c1762ccbSBram Moolenaar  syn region rubyCaseExpression	       matchgroup=rubyConditional start="\<case\>"  end="\<end\>" contains=TOP fold
195c1762ccbSBram Moolenaar  syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!?]\)\s*\)\@<=\%(if\|unless\)\>" end="\<end\>" contains=TOP fold
196071d4279SBram Moolenaar
197c1762ccbSBram Moolenaar  syn keyword rubyConditional then else when  contained containedin=rubyCaseExpression
198c1762ccbSBram Moolenaar  syn keyword rubyConditional then else elsif contained containedin=rubyConditionalExpression
199c1762ccbSBram Moolenaar
200c1762ccbSBram Moolenaar  " statements with optional 'do'
201c1762ccbSBram Moolenaar  syn region rubyOptionalDoLine   matchgroup=rubyRepeat start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\%(\<do\>\)" end="\ze\%(;\|$\)" oneline contains=TOP
202c1762ccbSBram Moolenaar  syn region rubyRepeatExpression start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=TOP nextgroup=rubyOptionalDoLine fold
203071d4279SBram Moolenaar
204071d4279SBram Moolenaar  if !exists("ruby_minlines")
205071d4279SBram Moolenaar    let ruby_minlines = 50
206071d4279SBram Moolenaar  endif
207071d4279SBram Moolenaar  exec "syn sync minlines=" . ruby_minlines
208071d4279SBram Moolenaar
2096b730e11SBram Moolenaarelse
2109964e468SBram Moolenaar  syn match   rubyControl "\<def\>"	nextgroup=rubyMethodDeclaration skipwhite skipnl
2119964e468SBram Moolenaar  syn match   rubyControl "\<class\>"	nextgroup=rubyClassDeclaration	skipwhite skipnl
2129964e468SBram Moolenaar  syn match   rubyControl "\<module\>"	nextgroup=rubyModuleDeclaration skipwhite skipnl
2139964e468SBram Moolenaar  syn keyword rubyControl case begin do for if unless while until else elsif then when end
2149964e468SBram Moolenaar  syn keyword rubyKeyword alias
2156b730e11SBram Moolenaarendif
216071d4279SBram Moolenaar
217071d4279SBram Moolenaar" Keywords
2186b730e11SBram Moolenaar" Note: the following keywords have already been defined:
2196b730e11SBram Moolenaar" begin case class def do end for if module unless until while
2209964e468SBram Moolenaarsyn keyword rubyControl		and break ensure in next not or redo rescue retry return
2216b730e11SBram Moolenaarsyn match   rubyOperator	"\<defined?" display
2229964e468SBram Moolenaarsyn keyword rubyKeyword		super undef yield
2236b730e11SBram Moolenaarsyn keyword rubyBoolean		true false
2246b730e11SBram Moolenaarsyn keyword rubyPseudoVariable	nil self __FILE__ __LINE__
225071d4279SBram Moolenaarsyn keyword rubyBeginEnd	BEGIN END
226071d4279SBram Moolenaar
2276b730e11SBram Moolenaar" Special Methods
2286b730e11SBram Moolenaarif !exists("ruby_no_special_methods")
2296b730e11SBram Moolenaar  syn keyword rubyAccess    public protected private
2306b730e11SBram Moolenaar  syn keyword rubyAttribute attr attr_accessor attr_reader attr_writer
2311e015460SBram Moolenaar  syn match   rubyControl   "\<\%(exit!\|\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>\)"
2326b730e11SBram Moolenaar  syn keyword rubyEval	    eval class_eval instance_eval module_eval
2336b730e11SBram Moolenaar  syn keyword rubyException raise fail catch throw
2346b730e11SBram Moolenaar  syn keyword rubyInclude   autoload extend include load require
2356b730e11SBram Moolenaar  syn keyword rubyKeyword   callcc caller lambda proc
236071d4279SBram Moolenaarendif
237071d4279SBram Moolenaar
2386b730e11SBram Moolenaar" Comments and Documentation
2396b730e11SBram Moolenaarsyn match   rubySharpBang     "\%^#!.*" display
240c1762ccbSBram Moolenaarsyn keyword rubyTodo	      FIXME NOTE TODO OPTIMIZE XXX contained
2416b730e11SBram Moolenaarsyn match   rubyComment       "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
2429964e468SBram Moolenaarif !exists("ruby_no_comment_fold")
2439964e468SBram Moolenaar  syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
244c1762ccbSBram Moolenaar  syn region rubyDocumentation	  start="^=begin\ze\%(\s.*\)\=$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell fold
2459964e468SBram Moolenaarelse
2469964e468SBram Moolenaar  syn region rubyDocumentation	  start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
2479964e468SBram Moolenaarendif
2486b730e11SBram Moolenaar
2496b730e11SBram Moolenaar" Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
2506b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>"			transparent contains=NONE
2516b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>"			transparent contains=NONE
2526b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>"			transparent contains=NONE
2536b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>"	transparent contains=NONE
2546b730e11SBram Moolenaar
2556b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>"	transparent contains=NONE
2566b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>"		transparent contains=NONE
2576b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>"	transparent contains=NONE
2586b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>"			transparent contains=NONE
2596b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>"			transparent contains=NONE
2606b730e11SBram Moolenaarsyn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>"			transparent contains=NONE
261071d4279SBram Moolenaar
262071d4279SBram Moolenaar" __END__ Directive
2636b730e11SBram Moolenaarsyn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
264071d4279SBram Moolenaar
265c1762ccbSBram Moolenaarhi def link rubyClass			rubyDefine
266c1762ccbSBram Moolenaarhi def link rubyModule			rubyDefine
267c1762ccbSBram Moolenaarhi def link rubyDefine			Define
268c1762ccbSBram Moolenaarhi def link rubyFunction		Function
269c1762ccbSBram Moolenaarhi def link rubyConditional		Conditional
270c1762ccbSBram Moolenaarhi def link rubyConditionalModifier	rubyConditional
271c1762ccbSBram Moolenaarhi def link rubyRepeat			Repeat
272c1762ccbSBram Moolenaarhi def link rubyRepeatModifier		rubyRepeat
273c1762ccbSBram Moolenaarhi def link rubyOptionalDo		rubyRepeat
274c1762ccbSBram Moolenaarhi def link rubyControl			Statement
275c1762ccbSBram Moolenaarhi def link rubyInclude			Include
276c1762ccbSBram Moolenaarhi def link rubyInteger			Number
277c1762ccbSBram Moolenaarhi def link rubyASCIICode		Character
278c1762ccbSBram Moolenaarhi def link rubyFloat			Float
279c1762ccbSBram Moolenaarhi def link rubyBoolean			Boolean
280c1762ccbSBram Moolenaarhi def link rubyException		Exception
2816b730e11SBram Moolenaarif !exists("ruby_no_identifiers")
282c1762ccbSBram Moolenaar  hi def link rubyIdentifier		Identifier
2836b730e11SBram Moolenaarelse
284c1762ccbSBram Moolenaar  hi def link rubyIdentifier		NONE
2856b730e11SBram Moolenaarendif
286c1762ccbSBram Moolenaarhi def link rubyClassVariable		rubyIdentifier
287c1762ccbSBram Moolenaarhi def link rubyConstant		Type
288c1762ccbSBram Moolenaarhi def link rubyGlobalVariable		rubyIdentifier
289c1762ccbSBram Moolenaarhi def link rubyBlockParameter		rubyIdentifier
290c1762ccbSBram Moolenaarhi def link rubyInstanceVariable	rubyIdentifier
291c1762ccbSBram Moolenaarhi def link rubyPredefinedIdentifier	rubyIdentifier
292c1762ccbSBram Moolenaarhi def link rubyPredefinedConstant	rubyPredefinedIdentifier
293c1762ccbSBram Moolenaarhi def link rubyPredefinedVariable	rubyPredefinedIdentifier
294c1762ccbSBram Moolenaarhi def link rubySymbol			Constant
295c1762ccbSBram Moolenaarhi def link rubyKeyword			Keyword
296c1762ccbSBram Moolenaarhi def link rubyOperator		Operator
297c1762ccbSBram Moolenaarhi def link rubyPseudoOperator		rubyOperator
298c1762ccbSBram Moolenaarhi def link rubyBeginEnd		Statement
299c1762ccbSBram Moolenaarhi def link rubyAccess			Statement
300c1762ccbSBram Moolenaarhi def link rubyAttribute		Statement
301c1762ccbSBram Moolenaarhi def link rubyEval			Statement
302c1762ccbSBram Moolenaarhi def link rubyPseudoVariable		Constant
303071d4279SBram Moolenaar
304c1762ccbSBram Moolenaarhi def link rubyComment			Comment
305c1762ccbSBram Moolenaarhi def link rubyData			Comment
306c1762ccbSBram Moolenaarhi def link rubyDataDirective		Delimiter
307c1762ccbSBram Moolenaarhi def link rubyDocumentation		Comment
308c1762ccbSBram Moolenaarhi def link rubyEscape			Special
309c1762ccbSBram Moolenaarhi def link rubyInterpolationDelimiter	Delimiter
310c1762ccbSBram Moolenaarhi def link rubyNoInterpolation		rubyString
311c1762ccbSBram Moolenaarhi def link rubySharpBang		PreProc
312c1762ccbSBram Moolenaarhi def link rubyRegexpDelimiter		rubyStringDelimiter
313c1762ccbSBram Moolenaarhi def link rubyStringDelimiter		Delimiter
314c1762ccbSBram Moolenaarhi def link rubyRegexp			rubyString
315c1762ccbSBram Moolenaarhi def link rubyString			String
316c1762ccbSBram Moolenaarhi def link rubyTodo			Todo
3176b730e11SBram Moolenaar
318c1762ccbSBram Moolenaarhi def link rubyInvalidVariable		Error
319c1762ccbSBram Moolenaarhi def link rubyError			Error
320c1762ccbSBram Moolenaarhi def link rubySpaceError		rubyError
321071d4279SBram Moolenaar
322071d4279SBram Moolenaarlet b:current_syntax = "ruby"
323071d4279SBram Moolenaar
324*a7241f5fSBram Moolenaar" vim: nowrap sw=2 sts=2 ts=8 noet :
325