cs.vim (16461B)
1 " Vim syntax file 2 " Language: C# 3 " Maintainer: Nick Jensen <nickspoon@gmail.com> 4 " Former Maintainers: Anduin Withers <awithers@anduin.com> 5 " Johannes Zellner <johannes@zellner.org> 6 " Last Change: 2025-03-14 7 " Filenames: *.cs 8 " License: Vim (see :h license) 9 " Repository: https://github.com/nickspoons/vim-cs 10 " 11 " References: 12 " - ECMA-334 5th Edition: C# Language Specification 13 " https://www.ecma-international.org/publications-and-standards/standards/ecma-334/ 14 " - C# Language Design: Draft 6th Edition and later proposals 15 " https://github.com/dotnet/csharplang 16 17 if exists('b:current_syntax') 18 finish 19 endif 20 21 let s:save_cpo = &cpoptions 22 set cpoptions&vim 23 24 syn keyword csType bool byte char decimal double float int long object sbyte short string T uint ulong ushort var void dynamic 25 syn keyword csType nint nuint " contextual 26 27 syn keyword csStorage enum interface namespace struct 28 syn match csStorage "\<record\ze\_s\+@\=\h\w*\_s*[<(:{;]" 29 syn match csStorage "\%(\<\%(partial\|new\|public\|protected\|internal\|private\|abstract\|sealed\|static\|unsafe\|readonly\)\)\@9<=\_s\+record\>" 30 syn match csStorage "\<record\ze\_s\+\%(class\|struct\)" 31 syn match csStorage "\<delegate\>" 32 syn keyword csRepeat break continue do for foreach goto return while 33 syn keyword csConditional else if switch 34 syn keyword csLabel case default 35 36 syn match csNamespaceAlias "@\=\h\w*\ze\_s*::" display 37 syn match csGlobalNamespaceAlias "global\ze\_s*::" display 38 syn cluster csNamespaceAlias contains=csGlobalNamespaceAlias,csNamespaceAlias,csNamespaceAliasQualifier 39 40 " user labels 41 syn match csLabel display +^\s*\I\i*\s*:\%([^:]\)\@=+ 42 43 " Function pointers 44 syn match csType "\<delegate\s*\*" contains=csOpSymbols nextgroup=csManagedModifier skipwhite skipempty 45 syn keyword csManagedModifier managed unmanaged contained 46 47 " Modifiers 48 syn match csUsingModifier "\<global\ze\_s\+using\>" 49 syn keyword csAccessModifier internal private protected public 50 syn keyword csModifier operator nextgroup=csCheckedModifier skipwhite skipempty 51 syn keyword csCheckedModifier checked contained 52 53 " TODO: in new out 54 syn keyword csModifier abstract const event override readonly sealed static virtual volatile 55 syn match csModifier "\<\%(extern\|fixed\|unsafe\)\>" 56 syn match csModifier "\<partial\ze\_s\+\%(class\|struct\|interface\|record\|void\)\>" 57 58 syn keyword csException try catch finally throw when 59 syn keyword csLinq ascending by descending equals from group in into join let on orderby select 60 syn match csLinq "\<where\>" 61 62 " Type parameter constraint clause 63 syn match csStorage "\<where\>\ze\_s\+@\=\h\w*\_s*:" 64 65 " Async 66 syn keyword csAsyncModifier async 67 syn keyword csAsyncOperator await 68 69 syn match csStorage "\<extern\ze\s\+alias\>" 70 syn match csStorage "\%(\<extern\s\+\)\@16<=alias\>" 71 72 syn match csStatement "\<\%(checked\|unchecked\|unsafe\)\ze\_s*{" 73 syn match csStatement "\<fixed\ze\_s*(" 74 syn keyword csStatement lock 75 syn match csStatement "\<yield\ze\_s\+\%(return\|break\)\>" 76 77 syn match csAccessor "\<\%(get\|set\|init\|add\|remove\)\ze\_s*\%([;{]\|=>\)" 78 79 syn keyword csAccess base 80 syn match csAccess "\<this\>" 81 82 " Extension method parameter modifier 83 syn match csModifier "\<this\ze\_s\+@\=\h" 84 85 syn keyword csUnspecifiedStatement as in is nameof out params ref sizeof stackalloc using 86 syn keyword csUnsupportedStatement value 87 syn keyword csUnspecifiedKeyword explicit implicit 88 89 " Operators 90 syn keyword csTypeOf typeof nextgroup=csTypeOfOperand,csTypeOfError skipwhite skipempty 91 syn region csTypeOfOperand matchgroup=csParens start="(" end=")" contained contains=csType 92 syn match csTypeOfError "[^([:space:]]" contained 93 syn match csKeywordOperator "\<\%(checked\|unchecked\)\ze\_s*(" 94 95 " Punctuation 96 syn match csBraces "[{}[\]]" display 97 syn match csParens "[()]" display 98 syn match csOpSymbols "+\{1,2}" display 99 syn match csOpSymbols "-\{1,2}" display 100 syn match csOpSymbols "=\{1,2}" display 101 syn match csOpSymbols ">\{1,2}" display 102 syn match csOpSymbols "<\{1,2}" display 103 syn match csOpSymbols "[!><+\-*/]=" display 104 syn match csOpSymbols "[!*/^]" display 105 syn match csOpSymbols "=>" display 106 syn match csEndColon ";" display 107 syn match csLogicSymbols "&&" display 108 syn match csLogicSymbols "||" display 109 syn match csLogicSymbols "?" display 110 syn match csLogicSymbols ":" display 111 syn match csNamespaceAliasQualifier "::" display 112 113 " Generics 114 syn region csGeneric matchgroup=csGenericBraces start="<" end=">" oneline contains=csType,csGeneric,@csNamespaceAlias,csUserType,csUserIdentifier,csUserInterface,csUserMethod 115 116 " Comments 117 " 118 " PROVIDES: @csCommentHook 119 syn keyword csTodo contained TODO FIXME XXX NOTE HACK TBD 120 syn region csBlockComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell 121 syn match csLineComment "//.*$" contains=@csCommentHook,csTodo,@Spell 122 syn cluster csComment contains=csLineComment,csBlockComment 123 124 syn region csSummary start="^\s*/// <summary" end="^\%\(\s*///\)\@!" transparent fold keepend 125 126 " xml markup inside '///' and /**...*/ comments 127 syn cluster xmlRegionHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle 128 syn cluster xmlCdataHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle 129 syn cluster xmlStartTagHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle 130 syn cluster xmlTagHook add=csXmlTag 131 syn cluster xmlAttribHook add=csXmlAttrib 132 133 " https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags 134 syn keyword csXmlTag contained summary remarks 135 syn keyword csXmlTag contained returns param paramref exception value 136 syn keyword csXmlTag contained para list c code example 137 syn keyword csXmlTag contained inheritdoc include 138 syn keyword csXmlTag contained see seealso 139 syn keyword csXmlTag contained typeparam typeparamref 140 syn keyword csXmlTag contained b i u br a 141 syn keyword csXmlAttrib contained cref href 142 143 syn match csXmlLineCommentLeader "///" contained 144 syn match csXmlLineComment "///.*$" contains=csXmlLineCommentLeader,@csXml,@Spell keepend 145 syn match csXmlBlockCommentMiddle "^\s*\zs\*" contained 146 syn region csXmlBlockComment start="/\*\*" end="\*/" contains=@csXml,@Spell,csXmlBlockCommentMiddle keepend 147 syn include @csXml syntax/xml.vim 148 hi def link xmlRegion Comment 149 150 " Since syntax/xml.vim contains `syn spell toplevel`, we need to set it back to `default` here. 151 syn spell default 152 153 " Pre-processing directives 154 syn region csPreProcDeclaration start="^\s*\zs#\s*\%(define\|undef\)\>" end="$" contains=csLineComment keepend 155 syn region csPreProcConditional start="^\s*\zs#\s*\%(if\|elif\)\>" end="$" contains=csLineComment keepend 156 syn region csPreProcConditional start="^\s*\zs#\s*\%(else\|endif\)\>" end="$" contains=csLineComment keepend 157 syn region csPreProcLine start="^\s*\zs#\s*line\>" end="$" contains=csLineComment keepend 158 syn region csPreProcDiagnostic start="^\s*\zs#\s*\%(error\|warning\)\>" end="$" 159 syn region csPreProcConditionalSection matchgroup=csPreProcRegion start="^\s*#\s*region\>.*" end="^\s*#\s*endregion\>.*" transparent fold contains=TOP 160 syn region csPreProcPragma start="^\s*\zs#\s*pragma\>" end="$" contains=csLineComment keepend 161 syn region csPreProcNullable start="^\s*\zs#\s*nullable\>" end="$" contains=csLineComment keepend 162 163 if expand('%:e') == 'csx' || getline('1') =~ '^#!.*\<dotnet-script\>' 164 syn region csPreProcInclude start="^\s*\zs#\s*\%(load\|r\)\>" end="$" contains=csLineComment keepend 165 syn match csShebang "\%^#!.*" display 166 endif 167 168 syn cluster csPreProcessor contains=csPreProc.* 169 170 syn region csClassType start="\<class\>"hs=s+6 end=">" end="[:{]"me=e-1 contains=csClass 171 " csUserType may be defined by user scripts/plugins - it should be contained in csNewType 172 syn region csNewType start="\<new\>"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew,@csNamespaceAlias,csUserType 173 syn region csIsType start=" is "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs 174 syn region csIsType start=" as "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs 175 syn keyword csNew new contained 176 syn keyword csClass class contained 177 syn keyword csIsAs is as 178 179 syn keyword csBoolean false true 180 syn keyword csNull null 181 182 " Strings and constants 183 syn match csSpecialError "\\." contained 184 syn match csSpecialCharError "[^']" contained 185 " Character literals 186 syn match csSpecialChar +\\["\\'0abfnrtv]+ contained display 187 syn match csUnicodeNumber +\\x\x\{1,4}+ contained contains=csUnicodeSpecifier display 188 syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier display 189 syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier display 190 syn match csUnicodeSpecifier +\\[uUx]+ contained display 191 192 syn region csString matchgroup=csQuote start=+"+ end=+"\%(u8\)\=+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell 193 194 for s:i in range(3, get(g:, "cs_raw_string_quote_count", 8)) 195 exe 'syn region csRawString' .. s:i .. ' matchgroup=csQuote start=+\z("\{' .. s:i .. '}\)+ end=+\z1+ oneline nextgroup=csRawStringError' .. s:i 196 exe 'syn region csRawString' .. s:i .. ' matchgroup=csQuote start=+\z("\{' .. s:i .. '}\)\s*$+ end=+^\s*\z1+ nextgroup=csRawStringError' .. s:i .. ' contains=csRawStringError' .. s:i 197 exe 'syn match csRawStringError' .. s:i .. ' /\%("\{' .. s:i .. '}\)\@' .. s:i .. '<="\+/ contained' 198 exe 'syn match csRawStringError' .. s:i .. ' /\S.\{-}\s*"\{' .. s:i .. '}"\@!/ contained' 199 200 exe 'hi def link csRawString' .. s:i .. ' csString' 201 exe 'hi def link csRawStringError' .. s:i .. ' Error' 202 endfor 203 unlet s:i 204 205 syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display 206 syn match csCharacter "'\\''" contains=csSpecialChar display 207 syn match csCharacter "'[^\\]'" display 208 209 " Numbers 210 syn case ignore 211 syn match csInteger "\<0b[01_]*[01]\%([lu]\|lu\|ul\)\=\>" display 212 syn match csInteger "\<\d\+\%(_\+\d\+\)*\%([lu]\|lu\|ul\)\=\>" display 213 syn match csInteger "\<0x[[:xdigit:]_]*\x\%([lu]\|lu\|ul\)\=\>" display 214 syn match csReal "\<\d\+\%(_\+\d\+\)*\.\d\+\%(_\+\d\+\)*\%\(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=" display 215 syn match csReal "\.\d\+\%(_\+\d\+\)*\%(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=\>" display 216 syn match csReal "\<\d\+\%(_\+\d\+\)*e[-+]\=\d\+\%(_\+\d\+\)*[fdm]\=\>" display 217 syn match csReal "\<\d\+\%(_\+\d\+\)*[fdm]\>" display 218 syn case match 219 syn cluster csNumber contains=csInteger,csReal 220 221 syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"\%(u8\)\=+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell 222 223 syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat 224 syn match csEscapedInterpolation "{{" transparent contains=NONE display 225 syn match csEscapedInterpolation "}}" transparent contains=NONE display 226 syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=@csNumber,csBoolean,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display 227 syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFormatDel display 228 syn match csInterpolationAlignDel +,+ contained display 229 syn match csInterpolationFormatDel +:+ contained display 230 231 syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"\%(u8\)\=+ skip=+""+ extend contains=csVerbatimQuote,@Spell 232 233 " Interpolated raw string literals 234 for s:i in range(1, get(g:, "cs_raw_string_interpolation_brace_count", 8)) 235 exe 'syn region csInterpolatedRawString' .. s:i .. ' matchgroup=csQuote start=+$\{' .. s:i .. '}\z("""\+\)+ end=+\z1+ extend contains=csInterpolation' .. s:i .. ',csInterpolationDelimiterError' .. s:i .. ',@Spell' 236 exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "}\{' .. s:i .. '}" contained' 237 exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "{\{' .. 2 * s:i .. ',}" contained' 238 exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "}\{' .. 2 * s:i .. ',}" contained' 239 exe 'syn region csInterpolation' .. s:i .. ' matchgroup=csInterpolationDelimiter start=+\%({\{' .. s:i .. '}\)\@' .. s:i .. '<!{\{' .. s:i .. '}{\@!+ end=+}\@<!}\{' .. s:i .. '}\%(}\{' .. s:i .. '}\)\@!+' .. 240 \ ' keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat,csInterpolationDelimiterError' .. s:i 241 242 exe 'hi def link csInterpolationDelimiterError' .. s:i .. ' Error' 243 exe 'hi def link csInterpolatedRawString' .. s:i .. ' csRawString' 244 endfor 245 unlet s:i 246 247 syn match csVerbatimQuote +""+ contained 248 249 syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"\%(u8\)\=+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell 250 251 syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString,csRawString 252 253 syn cluster csLiteral contains=csBoolean,@csNumber,csCharacter,@csString,csNull 254 255 syn region csBracketed matchgroup=csParens start=+(+ end=+)+ extend contained transparent contains=@csAll,csBraced,csBracketed 256 syn region csBraced matchgroup=csParens start=+{+ end=+}+ extend contained transparent contains=@csAll,csBraced,csBracketed 257 258 syn cluster csAll contains=@csLiteral,csClassType,@csComment,csEndColon,csIsType,csLabel,csLogicSymbols,csNewType,csOpSymbols,csParens,@csPreProcessor,csSummary,@csNamespaceAlias,csType,csUnicodeNumber,csUserType,csUserIdentifier,csUserInterface,csUserMethod 259 260 " Keyword identifiers 261 syn match csIdentifier "@\h\w*" 262 263 " The default highlighting. 264 hi def link csUnspecifiedStatement Statement 265 hi def link csUnsupportedStatement Statement 266 hi def link csUnspecifiedKeyword Keyword 267 268 hi def link csGlobalNamespaceAlias Include 269 270 hi def link csType Type 271 hi def link csClassType Type 272 hi def link csIsType Type 273 274 hi def link csStorage Structure 275 hi def link csClass Structure 276 hi def link csNew Statement 277 hi def link csIsAs Keyword 278 hi def link csAccessor Keyword 279 hi def link csAccess Keyword 280 281 hi def link csLinq Statement 282 283 hi def link csStatement Statement 284 hi def link csRepeat Repeat 285 hi def link csConditional Conditional 286 hi def link csLabel Label 287 hi def link csException Exception 288 289 hi def link csModifier StorageClass 290 hi def link csAccessModifier csModifier 291 hi def link csAsyncModifier csModifier 292 hi def link csCheckedModifier csModifier 293 hi def link csManagedModifier csModifier 294 hi def link csUsingModifier csModifier 295 296 hi def link csTodo Todo 297 hi def link csComment Comment 298 hi def link csLineComment csComment 299 hi def link csBlockComment csComment 300 301 hi def link csKeywordOperator Keyword 302 hi def link csAsyncOperator csKeywordOperator 303 hi def link csTypeOf csKeywordOperator 304 hi def link csTypeOfOperand Typedef 305 hi def link csTypeOfError Error 306 hi def link csOpSymbols Operator 307 hi def link csLogicSymbols Operator 308 309 hi def link csSpecialError Error 310 hi def link csSpecialCharError Error 311 hi def link csString String 312 hi def link csRawString csString 313 hi def link csRawStringError Error 314 hi def link csQuote String 315 hi def link csInterpolatedString String 316 hi def link csVerbatimString String 317 hi def link csInterVerbString String 318 hi def link csVerbatimQuote SpecialChar 319 320 hi def link csPreProc PreProc 321 hi def link csPreProcDeclaration Define 322 hi def link csPreProcConditional PreCondit 323 hi def link csPreProcLine csPreProc 324 hi def link csPreProcDiagnostic csPreProc 325 hi def link csPreProcRegion csPreProc 326 hi def link csPreProcPragma csPreProc 327 hi def link csPreProcNullable csPreProc 328 hi def link csPreProcInclude csPreProc 329 hi def link csShebang csPreProc 330 331 hi def link csConstant Constant 332 hi def link csNull Constant 333 hi def link csBoolean Boolean 334 hi def link csCharacter Character 335 hi def link csSpecialChar SpecialChar 336 hi def link csInteger Number 337 hi def link csReal Float 338 hi def link csUnicodeNumber SpecialChar 339 hi def link csUnicodeSpecifier SpecialChar 340 hi def link csInterpolationDelimiter Delimiter 341 hi def link csInterpolationAlignDel csInterpolationDelimiter 342 hi def link csInterpolationFormat csInterpolationDelimiter 343 hi def link csInterpolationFormatDel csInterpolationDelimiter 344 345 hi def link csGenericBraces csBraces 346 347 " xml markup 348 hi def link csXmlLineCommentLeader Comment 349 hi def link csXmlLineComment Comment 350 hi def link csXmlBlockComment Comment 351 hi def link csXmlBlockCommentMiddle csXmlBlockComment 352 hi def link csXmlTag Statement 353 hi def link csXmlAttrib Statement 354 355 let b:current_syntax = 'cs' 356 357 let &cpoptions = s:save_cpo 358 unlet s:save_cpo 359 360 " vim: vts=16,28