ruby.vim 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. " Vim syntax file
  2. " Language: Ruby
  3. " Maintainer: Doug Kearns <dougkearns@gmail.com>
  4. " URL: https://github.com/vim-ruby/vim-ruby
  5. " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
  6. " Last Change: 2021 Nov 03
  7. " ----------------------------------------------------------------------------
  8. "
  9. " Previous Maintainer: Mirko Nasato
  10. " Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN)
  11. " ----------------------------------------------------------------------------
  12. " Prelude {{{1
  13. if exists("b:current_syntax")
  14. finish
  15. endif
  16. " this file uses line continuations
  17. let s:cpo_sav = &cpo
  18. set cpo&vim
  19. " eRuby Config {{{1
  20. if exists('main_syntax') && main_syntax == 'eruby'
  21. let b:ruby_no_expensive = 1
  22. endif
  23. " Folding Config {{{1
  24. if has("folding") && exists("ruby_fold")
  25. setlocal foldmethod=syntax
  26. endif
  27. let s:foldable_groups = split(
  28. \ get(
  29. \ b:,
  30. \ 'ruby_foldable_groups',
  31. \ get(g:, 'ruby_foldable_groups', 'ALL')
  32. \ )
  33. \ )
  34. function! s:foldable(...) abort
  35. if index(s:foldable_groups, 'NONE') > -1
  36. return 0
  37. endif
  38. if index(s:foldable_groups, 'ALL') > -1
  39. return 1
  40. endif
  41. for l:i in a:000
  42. if index(s:foldable_groups, l:i) > -1
  43. return 1
  44. endif
  45. endfor
  46. return 0
  47. endfunction
  48. function! s:run_syntax_fold(args) abort
  49. let [_0, _1, groups, cmd; _] = matchlist(a:args, '\(["'']\)\(.\{-}\)\1\s\+\(.*\)')
  50. if call('s:foldable', split(groups))
  51. let cmd .= ' fold'
  52. endif
  53. exe cmd
  54. endfunction
  55. com! -nargs=* SynFold call s:run_syntax_fold(<q-args>)
  56. " Not-Top Cluster {{{1
  57. syn cluster rubyNotTop contains=@rubyCommentNotTop,@rubyStringNotTop,@rubyRegexpSpecial,@rubyDeclaration,@rubyExceptionHandler,@rubyClassOperator,rubyConditional,rubyModuleName,rubyClassName,rubySymbolDelimiter,rubyDoubleQuoteSymbolDelimiter,rubySingleQuoteSymbolDelimiter,rubyParentheses,@Spell
  58. " Whitespace Errors {{{1
  59. if exists("ruby_space_errors")
  60. if !exists("ruby_no_trail_space_error")
  61. syn match rubySpaceError display excludenl "\s\+$"
  62. endif
  63. if !exists("ruby_no_tab_space_error")
  64. syn match rubySpaceError display " \+\t"me=e-1
  65. endif
  66. endif
  67. " Operators {{{1
  68. syn match rubyEnglishBooleanOperator "\<\%(and\|or\|not\)\>"
  69. if exists("ruby_operators") || exists("ruby_pseudo_operators")
  70. syn match rubyDotOperator "\.\|&\."
  71. syn match rubyTernaryOperator "\%(\w\|[^\x00-\x7F]\)\@1<!?\|:"
  72. syn match rubyArithmeticOperator "\*\*\|[*/%+]\|->\@!"
  73. syn match rubyComparisonOperator "<=>\|<=\|<\|>=\|[-=]\@1<!>"
  74. syn match rubyBitwiseOperator "[~^|]\|&\.\@!\|<<\|>>"
  75. syn match rubyBooleanOperator "\%(\w\|[^\x00-\x7F]\)\@1<!!\|&&\|||"
  76. syn match rubyRangeOperator "\.\.\.\="
  77. syn match rubyAssignmentOperator "=>\@!\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|||=\||=\|%=\|+=\|>>=\|<<=\|\^="
  78. syn match rubyAssignmentOperator "=>\@!" contained containedin=rubyBlockParameterList " TODO: this is inelegant
  79. syn match rubyEqualityOperator "===\|==\|!=\|!\~\|=\~"
  80. syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<=\[" end="]" contains=ALLBUT,@rubyNotTop
  81. syn match rubyScopeOperator "::"
  82. syn match rubySuperClassOperator "<" contained
  83. syn match rubyEigenClassOperator "<<" contained
  84. syn match rubyLambdaOperator "->"
  85. syn match rubySplatOperator "\%([[{(|,=]\_s*\)\@<=\*"
  86. syn match rubySplatOperator "\%(^\|\s\)\@1<=\*\%(\h\|[^\x00-\x7F]\|[:$@[]\)\@="
  87. syn match rubyDoubleSplatOperator "\%([{(|,]\_s*\)\@<=\*\*"
  88. syn match rubyDoubleSplatOperator "\s\@1<=\*\*\%(\h\|[^\x00-\x7F]\|[:$@{]\)\@="
  89. syn match rubyProcOperator "\%([[(|,]\_s*\)\@<=&"
  90. syn match rubyProcOperator "\s\@1<=&\%(\h\|[^\x00-\x7F]\|[:$@]\|->\)\@="
  91. syn cluster rubyProperOperator contains=rubyTernaryOperator,rubyArithmeticOperator,rubyComparisonOperator,rubyBitwiseOperator,rubyBooleanOperator,rubyRangeOperator,rubyAssignmentOperator,rubyEqualityOperator,rubyDefinedOperator,rubyEnglishBooleanOperator
  92. syn cluster rubyClassOperator contains=rubyEigenClassOperator,rubySuperClassOperator
  93. syn cluster rubyPseudoOperator contains=rubyDotOperator,rubyScopeOperator,rubyEigenClassOperator,rubySuperClassOperator,rubyLambdaOperator,rubySplatOperator,rubyDoubleSplatOperator,rubyProcOperator
  94. syn cluster rubyOperator contains=ruby.*Operator
  95. endif
  96. " String Interpolation and Backslash Notation {{{1
  97. syn region rubyInterpolation matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
  98. syn match rubyInterpolation "#\$\%(-\w\|[!$&"'*+,./0:;<>?@\`~_]\|\w\+\)" display contained contains=rubyInterpolationDelimiter,@rubyGlobalVariable
  99. syn match rubyInterpolation "#@@\=\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable
  100. syn match rubyInterpolationDelimiter "#\ze[$@]" display contained
  101. syn match rubyStringEscape "\\\_." contained display
  102. syn match rubyStringEscape "\\\o\{1,3}\|\\x\x\{1,2}" contained display
  103. syn match rubyStringEscape "\\u\%(\x\{4}\|{\x\{1,6}\%(\s\+\x\{1,6}\)*}\)" contained display
  104. syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=.\)" contained display
  105. syn match rubyBackslashEscape "\\\\" contained display
  106. syn match rubyQuoteEscape "\\'" contained display
  107. syn match rubySpaceEscape "\\ " contained display
  108. syn match rubyParenthesisEscape "\\[()]" contained display
  109. syn match rubyCurlyBraceEscape "\\[{}]" contained display
  110. syn match rubyAngleBracketEscape "\\[<>]" contained display
  111. syn match rubySquareBracketEscape "\\[[\]]" contained display
  112. syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" end=")" transparent contained
  113. syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" end="}" transparent contained
  114. syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" end=">" transparent contained
  115. syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" end="\]" transparent contained
  116. syn cluster rubySingleCharEscape contains=rubyBackslashEscape,rubyQuoteEscape,rubySpaceEscape,rubyParenthesisEscape,rubyCurlyBraceEscape,rubyAngleBracketEscape,rubySquareBracketEscape
  117. syn cluster rubyNestedBrackets contains=rubyNested.\+
  118. syn cluster rubyStringSpecial contains=rubyInterpolation,rubyStringEscape
  119. syn cluster rubyStringNotTop contains=@rubyStringSpecial,@rubyNestedBrackets,@rubySingleCharEscape
  120. " Regular Expression Metacharacters {{{1
  121. syn region rubyRegexpComment matchgroup=rubyRegexpSpecial start="(?#" skip="\\\\\|\\)" end=")" contained
  122. syn region rubyRegexpParens matchgroup=rubyRegexpSpecial start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\\\\|\\)" end=")" contained transparent contains=@rubyRegexpSpecial
  123. syn region rubyRegexpBrackets matchgroup=rubyRegexpCharClass start="\[\^\=" skip="\\\\\|\\\]" end="\]" contained transparent contains=rubyRegexpBrackets,rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass,rubyRegexpIntersection oneline
  124. syn match rubyRegexpCharClass "\\[DdHhRSsWw]" contained display
  125. syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|xdigit\):\]" contained
  126. syn match rubyRegexpCharClass "\\[pP]{^\=.\{-}}" contained display
  127. syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained " see commit e477f10
  128. syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display
  129. syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
  130. syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display
  131. syn match rubyRegexpDot "\.\|\\X" contained display
  132. syn match rubyRegexpIntersection "&&" contained display
  133. syn match rubyRegexpSpecial "\\K" contained display
  134. syn match rubyRegexpSpecial "|" contained display
  135. syn match rubyRegexpSpecial "\\[1-9]\d\=\d\@!" contained display
  136. syn match rubyRegexpSpecial "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
  137. syn match rubyRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
  138. syn match rubyRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
  139. syn match rubyRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
  140. syn cluster rubyRegexpSpecial contains=@rubyStringSpecial,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment,rubyRegexpIntersection
  141. " Numbers {{{1
  142. syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>" display
  143. syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>" display
  144. syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>" display
  145. syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>" display
  146. syn match rubyFloat "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>" display
  147. syn match rubyFloat "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)i\=\>" display
  148. " Identifiers {{{1
  149. syn match rubyClassName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
  150. syn match rubyModuleName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
  151. syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!"
  152. syn match rubyClassVariable "@@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
  153. syn match rubyInstanceVariable "@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display
  154. syn match rubyGlobalVariable "$\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\|-.\)"
  155. syn match rubySymbolDelimiter ":" contained
  156. syn match rubySymbol "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" contains=rubySymbolDelimiter
  157. syn match rubySymbol "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)" contains=rubySymbolDelimiter
  158. syn match rubySymbol "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contains=rubySymbolDelimiter
  159. syn match rubySymbol "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\=" contains=rubySymbolDelimiter
  160. SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape,rubyBackslashEscape
  161. SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
  162. syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@="
  163. syn region rubyParentheses start="(" end=")" contains=ALLBUT,@rubyNotTop contained containedin=rubyBlockParameterList
  164. syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" end="|" contains=ALLBUT,@rubyNotTop,@rubyProperOperator
  165. if exists('ruby_global_variable_error')
  166. syn match rubyGlobalVariableError "$[^A-Za-z_]" display
  167. syn match rubyGlobalVariableError "$-[^0FIKWadilpvw]" display
  168. endif
  169. syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<>?@\`~]#
  170. syn match rubyPredefinedVariable "$\d\+" display
  171. syn match rubyPredefinedVariable "$_\>" display
  172. syn match rubyPredefinedVariable "$-[0FIWadilpvw]\>" display
  173. syn match rubyPredefinedVariable "$\%(stderr\|stdin\|stdout\)\>" display
  174. syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
  175. syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\)\>\%(\s*(\)\@!"
  176. syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
  177. " Deprecated/removed in 1.9
  178. syn match rubyPredefinedVariable "$="
  179. syn match rubyPredefinedVariable "$-K\>" display
  180. syn match rubyPredefinedVariable "$\%(deferr\|defout\)\>" display
  181. syn match rubyPredefinedVariable "$KCODE\>" display
  182. " Deprecated/removed in 2.4
  183. syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(FALSE\|NIL\|TRUE\)\>\%(\s*(\)\@!"
  184. syn cluster rubyGlobalVariable contains=rubyGlobalVariable,rubyPredefinedVariable,rubyGlobalVariableError
  185. " Normal Regular Expressions {{{1
  186. SynFold '/' syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
  187. SynFold '/' syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\s\+\)\@<=/\%(=\|\_s\)\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
  188. " Generalized Regular Expressions {{{1
  189. SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
  190. SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial
  191. SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets
  192. SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial
  193. SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial
  194. SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\z(\s\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
  195. " Characters {{{1
  196. syn match rubyCharacter "\%(\w\|[^\x00-\x7F]\|[]})\"'/]\)\@1<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\[[:space:]]\|\\\=[^[:space:]]\)\)"
  197. syn match rubyCharacter "\%(\w\|[^\x00-\x7F]\|[]})\"'/]\)\@1<!?\\u\%(\x\{4}\|{\x\{1,6}}\)"
  198. " Normal Strings {{{1
  199. let s:spell_cluster = exists('ruby_spellcheck_strings') ? ',@Spell' : ''
  200. let s:fold_arg = s:foldable('string') ? ' fold' : ''
  201. exe 'syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial' . s:spell_cluster . s:fold_arg
  202. exe 'syn region rubyString matchgroup=rubyStringDelimiter start="''" end="''" skip="\\\\\|\\''" contains=rubyQuoteEscape,rubyBackslashEscape' . s:spell_cluster . s:fold_arg
  203. unlet s:spell_cluster s:fold_arg
  204. " Shell Command Output {{{1
  205. SynFold 'string' syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial
  206. " Generalized Single Quoted Strings, Symbols, Array of Strings and Array of Symbols {{{1
  207. " Non-bracket punctuation delimiters {{{2
  208. let s:names = { '~': 'Tilde', '`': 'BackQuote', '!': 'Bang', '@': 'At', '#': 'Hash', '$': 'Dollar', '%': 'Percent', '^': 'Caret',
  209. \ '&': 'Ampersand', '*': 'Asterix', '_': 'Underscore', '-': 'Dash', '+': 'Plus', '=': 'Equals', '|': 'Bar',
  210. \ '\': 'Backslash', ':': 'Colon', ';': 'Semicolon', '"': 'DoubleQuote', "'": 'Quote', ',': 'Comma', '.': 'Period',
  211. \ '?': 'QuestionMark', '/': 'ForwardSlash' }
  212. for s:delimiter in keys(s:names)
  213. let s:group = 'ruby' . s:names[s:delimiter] . 'Escape'
  214. if s:delimiter =~ '[\"]'
  215. let s:delimiter = '\' . s:delimiter
  216. endif
  217. exe 'syn match ' . s:group . ' "\V\\' . s:delimiter . '" contained display'
  218. exe 'syn cluster rubySingleCharEscape add=' . s:group
  219. exe 'SynFold ''%'' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\V%q' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
  220. exe 'SynFold ''%'' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\V%w' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,rubySpaceEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
  221. exe 'SynFold ''%'' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="\V%s' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
  222. exe 'SynFold ''%'' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="\V%i' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,rubySpaceEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
  223. exe 'hi def link ' . s:group . ' rubyStringEscape'
  224. endfor
  225. unlet s:delimiter s:group s:names
  226. " }}}2
  227. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
  228. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
  229. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
  230. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubyParenthesisEscape,rubyNestedParentheses
  231. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=rubyBackslashEscape,rubySpaceEscape
  232. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubySpaceEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
  233. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubySpaceEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
  234. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySpaceEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
  235. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubySpaceEscape,rubyParenthesisEscape,rubyNestedParentheses
  236. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
  237. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
  238. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
  239. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubyParenthesisEscape,rubyNestedParentheses
  240. SynFold '%' syn region rubyString matchgroup=rubyPercentSymbolDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=rubyBackslashEscape,rubySpaceEscape
  241. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubySpaceEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
  242. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubySpaceEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
  243. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySpaceEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
  244. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubySpaceEscape,rubyParenthesisEscape,rubyNestedParentheses
  245. " Generalized Double Quoted Strings, Array of Strings, Array of Symbols and Shell Command Output {{{1
  246. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\%(\%(\w\|[^\x00-\x7F]\|]\)\s*\)\@<!%=" end="=" skip="\\\\\|\\=" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
  247. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
  248. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
  249. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces
  250. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets
  251. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets
  252. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses
  253. SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[Qx]\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
  254. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
  255. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I{" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces
  256. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets
  257. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets
  258. SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses
  259. " Here Documents {{{1
  260. syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
  261. syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
  262. syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
  263. syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
  264. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
  265. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
  266. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart keepend
  267. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
  268. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
  269. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
  270. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart keepend
  271. SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
  272. " Module, Class, Method and Alias Declarations {{{1
  273. syn match rubyAliasDeclaration "[^[:space:];#.()]\+" contained contains=rubySymbol,@rubyGlobalVariable nextgroup=rubyAliasDeclaration2 skipwhite
  274. syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,@rubyGlobalVariable
  275. syn match rubyMethodDeclaration "[^[:space:];#(]\+" contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
  276. syn match rubyClassDeclaration "[^[:space:];#<]\+" contained contains=rubyClassName,rubyScopeOperator nextgroup=rubySuperClassOperator skipwhite
  277. syn match rubyModuleDeclaration "[^[:space:];#<]\+" contained contains=rubyModuleName,rubyScopeOperator
  278. syn match rubyMethodName "\<\%([_[:alpha:]]\|[^\x00-\x7F]\)\%([_[:alnum:]]\|[^\x00-\x7F]\)*[?!=]\=\%([[:alnum:]_.:?!=]\|[^\x00-\x7F]\)\@!" contained containedin=rubyMethodDeclaration
  279. syn match rubyMethodName "\%(\s\|^\)\@1<=\%([_[:alpha:]]\|[^\x00-\x7F]\)\%([_[:alnum:]]\|[^\x00-\x7F]\)*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
  280. syn match rubyMethodName "\%([[:space:].]\|^\)\@1<=\%(\[\]=\=\|\*\*\|[-+!~]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
  281. syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyMethodName
  282. " Keywords {{{1
  283. " TODO: reorganise
  284. syn match rubyControl "\%#=1\<\%(break\|in\|next\|redo\|retry\|return\)\>"
  285. syn match rubyKeyword "\%#=1\<\%(super\|yield\)\>"
  286. syn match rubyBoolean "\%#=1\<\%(true\|false\)\>[?!]\@!"
  287. syn match rubyPseudoVariable "\%#=1\<\(self\|nil\)\>[?!]\@!"
  288. syn match rubyPseudoVariable "\%#=1\<__\%(ENCODING\|dir\|FILE\|LINE\|callee\|method\)__\>"
  289. syn match rubyBeginEnd "\%#=1\<\%(BEGIN\|END\)\>"
  290. " Expensive Mode {{{1
  291. " Match 'end' with the appropriate opening keyword for syntax based folding
  292. " and special highlighting of module/class/method definitions
  293. if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
  294. syn match rubyDefine "\<alias\>" nextgroup=rubyAliasDeclaration skipwhite skipnl
  295. syn match rubyDefine "\<def\>" nextgroup=rubyMethodDeclaration skipwhite skipnl
  296. syn match rubyDefine "\<undef\>" nextgroup=rubyMethodName skipwhite skipnl
  297. syn match rubyClass "\<class\>" nextgroup=rubyClassDeclaration,rubyEigenClassOperator skipwhite skipnl
  298. syn match rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
  299. SynFold 'def' syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine skip="\<end:\|\%(\<def\_s\+\)\@<=end\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
  300. SynFold 'class' syn region rubyClassBlock start="\<class\>" matchgroup=rubyClass skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
  301. SynFold 'module' syn region rubyModuleBlock start="\<module\>" matchgroup=rubyModule skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
  302. " endless def
  303. syn match rubyDefine "\<def\s\+\ze[^[:space:];#(]\+\%(\s\+\|\s*(.*)\s*\)=" nextgroup=rubyMethodDeclaration skipwhite
  304. " modifiers
  305. syn match rubyLineContinuation "\\$" nextgroup=@rubyModifier skipwhite skipnl
  306. syn match rubyConditionalModifier "\<\%(if\|unless\)\>"
  307. syn match rubyRepeatModifier "\<\%(while\|until\)\>"
  308. syn match rubyRescueModifier "\<rescue\>"
  309. syn cluster rubyModifier contains=rubyConditionalModifier,rubyRepeatModifier,rubyRescueModifier
  310. SynFold 'do' syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
  311. " curly bracket block or hash literal
  312. SynFold '{' syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop
  313. SynFold '[' syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<!\[" end="]" contains=ALLBUT,@rubyNotTop
  314. " statements without 'do'
  315. SynFold 'begin' syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
  316. SynFold 'case' syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
  317. SynFold 'if' syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\<then\s\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
  318. syn match rubyConditional "\<\%(then\|else\|when\)\>" contained containedin=rubyCaseExpression
  319. syn match rubyConditional "\<\%(then\|else\|elsif\)\>" contained containedin=rubyConditionalExpression
  320. syn match rubyExceptionHandler "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>" contained containedin=rubyBlockExpression,rubyDoBlock
  321. syn match rubyExceptionHandler2 "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>" contained containedin=rubyModuleBlock,rubyClassBlock,rubyMethodBlock
  322. syn cluster rubyExceptionHandler contains=rubyExceptionHandler,rubyExceptionHandler2
  323. " statements with optional 'do'
  324. syn region rubyOptionalDoLine matchgroup=rubyRepeat start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![!?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\<do\>" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
  325. SynFold 'for' syn region rubyRepeatExpression start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![!?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine
  326. if !exists("ruby_minlines")
  327. let ruby_minlines = 500
  328. endif
  329. exe "syn sync minlines=" . ruby_minlines
  330. else
  331. syn match rubyControl "\<def\>" nextgroup=rubyMethodDeclaration skipwhite skipnl
  332. syn match rubyControl "\<class\>" nextgroup=rubyClassDeclaration skipwhite skipnl
  333. syn match rubyControl "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
  334. syn match rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|rescue\|ensure\|then\|when\|end\)\>"
  335. syn match rubyKeyword "\<\%(alias\|undef\)\>"
  336. endif
  337. " Special Methods {{{1
  338. if !exists("ruby_no_special_methods")
  339. syn match rubyAccess "\<\%(public\|protected\|private\)\>" " use re=2
  340. syn match rubyAccess "\%#=1\<\%(public\|private\)_class_method\>"
  341. syn match rubyAccess "\%#=1\<\%(public\|private\)_constant\>"
  342. syn match rubyAccess "\%#=1\<module_function\>"
  343. syn match rubyAttribute "\%#=1\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!" " attr is a common variable name
  344. syn match rubyAttribute "\%#=1\<attr_\%(accessor\|reader\|writer\)\>"
  345. syn match rubyControl "\%#=1\<\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>"
  346. syn match rubyEval "\%#=1\<eval\>"
  347. syn match rubyEval "\%#=1\<\%(class\|instance\|module\)_eval\>"
  348. syn match rubyException "\%#=1\<\%(raise\|fail\|catch\|throw\)\>"
  349. syn match rubyInclude "\%#=1\<\%(autoload\|gem\|load\|require\%(_relative\)\=\)\>"
  350. syn match rubyKeyword "\%#=1\<\%(callcc\|caller\|lambda\|proc\)\>"
  351. syn match rubyMacro "\%#=1\<\%(extend\|include\|prepend\|refine\|using\)\>"
  352. syn match rubyMacro "\%#=1\<\%(alias\|define\|define_singleton\|remove\|undef\)_method\>"
  353. endif
  354. " Comments and Documentation {{{1
  355. syn match rubySharpBang "\%^#!.*" display
  356. syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained
  357. syn match rubyEncoding "[[:alnum:]-_]\+" contained display
  358. syn match rubyMagicComment "\c\%<3l#\s*\zs\%(coding\|encoding\):" contained nextgroup=rubyEncoding skipwhite
  359. syn match rubyMagicComment "\c\%<10l#\s*\zs\%(frozen_string_literal\|warn_indent\|warn_past_scope\):" contained nextgroup=rubyBoolean skipwhite
  360. syn match rubyMagicComment "\c\%<10l#\s*\zs\%(shareable_constant_value\):" contained nextgroup=rubyEncoding skipwhite
  361. syn match rubyComment "#.*" contains=@rubyCommentSpecial,rubySpaceError,@Spell
  362. syn cluster rubyCommentSpecial contains=rubySharpBang,rubyTodo,rubyMagicComment
  363. syn cluster rubyCommentNotTop contains=@rubyCommentSpecial,rubyEncoding
  364. if !exists("ruby_no_comment_fold") && s:foldable('#')
  365. syn region rubyMultilineComment start="^\s*#.*\n\%(^\s*#\)\@=" end="^\s*#.*\n\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
  366. syn region rubyDocumentation start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
  367. else
  368. syn region rubyDocumentation start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
  369. endif
  370. " {{{1 Useless Line Continuations
  371. syn match rubyUselessLineContinuation "\%([.:,;{([<>~\*%&^|+=-]\|%(\%(\w\|[^\x00-\x7F]\)\@1<![?!]\)\s*\zs\\$" nextgroup=rubyUselessLineContinuation skipwhite skipempty
  372. syn match rubyUselessLineContinuation "\\$" nextgroup=rubyUselessLineContinuation skipwhite skipempty contained
  373. " Keyword Nobbling {{{1
  374. " prevent methods with keyword names being highlighted as keywords when called
  375. syn match rubyKeywordAsMethod "\%(\%(\.\@1<!\.\)\|&\.\|::\)\_s*\%([_[:lower:]][_[:alnum:]]*\|\%(BEGIN\|END\)\>\)" transparent contains=rubyDotOperator,rubyScopeOperator
  376. " Bang and Predicate Methods and Operators {{{1
  377. syn match rubyBangPredicateMethod "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[?!]"
  378. if !exists("ruby_no_special_methods")
  379. syn match rubyControl "\%#=1\<exit!" display
  380. endif
  381. syn match rubyDefinedOperator "\%#=1\<defined?" display
  382. " 1.9-style Hash Keys and Keyword Parameters {{{1
  383. syn match rubySymbol "\%(\w\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[?!]\=::\@!"he=e-1 contained containedin=rubyBlockParameterList,rubyCurlyBlock
  384. syn match rubySymbol "[]})\"':]\@1<!\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],;]\@="he=e-1
  385. syn match rubySymbol "[[:space:],{(]\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],;]\@="hs=s+1,he=e-1
  386. syn match rubySingleQuoteSymbolDelimiter "'" contained
  387. syn match rubySymbol "'\%(\\.\|[^']\)*'::\@!"he=e-1 contains=rubyQuoteEscape,rubyBackslashEscape,rubySingleQuoteSymbolDelimiter
  388. syn match rubyDoubleQuoteSymbolDelimiter "\"" contained
  389. syn match rubySymbol "\"\%(\\.\|[^\"]\)*\"::\@!"he=e-1 contains=@rubyStringSpecial,rubyDoubleQuoteSymbolDelimiter
  390. " __END__ Directive {{{1
  391. SynFold '__END__' syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$"
  392. " Default Highlighting {{{1
  393. hi def link rubyClass rubyDefine
  394. hi def link rubyModule rubyDefine
  395. hi def link rubyExceptionHandler2 rubyDefine
  396. hi def link rubyDefine Define
  397. hi def link rubyAccess rubyMacro
  398. hi def link rubyAttribute rubyMacro
  399. hi def link rubyMacro Macro
  400. hi def link rubyMethodName rubyFunction
  401. hi def link rubyFunction Function
  402. hi def link rubyConditional Conditional
  403. hi def link rubyConditionalModifier rubyConditional
  404. hi def link rubyExceptionHandler rubyConditional
  405. hi def link rubyRescueModifier rubyExceptionHandler
  406. hi def link rubyRepeat Repeat
  407. hi def link rubyRepeatModifier rubyRepeat
  408. hi def link rubyOptionalDo rubyRepeat
  409. hi def link rubyControl Statement
  410. hi def link rubyInclude Include
  411. hi def link rubyInteger Number
  412. hi def link rubyCharacter Character
  413. hi def link rubyFloat Float
  414. hi def link rubyBoolean Boolean
  415. hi def link rubyException Exception
  416. if !exists("ruby_no_identifiers")
  417. hi def link rubyIdentifier Identifier
  418. else
  419. hi def link rubyIdentifier NONE
  420. endif
  421. hi def link rubyClassVariable rubyIdentifier
  422. hi def link rubyConstant Type
  423. hi def link rubyClassName rubyConstant
  424. hi def link rubyModuleName rubyConstant
  425. hi def link rubyGlobalVariable rubyIdentifier
  426. hi def link rubyInstanceVariable rubyIdentifier
  427. hi def link rubyPredefinedIdentifier rubyIdentifier
  428. hi def link rubyPredefinedConstant rubyPredefinedIdentifier
  429. hi def link rubyPredefinedVariable rubyPredefinedIdentifier
  430. hi def link rubySymbol Constant
  431. hi def link rubyKeyword Keyword
  432. hi def link rubyOperator Operator
  433. hi def link rubyDefinedOperator rubyOperator
  434. hi def link rubyEnglishBooleanOperator rubyOperator
  435. if exists("ruby_operators")
  436. hi def link rubyTernaryOperator rubyOperator
  437. hi def link rubyArithmeticOperator rubyOperator
  438. hi def link rubyComparisonOperator rubyOperator
  439. hi def link rubyBitwiseOperator rubyOperator
  440. hi def link rubyBooleanOperator rubyOperator
  441. hi def link rubyRangeOperator rubyOperator
  442. hi def link rubyAssignmentOperator rubyOperator
  443. hi def link rubyEqualityOperator rubyOperator
  444. endif
  445. if exists("ruby_pseudo_operators")
  446. hi def link rubyPseudoOperator Special
  447. hi def link rubyDotOperator rubyPseudoOperator
  448. hi def link rubyScopeOperator rubyPseudoOperator
  449. hi def link rubySuperClassOperator rubyPseudoOperator
  450. hi def link rubyEigenClassOperator rubyPseudoOperator
  451. hi def link rubyLambdaOperator rubyPseudoOperator
  452. hi def link rubyDoubleSplatOperator rubyPseudoOperator
  453. hi def link rubySplatOperator rubyPseudoOperator
  454. hi def link rubyProcOperator rubyPseudoOperator
  455. endif
  456. hi def link rubyBeginEnd Statement
  457. hi def link rubyEval Statement
  458. hi def link rubyPseudoVariable Constant
  459. hi def link rubyCapitalizedMethod NONE
  460. hi def link rubyComment Comment
  461. hi def link rubyEncoding Constant
  462. hi def link rubyMagicComment SpecialComment
  463. hi def link rubyData Comment
  464. hi def link rubyDataDirective Delimiter
  465. hi def link rubyDocumentation Comment
  466. hi def link rubyTodo Todo
  467. hi def link rubyBackslashEscape rubyStringEscape
  468. hi def link rubyQuoteEscape rubyStringEscape
  469. hi def link rubySpaceEscape rubyStringEscape
  470. hi def link rubyParenthesisEscape rubyStringEscape
  471. hi def link rubyCurlyBraceEscape rubyStringEscape
  472. hi def link rubyAngleBracketEscape rubyStringEscape
  473. hi def link rubySquareBracketEscape rubyStringEscape
  474. hi def link rubyStringEscape Special
  475. hi def link rubyInterpolationDelimiter Delimiter
  476. hi def link rubySharpBang PreProc
  477. hi def link rubyStringDelimiter Delimiter
  478. hi def link rubyHeredocDelimiter rubyStringDelimiter
  479. hi def link rubyPercentRegexpDelimiter rubyRegexpDelimiter
  480. hi def link rubyPercentStringDelimiter rubyStringDelimiter
  481. hi def link rubyPercentSymbolDelimiter rubySymbolDelimiter
  482. hi def link rubyDoubleQuoteSymbolDelimiter rubySymbolDelimiter
  483. hi def link rubySingleQuoteSymbolDelimiter rubySymbolDelimiter
  484. hi def link rubyRegexpDelimiter rubyStringDelimiter
  485. hi def link rubySymbolDelimiter rubySymbol
  486. hi def link rubyString String
  487. hi def link rubyRegexpEscape rubyRegexpSpecial
  488. hi def link rubyRegexpQuantifier rubyRegexpSpecial
  489. hi def link rubyRegexpAnchor rubyRegexpSpecial
  490. hi def link rubyRegexpDot rubyRegexpCharClass
  491. hi def link rubyRegexpCharClass rubyRegexpSpecial
  492. hi def link rubyRegexpIntersection rubyRegexpSpecial
  493. hi def link rubyRegexpSpecial Special
  494. hi def link rubyRegexpComment Comment
  495. hi def link rubyRegexp rubyString
  496. hi def link rubyError Error
  497. if exists("ruby_line_continuation_error")
  498. hi def link rubyUselessLineContinuation rubyError
  499. endif
  500. hi def link rubyGlobalVariableError rubyError
  501. hi def link rubySpaceError rubyError
  502. " Postscript {{{1
  503. let b:current_syntax = "ruby"
  504. let &cpo = s:cpo_sav
  505. unlet! s:cpo_sav
  506. delc SynFold
  507. " vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker: