" Vim syntax file " Language: C# " Maintainer: Nick Jensen " Former Maintainers: Anduin Withers " Johannes Zellner " Last Change: 2025-03-14 " Filenames: *.cs " License: Vim (see :h license) " Repository: https://github.com/nickspoons/vim-cs " " References: " - ECMA-334 5th Edition: C# Language Specification " https://www.ecma-international.org/publications-and-standards/standards/ecma-334/ " - C# Language Design: Draft 6th Edition and later proposals " https://github.com/dotnet/csharplang if exists('b:current_syntax') finish endif let s:save_cpo = &cpoptions set cpoptions&vim syn keyword csType bool byte char decimal double float int long object sbyte short string T uint ulong ushort var void dynamic syn keyword csType nint nuint " contextual syn keyword csStorage enum interface namespace struct syn match csStorage "\" syn match csStorage "\" syn keyword csRepeat break continue do for foreach goto return while syn keyword csConditional else if switch syn keyword csLabel case default syn match csNamespaceAlias "@\=\h\w*\ze\_s*::" display syn match csGlobalNamespaceAlias "global\ze\_s*::" display syn cluster csNamespaceAlias contains=csGlobalNamespaceAlias,csNamespaceAlias,csNamespaceAliasQualifier " user labels syn match csLabel display +^\s*\I\i*\s*:\%([^:]\)\@=+ " Function pointers syn match csType "\" syn keyword csAccessModifier internal private protected public syn keyword csModifier operator nextgroup=csCheckedModifier skipwhite skipempty syn keyword csCheckedModifier checked contained " TODO: in new out syn keyword csModifier abstract const event override readonly sealed static virtual volatile syn match csModifier "\<\%(extern\|fixed\|unsafe\)\>" syn match csModifier "\" syn keyword csException try catch finally throw when syn keyword csLinq ascending by descending equals from group in into join let on orderby select syn match csLinq "\" " Type parameter constraint clause syn match csStorage "\\ze\_s\+@\=\h\w*\_s*:" " Async syn keyword csAsyncModifier async syn keyword csAsyncOperator await syn match csStorage "\" syn match csStorage "\%(\" syn match csStatement "\<\%(checked\|unchecked\|unsafe\)\ze\_s*{" syn match csStatement "\" syn match csAccessor "\<\%(get\|set\|init\|add\|remove\)\ze\_s*\%([;{]\|=>\)" syn keyword csAccess base syn match csAccess "\" " Extension method parameter modifier syn match csModifier "\\{1,2}" display syn match csOpSymbols "<\{1,2}" display syn match csOpSymbols "[!><+\-*/]=" display syn match csOpSymbols "[!*/^]" display syn match csOpSymbols "=>" display syn match csEndColon ";" display syn match csLogicSymbols "&&" display syn match csLogicSymbols "||" display syn match csLogicSymbols "?" display syn match csLogicSymbols ":" display syn match csNamespaceAliasQualifier "::" display " Generics syn region csGeneric matchgroup=csGenericBraces start="<" end=">" oneline contains=csType,csGeneric,@csNamespaceAlias,csUserType,csUserIdentifier,csUserInterface,csUserMethod " Comments " " PROVIDES: @csCommentHook syn keyword csTodo contained TODO FIXME XXX NOTE HACK TBD syn region csBlockComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell syn match csLineComment "//.*$" contains=@csCommentHook,csTodo,@Spell syn cluster csComment contains=csLineComment,csBlockComment syn region csSummary start="^\s*/// ' syn region csPreProcInclude start="^\s*\zs#\s*\%(load\|r\)\>" end="$" contains=csLineComment keepend syn match csShebang "\%^#!.*" display endif syn cluster csPreProcessor contains=csPreProc.* syn region csClassType start="\"hs=s+6 end=">" end="[:{]"me=e-1 contains=csClass " csUserType may be defined by user scripts/plugins - it should be contained in csNewType syn region csNewType start="\"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew,@csNamespaceAlias,csUserType syn region csIsType start=" is "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs syn region csIsType start=" as "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs syn keyword csNew new contained syn keyword csClass class contained syn keyword csIsAs is as syn keyword csBoolean false true syn keyword csNull null " Strings and constants syn match csSpecialError "\\." contained syn match csSpecialCharError "[^']" contained " Character literals syn match csSpecialChar +\\["\\'0abfnrtv]+ contained display syn match csUnicodeNumber +\\x\x\{1,4}+ contained contains=csUnicodeSpecifier display syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier display syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier display syn match csUnicodeSpecifier +\\[uUx]+ contained display syn region csString matchgroup=csQuote start=+"+ end=+"\%(u8\)\=+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell for s:i in range(3, get(g:, "cs_raw_string_quote_count", 8)) exe 'syn region csRawString' .. s:i .. ' matchgroup=csQuote start=+\z("\{' .. s:i .. '}\)+ end=+\z1+ oneline nextgroup=csRawStringError' .. s:i exe 'syn region csRawString' .. s:i .. ' matchgroup=csQuote start=+\z("\{' .. s:i .. '}\)\s*$+ end=+^\s*\z1+ nextgroup=csRawStringError' .. s:i .. ' contains=csRawStringError' .. s:i exe 'syn match csRawStringError' .. s:i .. ' /\%("\{' .. s:i .. '}\)\@' .. s:i .. '<="\+/ contained' exe 'syn match csRawStringError' .. s:i .. ' /\S.\{-}\s*"\{' .. s:i .. '}"\@!/ contained' exe 'hi def link csRawString' .. s:i .. ' csString' exe 'hi def link csRawStringError' .. s:i .. ' Error' endfor unlet s:i syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display syn match csCharacter "'\\''" contains=csSpecialChar display syn match csCharacter "'[^\\]'" display " Numbers syn case ignore syn match csInteger "\<0b[01_]*[01]\%([lu]\|lu\|ul\)\=\>" display syn match csInteger "\<\d\+\%(_\+\d\+\)*\%([lu]\|lu\|ul\)\=\>" display syn match csInteger "\<0x[[:xdigit:]_]*\x\%([lu]\|lu\|ul\)\=\>" display syn match csReal "\<\d\+\%(_\+\d\+\)*\.\d\+\%(_\+\d\+\)*\%\(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=" display syn match csReal "\.\d\+\%(_\+\d\+\)*\%(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=\>" display syn match csReal "\<\d\+\%(_\+\d\+\)*e[-+]\=\d\+\%(_\+\d\+\)*[fdm]\=\>" display syn match csReal "\<\d\+\%(_\+\d\+\)*[fdm]\>" display syn case match syn cluster csNumber contains=csInteger,csReal syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"\%(u8\)\=+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat syn match csEscapedInterpolation "{{" transparent contains=NONE display syn match csEscapedInterpolation "}}" transparent contains=NONE display syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=@csNumber,csBoolean,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFormatDel display syn match csInterpolationAlignDel +,+ contained display syn match csInterpolationFormatDel +:+ contained display syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"\%(u8\)\=+ skip=+""+ extend contains=csVerbatimQuote,@Spell " Interpolated raw string literals for s:i in range(1, get(g:, "cs_raw_string_interpolation_brace_count", 8)) exe 'syn region csInterpolatedRawString' .. s:i .. ' matchgroup=csQuote start=+$\{' .. s:i .. '}\z("""\+\)+ end=+\z1+ extend contains=csInterpolation' .. s:i .. ',csInterpolationDelimiterError' .. s:i .. ',@Spell' exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "}\{' .. s:i .. '}" contained' exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "{\{' .. 2 * s:i .. ',}" contained' exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "}\{' .. 2 * s:i .. ',}" contained' exe 'syn region csInterpolation' .. s:i .. ' matchgroup=csInterpolationDelimiter start=+\%({\{' .. s:i .. '}\)\@' .. s:i .. '