blob: 8b88378e6063831063af6c7ca45f1b7d4cd421c2 [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 Moolenaarec7944a2013-06-12 21:29:15 +02004" URL: https://github.com/vim-ruby/vim-ruby
Bram Moolenaarc6249bb2006-04-15 20:25:09 +00005" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
Bram Moolenaard09091d2019-01-17 16:07:22 +01006" Last Change: 2018 Jul 09
Bram Moolenaar6b730e12005-09-16 21:47:57 +00007" ----------------------------------------------------------------------------
8"
Bram Moolenaar071d4272004-06-13 20:20:40 +00009" Previous Maintainer: Mirko Nasato
Bram Moolenaar071d4272004-06-13 20:20:40 +000010" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
Bram Moolenaar6b730e12005-09-16 21:47:57 +000011" ----------------------------------------------------------------------------
Bram Moolenaar071d4272004-06-13 20:20:40 +000012
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020013" Prelude {{{1
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000014if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
17
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020018" this file uses line continuations
19let s:cpo_sav = &cpo
20set cpo&vim
21
22" Folding Config {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +000023if has("folding") && exists("ruby_fold")
24 setlocal foldmethod=syntax
25endif
26
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020027let s:foldable_groups = split(
28 \ get(
29 \ b:,
30 \ 'ruby_foldable_groups',
31 \ get(g:, 'ruby_foldable_groups', 'ALL')
32 \ )
33 \ )
34
35function! s:foldable(...) abort
36 if index(s:foldable_groups, 'ALL') > -1
37 return 1
38 endif
39
40 for l:i in a:000
41 if index(s:foldable_groups, l:i) > -1
42 return 1
43 endif
44 endfor
45
46 return 0
47endfunction " }}}
48
Bram Moolenaard09091d2019-01-17 16:07:22 +010049syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyExceptional,rubyMethodExceptional,rubyTodo,rubyModuleName,rubyClassName,rubySymbolDelimiter
Bram Moolenaarc236c162008-07-13 17:41:49 +000050
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020051" Whitespace Errors {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +000052if exists("ruby_space_errors")
53 if !exists("ruby_no_trail_space_error")
54 syn match rubySpaceError display excludenl "\s\+$"
55 endif
56 if !exists("ruby_no_tab_space_error")
57 syn match rubySpaceError display " \+\t"me=e-1
58 endif
59endif
60
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020061" Operators {{{1
Bram Moolenaar9964e462007-05-05 17:54:07 +000062if exists("ruby_operators")
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020063 syn match rubyOperator "[~!^|*/%+-]\|&\.\@!\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@1<!>\|\*\*\|\.\.\.\|\.\.\|::"
Bram Moolenaarec7944a2013-06-12 21:29:15 +020064 syn match rubyOperator "->\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!="
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020065 syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@2<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop
Bram Moolenaar9964e462007-05-05 17:54:07 +000066endif
67
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020068" Expression Substitution and Backslash Notation {{{1
Bram Moolenaar1d689522010-05-28 20:54:39 +020069syn match rubyStringEscape "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}" contained display
70syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display
71syn match rubyQuoteEscape "\\[\\']" contained display
Bram Moolenaar9964e462007-05-05 17:54:07 +000072
Bram Moolenaarc236c162008-07-13 17:41:49 +000073syn region rubyInterpolation matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
Bram Moolenaar1d689522010-05-28 20:54:39 +020074syn match rubyInterpolation "#\%(\$\|@@\=\)\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable
Bram Moolenaar9964e462007-05-05 17:54:07 +000075syn match rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained
Bram Moolenaar1d689522010-05-28 20:54:39 +020076syn match rubyInterpolation "#\$\%(-\w\|\W\)" display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
Bram Moolenaarc1762cc2007-05-10 16:56:30 +000077syn match rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)" display contained
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020078syn region rubyNoInterpolation start="\\#{" end="}" contained
Bram Moolenaar9964e462007-05-05 17:54:07 +000079syn match rubyNoInterpolation "\\#{" display contained
80syn match rubyNoInterpolation "\\#\%(\$\|@@\=\)\w\+" display contained
Bram Moolenaar1d689522010-05-28 20:54:39 +020081syn match rubyNoInterpolation "\\#\$\W" display contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +000082
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020083syn match rubyDelimiterEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE
Bram Moolenaar6b730e12005-09-16 21:47:57 +000084
Bram Moolenaar1d689522010-05-28 20:54:39 +020085syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" matchgroup=rubyString end=")" transparent contained
86syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" matchgroup=rubyString end="}" transparent contained
87syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" matchgroup=rubyString end=">" transparent contained
88syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]" transparent contained
Bram Moolenaar6b730e12005-09-16 21:47:57 +000089
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020090" Regular Expression Metacharacters {{{1
Bram Moolenaarc236c162008-07-13 17:41:49 +000091" These are mostly Oniguruma ready
Bram Moolenaar1d689522010-05-28 20:54:39 +020092syn region rubyRegexpComment matchgroup=rubyRegexpSpecial start="(?#" skip="\\)" end=")" contained
93syn region rubyRegexpParens matchgroup=rubyRegexpSpecial start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\)" end=")" contained transparent contains=@rubyRegexpSpecial
94syn region rubyRegexpBrackets matchgroup=rubyRegexpCharClass start="\[\^\=" skip="\\\]" end="\]" contained transparent contains=rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass oneline
95syn match rubyRegexpCharClass "\\[DdHhSsWw]" contained display
96syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]" contained
97syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained
98syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display
99syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
100syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display
101syn match rubyRegexpDot "\." contained display
102syn match rubyRegexpSpecial "|" contained display
103syn match rubyRegexpSpecial "\\[1-9]\d\=\d\@!" contained display
Bram Moolenaarc236c162008-07-13 17:41:49 +0000104syn match rubyRegexpSpecial "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
105syn match rubyRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
106syn match rubyRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
107syn match rubyRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
108
Bram Moolenaar1d689522010-05-28 20:54:39 +0200109syn cluster rubyStringSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape
110syn cluster rubyExtendedStringSpecial contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets
111syn cluster rubyRegexpSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200113" Numbers and ASCII Codes {{{1
114syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@1<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
115syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>" display
116syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>" display
117syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>" display
118syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>" display
119syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>" display
120syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)r\=i\=\>" display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200122" Identifiers {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000123syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
124syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125
Bram Moolenaard09091d2019-01-17 16:07:22 +0100126syn match rubyClassName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
127syn match rubyModuleName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200128syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!"
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200129syn match rubyClassVariable "@@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200130syn match rubyInstanceVariable "@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200131syn match rubyGlobalVariable "$\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\|-.\)"
Bram Moolenaard09091d2019-01-17 16:07:22 +0100132syn match rubySymbolDelimiter ":" contained
133syn match rubySymbol "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" contains=rubySymbolDelimiter
134syn match rubySymbol "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)" contains=rubySymbolDelimiter
135syn match rubySymbol "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contains=rubySymbolDelimiter
136syn match rubySymbol "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\=" contains=rubySymbolDelimiter
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200137
138if s:foldable(':')
Bram Moolenaard09091d2019-01-17 16:07:22 +0100139 syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape fold
140 syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200141else
Bram Moolenaard09091d2019-01-17 16:07:22 +0100142 syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape
143 syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200144endif
145
146syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)*\s*(\@="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200148syn match rubyBlockParameter "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contained
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200149syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" end="|" oneline display contains=rubyBlockParameter
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000150
Bram Moolenaar1d689522010-05-28 20:54:39 +0200151syn match rubyInvalidVariable "$[^ A-Za-z_-]"
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200152syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~]#
153syn match rubyPredefinedVariable "$\d\+" display
Bram Moolenaar1e015462005-09-25 22:16:38 +0000154syn match rubyPredefinedVariable "$_\>" display
155syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>" display
156syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>" display
157syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200158syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|FALSE\|NIL\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
159syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200161" Normal Regular Expression {{{1
162if s:foldable('/')
163 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
Bram Moolenaard09091d2019-01-17 16:07:22 +0100164 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/\%([ \t=]\|$\)\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200165else
166 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial
Bram Moolenaard09091d2019-01-17 16:07:22 +0100167 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/\%([ \t=]\|$\)\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200168endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000169
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200170" Generalized Regular Expression {{{1
171if s:foldable('%')
172 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
173 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial fold
174 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape fold
175 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial fold
176 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial fold
177 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z(\s\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold
178else
179 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
180 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial
181 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape
182 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial
183 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial
184 syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z(\s\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
185endif
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000186
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200187" Normal String {{{1
188let s:spell_cluster = exists('ruby_spellcheck_strings') ? ',@Spell' : ''
189exe 'syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" ' .
190 \ (s:foldable('%') ? 'fold' : '') . ' contains=@rubyStringSpecial' . s:spell_cluster
191exe 'syn region rubyString matchgroup=rubyStringDelimiter start="''" end="''" skip="\\\\\|\\''" ' .
192 \ (s:foldable('%') ? 'fold' : '') . ' contains=rubyQuoteEscape' . s:spell_cluster
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000193
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200194" Shell Command Output {{{1
195if s:foldable('%')
196 syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial fold
197else
198 syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial
199endif
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000200
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200201" Generalized Single Quoted String, Symbol and Array of Strings {{{1
202if s:foldable('%')
203 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
204 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimiterEscape
205 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimiterEscape
206 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimiterEscape
207 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimiterEscape
208 syn region rubyString matchgroup=rubyStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1" fold
209 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
210 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimiterEscape
211 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimiterEscape
212 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimiterEscape
213 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimiterEscape
214 syn region rubyString matchgroup=rubyStringDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1" fold
215else
216 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1"
217 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" contains=rubyNestedCurlyBraces,rubyDelimiterEscape
218 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" contains=rubyNestedAngleBrackets,rubyDelimiterEscape
219 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" contains=rubyNestedSquareBrackets,rubyDelimiterEscape
220 syn region rubyString matchgroup=rubyStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" contains=rubyNestedParentheses,rubyDelimiterEscape
221 syn region rubyString matchgroup=rubyStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1"
222 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1"
223 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" contains=rubyNestedCurlyBraces,rubyDelimiterEscape
224 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" contains=rubyNestedAngleBrackets,rubyDelimiterEscape
225 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" contains=rubyNestedSquareBrackets,rubyDelimiterEscape
226 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" contains=rubyNestedParentheses,rubyDelimiterEscape
227 syn region rubyString matchgroup=rubyStringDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1"
228endif
229
230" Generalized Double Quoted String and Array of Strings and Shell Command Output {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000231" Note: %= is not matched here as the beginning of a double quoted string
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200232if s:foldable('%')
233 syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
234 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
235 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape fold
236 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape fold
237 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape fold
238 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape fold
239 syn region rubyString matchgroup=rubyStringDelimiter start="%[Qx]\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
240else
241 syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
242 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
243 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape
244 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape
245 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape
246 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape
247 syn region rubyString matchgroup=rubyStringDelimiter start="%[Qx]\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
248endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200250" Array of Symbols {{{1
251if s:foldable('%')
252 " Array of Symbols
253 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
254 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimiterEscape
255 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimiterEscape
256 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimiterEscape
257 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i(" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimiterEscape
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200259 " Array of interpolated Symbols
260 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
261 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I{" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape fold
262 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape fold
263 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape fold
264 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape fold
265else
266 " Array of Symbols
267 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1"
268 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i{" end="}" skip="\\\\\|\\}" contains=rubyNestedCurlyBraces,rubyDelimiterEscape
269 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i<" end=">" skip="\\\\\|\\>" contains=rubyNestedAngleBrackets,rubyDelimiterEscape
270 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i\[" end="\]" skip="\\\\\|\\\]" contains=rubyNestedSquareBrackets,rubyDelimiterEscape
271 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%i(" end=")" skip="\\\\\|\\)" contains=rubyNestedParentheses,rubyDelimiterEscape
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000272
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200273 " Array of interpolated Symbols
274 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
275 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I{" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimiterEscape
276 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimiterEscape
277 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimiterEscape
278 syn region rubySymbol matchgroup=rubySymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimiterEscape
279endif
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000280
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200281" Here Document {{{1
Bram Moolenaard09091d2019-01-17 16:07:22 +0100282syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<[-~]\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
283syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<[-~]\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
284syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<[-~]\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
285syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<[-~]\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200286
287if s:foldable('<<')
288 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
289 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
290 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc fold keepend
291 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial fold keepend
292
293 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
294 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
295 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart fold keepend
296 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
297else
298 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
299 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
300 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc keepend
301 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]})"'.]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,rubyHeredoc,@rubyStringSpecial keepend
302
303 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
304 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
305 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart keepend
306 syn region rubyString start=+\%(\%(class\|::\)\_s*\|\%([]}).]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
307endif
308
309" eRuby Config {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000310if exists('main_syntax') && main_syntax == 'eruby'
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000311 let b:ruby_no_expensive = 1
Bram Moolenaard09091d2019-01-17 16:07:22 +0100312endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000313
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200314" Module, Class, Method and Alias Declarations {{{1
Bram Moolenaar1d689522010-05-28 20:54:39 +0200315syn match rubyAliasDeclaration "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
316syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
317syn match rubyMethodDeclaration "[^[:space:];#(]\+" contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
Bram Moolenaard09091d2019-01-17 16:07:22 +0100318syn match rubyClassDeclaration "[^[:space:];#<]\+" contained contains=rubyClassName,rubyOperator
319syn match rubyModuleDeclaration "[^[:space:];#<]\+" contained contains=rubyModuleName,rubyOperator
320syn match rubyMethodName "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:]_.:?!=]\@!" contained containedin=rubyMethodDeclaration
321syn match rubyMethodName "\%(\s\|^\)\@1<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
322syn match rubyMethodName "\%([[:space:].]\|^\)\@2<=\%(\[\]=\=\|\*\*\|[-+!~]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000323
Bram Moolenaard09091d2019-01-17 16:07:22 +0100324syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyMethodName,rubyBlockParameter
Bram Moolenaar1d689522010-05-28 20:54:39 +0200325
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200326" Keywords {{{1
Bram Moolenaar1d689522010-05-28 20:54:39 +0200327" Note: the following keywords have already been defined:
328" begin case class def do end for if module unless until while
329syn match rubyControl "\<\%(and\|break\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
330syn match rubyOperator "\<defined?" display
331syn match rubyKeyword "\<\%(super\|yield\)\>[?!]\@!"
332syn match rubyBoolean "\<\%(true\|false\)\>[?!]\@!"
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200333syn match rubyPseudoVariable "\<\%(nil\|self\|__ENCODING__\|__dir__\|__FILE__\|__LINE__\|__callee__\|__method__\)\>[?!]\@!" " TODO: reorganise
Bram Moolenaar1d689522010-05-28 20:54:39 +0200334syn match rubyBeginEnd "\<\%(BEGIN\|END\)\>[?!]\@!"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000335
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200336" Expensive Mode {{{1
337" Match 'end' with the appropriate opening keyword for syntax based folding
338" and special highlighting of module/class/method definitions
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000339if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
Bram Moolenaar1d689522010-05-28 20:54:39 +0200340 syn match rubyDefine "\<alias\>" nextgroup=rubyAliasDeclaration skipwhite skipnl
341 syn match rubyDefine "\<def\>" nextgroup=rubyMethodDeclaration skipwhite skipnl
Bram Moolenaard09091d2019-01-17 16:07:22 +0100342 syn match rubyDefine "\<undef\>" nextgroup=rubyMethodName skipwhite skipnl
Bram Moolenaar1d689522010-05-28 20:54:39 +0200343 syn match rubyClass "\<class\>" nextgroup=rubyClassDeclaration skipwhite skipnl
344 syn match rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
345
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200346 if s:foldable('def')
347 syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
348 else
349 syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop
350 endif
351
352 if s:foldable('class')
353 syn region rubyBlock start="\<class\>" matchgroup=rubyClass end="\<end\>" contains=ALLBUT,@rubyNotTop fold
354 else
355 syn region rubyBlock start="\<class\>" matchgroup=rubyClass end="\<end\>" contains=ALLBUT,@rubyNotTop
356 endif
357
358 if s:foldable('module')
359 syn region rubyBlock start="\<module\>" matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop fold
360 else
361 syn region rubyBlock start="\<module\>" matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop
362 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000364 " modifiers
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200365 syn match rubyLineContinuation "\\$" nextgroup=rubyConditionalModifier,rubyRepeatModifier skipwhite skipnl
366 syn match rubyConditionalModifier "\<\%(if\|unless\)\>"
367 syn match rubyRepeatModifier "\<\%(while\|until\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000368
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200369 if s:foldable('do')
370 syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
371 else
372 syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
373 endif
374
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000375 " curly bracket block or hash literal
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200376 if s:foldable('{')
377 syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop fold
378 else
379 syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop
380 endif
381
382 if s:foldable('[')
383 syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200384 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000386 " statements without 'do'
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200387 if s:foldable('begin')
388 syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
389 else
390 syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
391 endif
392
393 if s:foldable('case')
394 syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
395 else
396 syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
397 endif
398
399 if s:foldable('if')
400 syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\%(\%(\%(\.\@1<!\.\)\|::\)\s*\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
401 else
402 syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\%(\%(\%(\.\@1<!\.\)\|::\)\s*\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop
403 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404
Bram Moolenaar1d689522010-05-28 20:54:39 +0200405 syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!" contained containedin=rubyCaseExpression
Bram Moolenaarc236c162008-07-13 17:41:49 +0000406 syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000407
Bram Moolenaar1d689522010-05-28 20:54:39 +0200408 syn match rubyExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyBlockExpression
409 syn match rubyMethodExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyMethodBlock
410
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000411 " statements with optional 'do'
Bram Moolenaarc236c162008-07-13 17:41:49 +0000412 syn region rubyOptionalDoLine matchgroup=rubyRepeat start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\%(\<do\>\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200413
414 if s:foldable('for')
415 syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold
416 else
417 syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine
418 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000419
420 if !exists("ruby_minlines")
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200421 let ruby_minlines = 500
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422 endif
423 exec "syn sync minlines=" . ruby_minlines
424
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000425else
Bram Moolenaar1d689522010-05-28 20:54:39 +0200426 syn match rubyControl "\<def\>[?!]\@!" nextgroup=rubyMethodDeclaration skipwhite skipnl
427 syn match rubyControl "\<class\>[?!]\@!" nextgroup=rubyClassDeclaration skipwhite skipnl
428 syn match rubyControl "\<module\>[?!]\@!" nextgroup=rubyModuleDeclaration skipwhite skipnl
429 syn match rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|ensure\|then\|when\|end\)\>[?!]\@!"
430 syn match rubyKeyword "\<\%(alias\|undef\)\>[?!]\@!"
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000431endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200433" Special Methods {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000434if !exists("ruby_no_special_methods")
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200435 syn keyword rubyAccess public protected private public_class_method private_class_method public_constant private_constant module_function
Bram Moolenaarc236c162008-07-13 17:41:49 +0000436 " attr is a common variable name
437 syn match rubyAttribute "\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!"
438 syn keyword rubyAttribute attr_accessor attr_reader attr_writer
439 syn match rubyControl "\<\%(exit!\|\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>[?!]\@!\)"
Bram Moolenaard5cdbeb2005-10-10 20:59:28 +0000440 syn keyword rubyEval eval class_eval instance_eval module_eval
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000441 syn keyword rubyException raise fail catch throw
Bram Moolenaard09091d2019-01-17 16:07:22 +0100442 syn keyword rubyInclude autoload gem load require require_relative
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000443 syn keyword rubyKeyword callcc caller lambda proc
Bram Moolenaard09091d2019-01-17 16:07:22 +0100444 " false positive with 'include?'
445 syn match rubyMacro "\<include\>[?!]\@!"
446 syn keyword rubyMacro extend prepend refine using
447 syn keyword rubyMacro alias_method define_method define_singleton_method remove_method undef_method
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000448endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200450" Comments and Documentation {{{1
Bram Moolenaar1d689522010-05-28 20:54:39 +0200451syn match rubySharpBang "\%^#!.*" display
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200452syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained
Bram Moolenaar1d689522010-05-28 20:54:39 +0200453syn match rubyComment "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200454if !exists("ruby_no_comment_fold") && s:foldable('#')
455 syn region rubyMultilineComment start="^\s*#.*\n\%(^\s*#\)\@=" end="^\s*#.*\n\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200456 syn region rubyDocumentation start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
Bram Moolenaar9964e462007-05-05 17:54:07 +0000457else
458 syn region rubyDocumentation start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
459endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200461" Keyword Nobbling {{{1
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000462" Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200463syn match rubyKeywordAsMethod "\%(\%(\.\@1<!\.\)\|::\)\_s*\%([_[:lower:]][_[:alnum:]]*\|\<\%(BEGIN\|END\)\>\)" transparent contains=NONE
464syn match rubyKeywordAsMethod "\(defined?\|exit!\)\@!\<[_[:lower:]][_[:alnum:]]*[?!]" transparent contains=NONE
Bram Moolenaar6b730e12005-09-16 21:47:57 +0000465
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200466" More Symbols {{{1
467syn match rubySymbol "\%([{(,]\_s*\)\zs\l\w*[!?]\=::\@!"he=e-1
Bram Moolenaard09091d2019-01-17 16:07:22 +0100468syn match rubySymbol "[]})\"':]\@1<!\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],]\@="he=e-1
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200469syn match rubySymbol "\%([{(,]\_s*\)\zs[[:space:],{]\l\w*[!?]\=::\@!"hs=s+1,he=e-1
470syn match rubySymbol "[[:space:],{(]\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],]\@="hs=s+1,he=e-1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000471
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200472" __END__ Directive {{{1
473if s:foldable('__END__')
474 syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold
475else
476 syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$"
477endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000478
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200479" Default Highlighting {{{1
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000480hi def link rubyClass rubyDefine
481hi def link rubyModule rubyDefine
Bram Moolenaar1d689522010-05-28 20:54:39 +0200482hi def link rubyMethodExceptional rubyDefine
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000483hi def link rubyDefine Define
Bram Moolenaard09091d2019-01-17 16:07:22 +0100484hi def link rubyAccess rubyMacro
485hi def link rubyAttribute rubyMacro
486hi def link rubyMacro Macro
487hi def link rubyMethodName rubyFunction
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000488hi def link rubyFunction Function
489hi def link rubyConditional Conditional
490hi def link rubyConditionalModifier rubyConditional
Bram Moolenaar1d689522010-05-28 20:54:39 +0200491hi def link rubyExceptional rubyConditional
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000492hi def link rubyRepeat Repeat
493hi def link rubyRepeatModifier rubyRepeat
494hi def link rubyOptionalDo rubyRepeat
495hi def link rubyControl Statement
496hi def link rubyInclude Include
497hi def link rubyInteger Number
498hi def link rubyASCIICode Character
499hi def link rubyFloat Float
500hi def link rubyBoolean Boolean
501hi def link rubyException Exception
502if !exists("ruby_no_identifiers")
503 hi def link rubyIdentifier Identifier
504else
505 hi def link rubyIdentifier NONE
Bram Moolenaar071d4272004-06-13 20:20:40 +0000506endif
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000507hi def link rubyClassVariable rubyIdentifier
508hi def link rubyConstant Type
Bram Moolenaard09091d2019-01-17 16:07:22 +0100509hi def link rubyClassName rubyConstant
510hi def link rubyModuleName rubyConstant
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000511hi def link rubyGlobalVariable rubyIdentifier
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000512hi def link rubyInstanceVariable rubyIdentifier
513hi def link rubyPredefinedIdentifier rubyIdentifier
514hi def link rubyPredefinedConstant rubyPredefinedIdentifier
515hi def link rubyPredefinedVariable rubyPredefinedIdentifier
516hi def link rubySymbol Constant
517hi def link rubyKeyword Keyword
518hi def link rubyOperator Operator
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000519hi def link rubyBeginEnd Statement
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000520hi def link rubyEval Statement
521hi def link rubyPseudoVariable Constant
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200522hi def link rubyCapitalizedMethod rubyLocalVariableOrMethod
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000523
524hi def link rubyComment Comment
525hi def link rubyData Comment
526hi def link rubyDataDirective Delimiter
527hi def link rubyDocumentation Comment
Bram Moolenaarc236c162008-07-13 17:41:49 +0000528hi def link rubyTodo Todo
529
Bram Moolenaar1d689522010-05-28 20:54:39 +0200530hi def link rubyQuoteEscape rubyStringEscape
Bram Moolenaarc236c162008-07-13 17:41:49 +0000531hi def link rubyStringEscape Special
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000532hi def link rubyInterpolationDelimiter Delimiter
533hi def link rubyNoInterpolation rubyString
534hi def link rubySharpBang PreProc
535hi def link rubyRegexpDelimiter rubyStringDelimiter
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200536hi def link rubySymbolDelimiter rubySymbol
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000537hi def link rubyStringDelimiter Delimiter
Bram Moolenaarec7944a2013-06-12 21:29:15 +0200538hi def link rubyHeredoc rubyString
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000539hi def link rubyString String
Bram Moolenaarc236c162008-07-13 17:41:49 +0000540hi def link rubyRegexpEscape rubyRegexpSpecial
541hi def link rubyRegexpQuantifier rubyRegexpSpecial
542hi def link rubyRegexpAnchor rubyRegexpSpecial
543hi def link rubyRegexpDot rubyRegexpCharClass
544hi def link rubyRegexpCharClass rubyRegexpSpecial
545hi def link rubyRegexpSpecial Special
546hi def link rubyRegexpComment Comment
547hi def link rubyRegexp rubyString
Bram Moolenaarc1762cc2007-05-10 16:56:30 +0000548
549hi def link rubyInvalidVariable Error
550hi def link rubyError Error
551hi def link rubySpaceError rubyError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200553" Postscript {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000554let b:current_syntax = "ruby"
555
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200556let &cpo = s:cpo_sav
557unlet! s:cpo_sav
558
559" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: