neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

scala.vim (11679B)


      1 " Vim syntax file
      2 " Language:             Scala
      3 " Maintainer:           Derek Wyatt
      4 " URL:                  https://github.com/derekwyatt/vim-scala
      5 " License:              Same as Vim
      6 " Last Change:          23 January 2022
      7 " ----------------------------------------------------------------------------
      8 
      9 if !exists('main_syntax')
     10  " quit when a syntax file was already loaded
     11  if exists("b:current_syntax")
     12    finish
     13  endif
     14  let main_syntax = 'scala'
     15 endif
     16 
     17 scriptencoding utf-8
     18 
     19 let b:current_syntax = "scala"
     20 
     21 " Allows for embedding, see #59; main_syntax convention instead? Refactor TOP
     22 "
     23 " The @Spell here is a weird hack, it means *exclude* if the first group is
     24 " TOP. Otherwise we get spelling errors highlighted on code elements that
     25 " match scalaBlock, even with `syn spell notoplevel`.
     26 function! s:ContainedGroup()
     27  try
     28    silent syn list @scala
     29    return '@scala,@NoSpell'
     30  catch /E392/
     31    return 'TOP,@Spell'
     32  endtry
     33 endfunction
     34 
     35 unlet! b:current_syntax
     36 
     37 syn case match
     38 syn sync minlines=200 maxlines=1000
     39 
     40 syn keyword scalaKeyword catch do else final finally for forSome if
     41 syn keyword scalaKeyword match return throw try while yield macro
     42 syn keyword scalaKeyword class trait object extends with nextgroup=scalaInstanceDeclaration skipwhite
     43 syn keyword scalaKeyword case nextgroup=scalaKeyword,scalaCaseFollowing skipwhite
     44 syn keyword scalaKeyword val nextgroup=scalaNameDefinition,scalaQuasiQuotes skipwhite
     45 syn keyword scalaKeyword def var nextgroup=scalaNameDefinition skipwhite
     46 hi def link scalaKeyword Keyword
     47 
     48 exe 'syn region scalaBlock start=/{/ end=/}/ contains=' . s:ContainedGroup() . ' fold'
     49 
     50 syn keyword scalaAkkaSpecialWord when goto using startWith initialize onTransition stay become unbecome
     51 hi def link scalaAkkaSpecialWord PreProc
     52 
     53 syn keyword scalatestSpecialWord shouldBe
     54 syn match scalatestShouldDSLA /^\s\+\zsit should/
     55 syn match scalatestShouldDSLB /\<should\>/
     56 hi def link scalatestSpecialWord PreProc
     57 hi def link scalatestShouldDSLA PreProc
     58 hi def link scalatestShouldDSLB PreProc
     59 
     60 syn match scalaSymbol /'[_A-Za-z0-9$]\+/
     61 hi def link scalaSymbol Number
     62 
     63 syn match scalaChar /'.'/
     64 syn match scalaChar /'\\[\\"'ntbrf]'/ contains=scalaEscapedChar
     65 syn match scalaChar /'\\u[A-Fa-f0-9]\{4}'/ contains=scalaUnicodeChar
     66 syn match scalaEscapedChar /\\[\\"'ntbrf]/
     67 syn match scalaUnicodeChar /\\u[A-Fa-f0-9]\{4}/
     68 hi def link scalaChar Character
     69 hi def link scalaEscapedChar Special
     70 hi def link scalaUnicodeChar Special
     71 
     72 syn match scalaOperator "||"
     73 syn match scalaOperator "&&"
     74 syn match scalaOperator "|"
     75 syn match scalaOperator "&"
     76 hi def link scalaOperator Special
     77 
     78 syn match scalaNameDefinition /\<[_A-Za-z0-9$]\+\>/ contained nextgroup=scalaPostNameDefinition,scalaVariableDeclarationList
     79 syn match scalaNameDefinition /`[^`]\+`/ contained nextgroup=scalaPostNameDefinition
     80 syn match scalaVariableDeclarationList /\s*,\s*/ contained nextgroup=scalaNameDefinition
     81 syn match scalaPostNameDefinition /\_s*:\_s*/ contained nextgroup=scalaTypeDeclaration
     82 hi def link scalaNameDefinition Function
     83 
     84 syn match scalaInstanceDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaInstanceHash
     85 syn match scalaInstanceDeclaration /`[^`]\+`/ contained
     86 syn match scalaInstanceHash /#/ contained nextgroup=scalaInstanceDeclaration
     87 hi def link scalaInstanceDeclaration Special
     88 hi def link scalaInstanceHash Type
     89 
     90 syn match scalaUnimplemented /???/
     91 hi def link scalaUnimplemented ERROR
     92 
     93 syn match scalaCapitalWord /\<[A-Z][A-Za-z0-9$]*\>/
     94 hi def link scalaCapitalWord Special
     95 
     96 " Handle type declarations specially
     97 syn region scalaTypeStatement matchgroup=Keyword start=/\<type\_s\+\ze/ end=/$/ contains=scalaTypeTypeDeclaration,scalaSquareBrackets,scalaTypeTypeEquals,scalaTypeStatement
     98 
     99 " Ugh... duplication of all the scalaType* stuff to handle special highlighting
    100 " of `type X =` declarations
    101 syn match scalaTypeTypeDeclaration /(/ contained nextgroup=scalaTypeTypeExtension,scalaTypeTypeEquals contains=scalaRoundBrackets skipwhite
    102 syn match scalaTypeTypeDeclaration /\%(⇒\|=>\)\ze/ contained nextgroup=scalaTypeTypeDeclaration contains=scalaTypeTypeExtension skipwhite
    103 syn match scalaTypeTypeDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypeExtension,scalaTypeTypeEquals skipwhite
    104 syn match scalaTypeTypeEquals /=\ze[^>]/ contained nextgroup=scalaTypeTypePostDeclaration skipwhite
    105 syn match scalaTypeTypeExtension /)\?\_s*\zs\%(⇒\|=>\|<:\|:>\|=:=\|::\|#\)/ contained contains=scalaTypeOperator nextgroup=scalaTypeTypeDeclaration skipwhite
    106 syn match scalaTypeTypePostDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypePostExtension skipwhite
    107 syn match scalaTypeTypePostExtension /\%(⇒\|=>\|<:\|:>\|=:=\|::\)/ contained contains=scalaTypeOperator nextgroup=scalaTypeTypePostDeclaration skipwhite
    108 hi def link scalaTypeTypeDeclaration Type
    109 hi def link scalaTypeTypeExtension Keyword
    110 hi def link scalaTypeTypePostDeclaration Special
    111 hi def link scalaTypeTypePostExtension Keyword
    112 
    113 syn match scalaTypeDeclaration /(/ contained nextgroup=scalaTypeExtension contains=scalaRoundBrackets skipwhite
    114 syn match scalaTypeDeclaration /\%(⇒\|=>\)\ze/ contained nextgroup=scalaTypeDeclaration contains=scalaTypeExtension skipwhite
    115 syn match scalaTypeDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeExtension skipwhite
    116 syn match scalaTypeExtension /)\?\_s*\zs\%(⇒\|=>\|<:\|:>\|=:=\|::\|#\)/ contained contains=scalaTypeOperator nextgroup=scalaTypeDeclaration skipwhite
    117 hi def link scalaTypeDeclaration Type
    118 hi def link scalaTypeExtension Keyword
    119 hi def link scalaTypePostExtension Keyword
    120 
    121 syn match scalaTypeAnnotation /\%([_a-zA-Z0-9$\s]:\_s*\)\ze[_=(\.A-Za-z0-9$]\+/ skipwhite nextgroup=scalaTypeDeclaration contains=scalaRoundBrackets
    122 syn match scalaTypeAnnotation /)\_s*:\_s*\ze[_=(\.A-Za-z0-9$]\+/ skipwhite nextgroup=scalaTypeDeclaration
    123 hi clear scalaTypeAnnotation
    124 
    125 syn match scalaCaseFollowing /\<[_\.A-Za-z0-9$]\+\>/ contained contains=scalaCapitalWord
    126 syn match scalaCaseFollowing /`[^`]\+`/ contained contains=scalaCapitalWord
    127 hi def link scalaCaseFollowing Special
    128 
    129 syn keyword scalaKeywordModifier abstract override final lazy implicit private protected sealed null super
    130 syn keyword scalaSpecialFunction implicitly require
    131 hi def link scalaKeywordModifier Function
    132 hi def link scalaSpecialFunction Function
    133 
    134 syn keyword scalaSpecial this true false ne eq
    135 syn keyword scalaSpecial new nextgroup=scalaInstanceDeclaration skipwhite
    136 syn match scalaSpecial "\%(=>\|⇒\|<-\|←\|->\|→\)"
    137 syn match scalaSpecial /`[^`]\+`/  " Backtick literals
    138 hi def link scalaSpecial PreProc
    139 
    140 syn keyword scalaExternal package import
    141 hi def link scalaExternal Include
    142 
    143 syn match scalaStringEmbeddedQuote /\\"/ contained
    144 syn region scalaString start=/"/ end=/"/ contains=scalaStringEmbeddedQuote,scalaEscapedChar,scalaUnicodeChar
    145 hi def link scalaString String
    146 hi def link scalaStringEmbeddedQuote String
    147 
    148 syn region scalaIString matchgroup=scalaInterpolationBrackets start=/\<[a-zA-Z][a-zA-Z0-9_]*"/ skip=/\\"/ end=/"/ contains=scalaInterpolation,scalaInterpolationB,scalaEscapedChar,scalaUnicodeChar
    149 syn region scalaTripleIString matchgroup=scalaInterpolationBrackets start=/\<[a-zA-Z][a-zA-Z0-9_]*"""/ end=/"""\ze\%([^"]\|$\)/ contains=scalaInterpolation,scalaInterpolationB,scalaEscapedChar,scalaUnicodeChar
    150 hi def link scalaIString String
    151 hi def link scalaTripleIString String
    152 
    153 syn match scalaInterpolation /\$[a-zA-Z0-9_$]\+/ contained
    154 exe 'syn region scalaInterpolationB matchgroup=scalaInterpolationBoundary start=/\${/ end=/}/ contained contains=' . s:ContainedGroup()
    155 hi def link scalaInterpolation Function
    156 hi clear scalaInterpolationB
    157 
    158 syn region scalaFString matchgroup=scalaInterpolationBrackets start=/f"/ skip=/\\"/ end=/"/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
    159 syn match scalaFInterpolation /\$[a-zA-Z0-9_$]\+\(%[-A-Za-z0-9\.]\+\)\?/ contained
    160 exe 'syn region scalaFInterpolationB matchgroup=scalaInterpolationBoundary start=/${/ end=/}\(%[-A-Za-z0-9\.]\+\)\?/ contained contains=' . s:ContainedGroup()
    161 hi def link scalaFString String
    162 hi def link scalaFInterpolation Function
    163 hi clear scalaFInterpolationB
    164 
    165 syn region scalaTripleString start=/"""/ end=/"""\%([^"]\|$\)/ contains=scalaEscapedChar,scalaUnicodeChar
    166 syn region scalaTripleFString matchgroup=scalaInterpolationBrackets start=/f"""/ end=/"""\%([^"]\|$\)/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
    167 hi def link scalaTripleString String
    168 hi def link scalaTripleFString String
    169 
    170 hi def link scalaInterpolationBrackets Special
    171 hi def link scalaInterpolationBoundary Function
    172 
    173 syn match scalaNumber /\<0[dDfFlL]\?\>/ " Just a bare 0
    174 syn match scalaNumber /\<[1-9]\d*[dDfFlL]\?\>/  " A multi-digit number - octal numbers with leading 0's are deprecated in Scala
    175 syn match scalaNumber /\<0[xX][0-9a-fA-F]\+[dDfFlL]\?\>/ " Hex number
    176 syn match scalaNumber /\%(\<\d\+\.\d*\|\.\d\+\)\%([eE][-+]\=\d\+\)\=[fFdD]\=/ " exponential notation 1
    177 syn match scalaNumber /\<\d\+[eE][-+]\=\d\+[fFdD]\=\>/ " exponential notation 2
    178 syn match scalaNumber /\<\d\+\%([eE][-+]\=\d\+\)\=[fFdD]\>/ " exponential notation 3
    179 hi def link scalaNumber Number
    180 
    181 syn region scalaRoundBrackets start="(" end=")" skipwhite contained contains=scalaTypeDeclaration,scalaSquareBrackets,scalaRoundBrackets
    182 
    183 syn region scalaSquareBrackets matchgroup=scalaSquareBracketsBrackets start="\[" end="\]" skipwhite nextgroup=scalaTypeExtension contains=scalaTypeDeclaration,scalaSquareBrackets,scalaTypeOperator,scalaTypeAnnotationParameter,scalaString
    184 syn match scalaTypeOperator /[-+=:<>]\+/ contained
    185 syn match scalaTypeAnnotationParameter /@\<[`_A-Za-z0-9$]\+\>/ contained
    186 hi def link scalaSquareBracketsBrackets Type
    187 hi def link scalaTypeOperator Keyword
    188 hi def link scalaTypeAnnotationParameter Function
    189 
    190 syn match scalaShebang "\%^#!.*" display
    191 syn region scalaMultilineComment start="/\*" end="\*/" contains=scalaMultilineComment,scalaDocLinks,scalaParameterAnnotation,scalaCommentAnnotation,scalaTodo,scalaCommentCodeBlock,@Spell keepend fold
    192 syn match scalaCommentAnnotation "@[_A-Za-z0-9$]\+" contained
    193 syn match scalaParameterAnnotation "\%(@tparam\|@param\|@see\)" nextgroup=scalaParamAnnotationValue skipwhite contained
    194 syn match scalaParamAnnotationValue /[.`_A-Za-z0-9$]\+/ contained
    195 syn region scalaDocLinks start="\[\[" end="\]\]" contained
    196 syn region scalaCommentCodeBlock matchgroup=Keyword start="{{{" end="}}}" contained
    197 syn match scalaTodo "\vTODO|FIXME|XXX" contained
    198 hi def link scalaShebang Comment
    199 hi def link scalaMultilineComment Comment
    200 hi def link scalaDocLinks Function
    201 hi def link scalaParameterAnnotation Function
    202 hi def link scalaParamAnnotationValue Keyword
    203 hi def link scalaCommentAnnotation Function
    204 hi def link scalaCommentCodeBlock String
    205 hi def link scalaTodo Todo
    206 
    207 syn match scalaAnnotation /@\<[`_A-Za-z0-9$]\+\>/
    208 hi def link scalaAnnotation PreProc
    209 
    210 syn match scalaTrailingComment "//.*$" contains=scalaTodo,@Spell
    211 hi def link scalaTrailingComment Comment
    212 
    213 syn match scalaAkkaFSM /goto([^)]*)\_s\+\<using\>/ contains=scalaAkkaFSMGotoUsing
    214 syn match scalaAkkaFSM /stay\_s\+using/
    215 syn match scalaAkkaFSM /^\s*stay\s*$/
    216 syn match scalaAkkaFSM /when\ze([^)]*)/
    217 syn match scalaAkkaFSM /startWith\ze([^)]*)/
    218 syn match scalaAkkaFSM /initialize\ze()/
    219 syn match scalaAkkaFSM /onTransition/
    220 syn match scalaAkkaFSM /onTermination/
    221 syn match scalaAkkaFSM /whenUnhandled/
    222 syn match scalaAkkaFSMGotoUsing /\<using\>/
    223 syn match scalaAkkaFSMGotoUsing /\<goto\>/
    224 hi def link scalaAkkaFSM PreProc
    225 hi def link scalaAkkaFSMGotoUsing PreProc
    226 
    227 let b:current_syntax = 'scala'
    228 
    229 if main_syntax ==# 'scala'
    230  unlet main_syntax
    231 endif
    232 
    233 " vim:set sw=2 sts=2 ts=8 et: