blob: 722ddbedf638ce448b071d73ed5384a058446aa6 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaara9604e62018-07-21 05:56:22 +02002" Language: C#
3" Maintainer: Nick Jensen <nickspoon@gmail.com>
4" Former Maintainers: Anduin Withers <awithers@anduin.com>
5" Johannes Zellner <johannes@zellner.org>
Bram Moolenaar63f32602022-06-09 20:45:54 +01006" Last Change: 2022-03-01
Bram Moolenaara9604e62018-07-21 05:56:22 +02007" Filenames: *.cs
8" License: Vim (see :h license)
9" Repository: https://github.com/nickspoons/vim-cs
Bram Moolenaar071d4272004-06-13 20:20:40 +000010"
Bram Moolenaar63f32602022-06-09 20:45:54 +010011" 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000016
Bram Moolenaard47d5222018-12-09 20:43:55 +010017if exists('b:current_syntax')
18 finish
Bram Moolenaar071d4272004-06-13 20:20:40 +000019endif
20
Bram Moolenaard47d5222018-12-09 20:43:55 +010021let s:save_cpo = &cpoptions
22set cpoptions&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000023
Bram Moolenaara9604e62018-07-21 05:56:22 +020024syn keyword csType bool byte char decimal double float int long object sbyte short string T uint ulong ushort var void dynamic
Bram Moolenaar63f32602022-06-09 20:45:54 +010025syn keyword csType nint nuint " contextual
26
27syn keyword csStorage enum interface namespace struct
28syn match csStorage "\<delegate\>"
Bram Moolenaara9604e62018-07-21 05:56:22 +020029syn keyword csRepeat break continue do for foreach goto return while
30syn keyword csConditional else if switch
31syn keyword csLabel case default
Bram Moolenaar071d4272004-06-13 20:20:40 +000032
Bram Moolenaar63f32602022-06-09 20:45:54 +010033syn match csNamespaceAlias "@\=\h\w*\ze\_s*::" display
34syn match csGlobalNamespaceAlias "global\ze\_s*::" display
35syn cluster csNamespaceAlias contains=csGlobalNamespaceAlias,csNamespaceAlias,csNamespaceAliasQualifier
36
37" user labels
38syn match csLabel display +^\s*\I\i*\s*:\%([^:]\)\@=+
39
40" Function pointers
41syn match csType "\<delegate\s*\*" contains=csOpSymbols nextgroup=csManagedModifier skipwhite skipempty
42syn keyword csManagedModifier managed unmanaged contained
43
44" Modifiers
45syn match csUsingModifier "\<global\ze\_s\+using\>"
46syn keyword csAccessModifier internal private protected public
47" TODO: in new out
48syn keyword csModifier abstract const event override readonly sealed static virtual volatile
49syn match csModifier "\<\%(extern\|fixed\|unsafe\)\>"
50syn match csModifier "\<partial\ze\_s\+\%(class\|struct\|interface\|record\|void\)\>"
51
52syn keyword csException try catch finally throw when
53syn keyword csLinq ascending by descending equals from group in into join let on orderby select
54syn match csLinq "\<where\>"
55
56" Type parameter constraint clause
57syn match csStorage "\<where\>\ze\_s\+@\=\h\w*\_s*:"
58
59" Async
60syn keyword csAsyncModifier async
61syn keyword csAsyncOperator await
62
63syn match csStorage "\<extern\ze\s\+alias\>"
64syn match csStorage "\%(\<extern\s\+\)\@16<=alias\>"
65
66syn match csStatement "\<\%(checked\|unchecked\|unsafe\)\ze\_s*{"
67syn match csStatement "\<fixed\ze\_s*("
68syn keyword csStatement lock
69syn match csStatement "\<yield\ze\_s\+\%(return\|break\)\>"
70
71syn match csAccessor "\<\%(get\|set\|init\|add\|remove\)\ze\_s*\%([;{]\|=>\)"
72
73syn keyword csAccess base
74syn match csAccess "\<this\>"
75
76" Extension method parameter modifier
77syn match csModifier "\<this\ze\_s\+@\=\h"
78
79syn keyword csUnspecifiedStatement as in is nameof operator out params ref sizeof stackalloc using
80syn keyword csUnsupportedStatement value
Bram Moolenaara9604e62018-07-21 05:56:22 +020081syn keyword csUnspecifiedKeyword explicit implicit
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
Bram Moolenaard47d5222018-12-09 20:43:55 +010083" Operators
Bram Moolenaar63f32602022-06-09 20:45:54 +010084syn keyword csTypeOf typeof nextgroup=csTypeOfOperand,csTypeOfError skipwhite skipempty
85syn region csTypeOfOperand matchgroup=csParens start="(" end=")" contained contains=csType
86syn match csTypeOfError "[^([:space:]]" contained
87syn match csKeywordOperator "\<\%(checked\|unchecked\)\ze\_s*("
Bram Moolenaard47d5222018-12-09 20:43:55 +010088
Bram Moolenaara9604e62018-07-21 05:56:22 +020089" Punctuation
Bram Moolenaar63f32602022-06-09 20:45:54 +010090syn match csBraces "[{}[\]]" display
Bram Moolenaara9604e62018-07-21 05:56:22 +020091syn match csParens "[()]" display
Bram Moolenaar088e8e32019-08-08 22:15:18 +020092syn match csOpSymbols "+\{1,2}" display
93syn match csOpSymbols "-\{1,2}" display
94syn match csOpSymbols "=\{1,2}" display
95syn match csOpSymbols ">\{1,2}" display
96syn match csOpSymbols "<\{1,2}" display
Bram Moolenaara9604e62018-07-21 05:56:22 +020097syn match csOpSymbols "[!><+\-*/]=" display
98syn match csOpSymbols "[!*/^]" display
99syn match csOpSymbols "=>" display
100syn match csEndColon ";" display
101syn match csLogicSymbols "&&" display
102syn match csLogicSymbols "||" display
103syn match csLogicSymbols "?" display
104syn match csLogicSymbols ":" display
Bram Moolenaar63f32602022-06-09 20:45:54 +0100105syn match csNamespaceAliasQualifier "::" display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106
Bram Moolenaar088e8e32019-08-08 22:15:18 +0200107" Generics
Bram Moolenaar63f32602022-06-09 20:45:54 +0100108syn region csGeneric matchgroup=csGenericBraces start="<" end=">" oneline contains=csType,csGeneric,@csNamespaceAlias,csUserType,csUserIdentifier,csUserInterface,csUserMethod
Bram Moolenaar088e8e32019-08-08 22:15:18 +0200109
Bram Moolenaar071d4272004-06-13 20:20:40 +0000110" Comments
111"
112" PROVIDES: @csCommentHook
Bram Moolenaara9604e62018-07-21 05:56:22 +0200113syn keyword csTodo contained TODO FIXME XXX NOTE HACK TBD
Bram Moolenaar63f32602022-06-09 20:45:54 +0100114syn region csBlockComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell
115syn match csLineComment "//.*$" contains=@csCommentHook,csTodo,@Spell
116syn cluster csComment contains=csLineComment,csBlockComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117
Bram Moolenaar63f32602022-06-09 20:45:54 +0100118syn region csSummary start="^\s*/// <summary" end="^\%\(\s*///\)\@!" transparent fold keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000119
Bram Moolenaar63f32602022-06-09 20:45:54 +0100120" xml markup inside '///' and /**...*/ comments
121syn cluster xmlRegionHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
122syn cluster xmlCdataHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
123syn cluster xmlStartTagHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
124syn cluster xmlTagHook add=csXmlTag
125syn cluster xmlAttribHook add=csXmlAttrib
Bram Moolenaar071d4272004-06-13 20:20:40 +0000126
Bram Moolenaar63f32602022-06-09 20:45:54 +0100127" https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags
128syn keyword csXmlTag contained summary remarks
129syn keyword csXmlTag contained returns param paramref exception value
130syn keyword csXmlTag contained para list c code example
131syn keyword csXmlTag contained inheritdoc include
132syn keyword csXmlTag contained see seealso
133syn keyword csXmlTag contained typeparam typeparamref
134syn keyword csXmlTag contained b i u br a
135syn keyword csXmlAttrib contained cref href
136
137syn match csXmlLineCommentLeader "///" contained
138syn match csXmlLineComment "///.*$" contains=csXmlLineCommentLeader,@csXml,@Spell keepend
139syn match csXmlBlockCommentMiddle "^\s*\zs\*" contained
140syn region csXmlBlockComment start="/\*\*" end="\*/" contains=@csXml,@Spell,csXmlBlockCommentMiddle keepend
Bram Moolenaara9604e62018-07-21 05:56:22 +0200141syn include @csXml syntax/xml.vim
142hi def link xmlRegion Comment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143
Bram Moolenaar560979e2020-02-04 22:53:05 +0100144" Since syntax/xml.vim contains `syn spell toplevel`, we need to set it back to `default` here.
145syn spell default
Bram Moolenaar071d4272004-06-13 20:20:40 +0000146
Bram Moolenaar63f32602022-06-09 20:45:54 +0100147" Pre-processing directives
148syn region csPreProcDeclaration start="^\s*\zs#\s*\%(define\|undef\)\>" end="$" contains=csLineComment keepend
149syn region csPreProcConditional start="^\s*\zs#\s*\%(if\|elif\)\>" end="$" contains=csLineComment keepend
150syn region csPreProcConditional start="^\s*\zs#\s*\%(else\|endif\)\>" end="$" contains=csLineComment keepend
151syn region csPreProcLine start="^\s*\zs#\s*line\>" end="$" contains=csLineComment keepend
152syn region csPreProcDiagnostic start="^\s*\zs#\s*\%(error\|warning\)\>" end="$"
153syn region csPreProcConditionalSection matchgroup=csPreProcRegion start="^\s*#\s*region\>.*" end="^\s*#\s*endregion\>.*" transparent fold contains=TOP
154syn region csPreProcPragma start="^\s*\zs#\s*pragma\>" end="$" contains=csLineComment keepend
155syn region csPreProcNullable start="^\s*\zs#\s*nullable\>" end="$" contains=csLineComment keepend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156
Bram Moolenaar63f32602022-06-09 20:45:54 +0100157if expand('%:e') == 'csx' || getline('1') =~ '^#!.*\<dotnet-script\>'
158 syn region csPreProcInclude start="^\s*\zs#\s*\%(load\|r\)\>" end="$" contains=csLineComment keepend
159 syn match csShebang "\%^#!.*" display
160endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161
Bram Moolenaar63f32602022-06-09 20:45:54 +0100162syn cluster csPreProcessor contains=csPreProc.*
163
164syn region csClassType start="\<class\>"hs=s+6 end=">" end="[:{]"me=e-1 contains=csClass
Bram Moolenaar088e8e32019-08-08 22:15:18 +0200165" csUserType may be defined by user scripts/plugins - it should be contained in csNewType
Bram Moolenaar63f32602022-06-09 20:45:54 +0100166syn region csNewType start="\<new\>"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew,@csNamespaceAlias,csUserType
Bram Moolenaara9604e62018-07-21 05:56:22 +0200167syn region csIsType start=" is "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs
168syn region csIsType start=" as "hs=s+4 end="[A-Za-z0-9]\+" oneline contains=csIsAs
169syn keyword csNew new contained
170syn keyword csClass class contained
171syn keyword csIsAs is as
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172
Bram Moolenaar63f32602022-06-09 20:45:54 +0100173syn keyword csBoolean false true
174syn keyword csNull null
175
Bram Moolenaar071d4272004-06-13 20:20:40 +0000176" Strings and constants
Bram Moolenaara9604e62018-07-21 05:56:22 +0200177syn match csSpecialError "\\." contained
178syn match csSpecialCharError "[^']" contained
Bram Moolenaar63f32602022-06-09 20:45:54 +0100179" Character literals
180syn match csSpecialChar +\\["\\'0abfnrtv]+ contained display
181syn match csUnicodeNumber +\\x\x\{1,4}+ contained contains=csUnicodeSpecifier display
Bram Moolenaara9604e62018-07-21 05:56:22 +0200182syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier display
Bram Moolenaar63f32602022-06-09 20:45:54 +0100183syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier display
184syn match csUnicodeSpecifier +\\[uUx]+ contained display
Bram Moolenaara9604e62018-07-21 05:56:22 +0200185
186syn region csString matchgroup=csQuote start=+"+ end=+"+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
Bram Moolenaar23515b42020-11-29 14:36:24 +0100187syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display
Bram Moolenaara9604e62018-07-21 05:56:22 +0200188syn match csCharacter "'\\''" contains=csSpecialChar display
189syn match csCharacter "'[^\\]'" display
Bram Moolenaar63f32602022-06-09 20:45:54 +0100190
191" Numbers
192syn case ignore
193syn match csInteger "\<0b[01_]*[01]\%([lu]\|lu\|ul\)\=\>" display
194syn match csInteger "\<\d\+\%(_\+\d\+\)*\%([lu]\|lu\|ul\)\=\>" display
195syn match csInteger "\<0x[[:xdigit:]_]*\x\%([lu]\|lu\|ul\)\=\>" display
196syn match csReal "\<\d\+\%(_\+\d\+\)*\.\d\+\%(_\+\d\+\)*\%\(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=" display
197syn match csReal "\.\d\+\%(_\+\d\+\)*\%(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=\>" display
198syn match csReal "\<\d\+\%(_\+\d\+\)*e[-+]\=\d\+\%(_\+\d\+\)*[fdm]\=\>" display
199syn match csReal "\<\d\+\%(_\+\d\+\)*[fdm]\>" display
200syn case match
201syn cluster csNumber contains=csInteger,csReal
Bram Moolenaara9604e62018-07-21 05:56:22 +0200202
Bram Moolenaar23515b42020-11-29 14:36:24 +0100203syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
Bram Moolenaara9604e62018-07-21 05:56:22 +0200204
Bram Moolenaar23515b42020-11-29 14:36:24 +0100205syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat
Bram Moolenaara9604e62018-07-21 05:56:22 +0200206syn match csEscapedInterpolation "{{" transparent contains=NONE display
207syn match csEscapedInterpolation "}}" transparent contains=NONE display
Bram Moolenaar63f32602022-06-09 20:45:54 +0100208syn region csInterpolationAlign matchgroup=csInterpolationAlignDel start=+,+ end=+}+ end=+:+me=e-1 contained contains=@csNumber,csBoolean,csConstant,csCharacter,csParens,csOpSymbols,csString,csBracketed display
Bram Moolenaara9604e62018-07-21 05:56:22 +0200209syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFormatDel display
210syn match csInterpolationAlignDel +,+ contained display
211syn match csInterpolationFormatDel +:+ contained display
212
213syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"+ skip=+""+ extend contains=csVerbatimQuote,@Spell
214syn match csVerbatimQuote +""+ contained
Bram Moolenaara9604e62018-07-21 05:56:22 +0200215
Bram Moolenaar63f32602022-06-09 20:45:54 +0100216syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
217
218syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString
219
220syn cluster csLiteral contains=csBoolean,@csNumber,csCharacter,@csString,csNull
Bram Moolenaara9604e62018-07-21 05:56:22 +0200221
Bram Moolenaar23515b42020-11-29 14:36:24 +0100222syn region csBracketed matchgroup=csParens start=+(+ end=+)+ extend contained transparent contains=@csAll,csBraced,csBracketed
223syn region csBraced matchgroup=csParens start=+{+ end=+}+ extend contained transparent contains=@csAll,csBraced,csBracketed
Bram Moolenaara9604e62018-07-21 05:56:22 +0200224
Bram Moolenaar63f32602022-06-09 20:45:54 +0100225syn cluster csAll contains=@csLiteral,csClassType,@csComment,csEndColon,csIsType,csLabel,csLogicSymbols,csNewType,csOpSymbols,csParens,@csPreProcessor,csSummary,@csNamespaceAlias,csType,csUnicodeNumber,csUserType,csUserIdentifier,csUserInterface,csUserMethod
226
227" Keyword identifiers
228syn match csIdentifier "@\h\w*"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000229
230" The default highlighting.
Bram Moolenaara9604e62018-07-21 05:56:22 +0200231hi def link csUnspecifiedStatement Statement
232hi def link csUnsupportedStatement Statement
233hi def link csUnspecifiedKeyword Keyword
Bram Moolenaar63f32602022-06-09 20:45:54 +0100234
235hi def link csGlobalNamespaceAlias Include
236
237hi def link csType Type
238hi def link csClassType Type
239hi def link csIsType Type
240
241hi def link csStorage Structure
242hi def link csClass Structure
Bram Moolenaara9604e62018-07-21 05:56:22 +0200243hi def link csNew Statement
Bram Moolenaara9604e62018-07-21 05:56:22 +0200244hi def link csIsAs Keyword
Bram Moolenaar63f32602022-06-09 20:45:54 +0100245hi def link csAccessor Keyword
246hi def link csAccess Keyword
247
248hi def link csLinq Statement
249
250hi def link csStatement Statement
251hi def link csRepeat Repeat
252hi def link csConditional Conditional
253hi def link csLabel Label
254hi def link csException Exception
255
256hi def link csModifier StorageClass
257hi def link csAccessModifier csModifier
258hi def link csAsyncModifier csModifier
259hi def link csManagedModifier csModifier
260hi def link csUsingModifier csModifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
Bram Moolenaara9604e62018-07-21 05:56:22 +0200262hi def link csTodo Todo
263hi def link csComment Comment
Bram Moolenaar63f32602022-06-09 20:45:54 +0100264hi def link csLineComment csComment
265hi def link csBlockComment csComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266
Bram Moolenaar63f32602022-06-09 20:45:54 +0100267hi def link csKeywordOperator Keyword
268hi def link csAsyncOperator csKeywordOperator
269hi def link csTypeOf csKeywordOperator
270hi def link csTypeOfOperand Typedef
271hi def link csTypeOfError Error
Bram Moolenaara9604e62018-07-21 05:56:22 +0200272hi def link csOpSymbols Operator
Bram Moolenaard47d5222018-12-09 20:43:55 +0100273hi def link csLogicSymbols Operator
Bram Moolenaara9604e62018-07-21 05:56:22 +0200274
275hi def link csSpecialError Error
276hi def link csSpecialCharError Error
277hi def link csString String
278hi def link csQuote String
Bram Moolenaara9604e62018-07-21 05:56:22 +0200279hi def link csInterpolatedString String
280hi def link csVerbatimString String
281hi def link csInterVerbString String
282hi def link csVerbatimQuote SpecialChar
Bram Moolenaar63f32602022-06-09 20:45:54 +0100283
284hi def link csPreProc PreProc
285hi def link csPreProcDeclaration Define
286hi def link csPreProcConditional PreCondit
287hi def link csPreProcLine csPreProc
288hi def link csPreProcDiagnostic csPreProc
289hi def link csPreProcRegion csPreProc
290hi def link csPreProcPragma csPreProc
291hi def link csPreProcNullable csPreProc
292hi def link csPreProcInclude csPreProc
293hi def link csShebang csPreProc
294
295hi def link csConstant Constant
296hi def link csNull Constant
297hi def link csBoolean Boolean
Bram Moolenaara9604e62018-07-21 05:56:22 +0200298hi def link csCharacter Character
299hi def link csSpecialChar SpecialChar
Bram Moolenaar63f32602022-06-09 20:45:54 +0100300hi def link csInteger Number
301hi def link csReal Float
Bram Moolenaara9604e62018-07-21 05:56:22 +0200302hi def link csUnicodeNumber SpecialChar
303hi def link csUnicodeSpecifier SpecialChar
304hi def link csInterpolationDelimiter Delimiter
305hi def link csInterpolationAlignDel csInterpolationDelimiter
306hi def link csInterpolationFormat csInterpolationDelimiter
307hi def link csInterpolationFormatDel csInterpolationDelimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308
Bram Moolenaar088e8e32019-08-08 22:15:18 +0200309hi def link csGenericBraces csBraces
310
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311" xml markup
Bram Moolenaar63f32602022-06-09 20:45:54 +0100312hi def link csXmlLineCommentLeader Comment
313hi def link csXmlLineComment Comment
314hi def link csXmlBlockComment Comment
315hi def link csXmlBlockCommentMiddle csXmlBlockComment
Bram Moolenaara9604e62018-07-21 05:56:22 +0200316hi def link csXmlTag Statement
Bram Moolenaar63f32602022-06-09 20:45:54 +0100317hi def link csXmlAttrib Statement
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318
Bram Moolenaard47d5222018-12-09 20:43:55 +0100319let b:current_syntax = 'cs'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320
Bram Moolenaard47d5222018-12-09 20:43:55 +0100321let &cpoptions = s:save_cpo
322unlet s:save_cpo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323
Bram Moolenaara9604e62018-07-21 05:56:22 +0200324" vim: vts=16,28