blob: 964936e60642c72900308024ab3b94356b43f8f2 [file] [log] [blame]
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +01001" Vim syntax file for the D programming language (version 1.053 and 2.039).
Bram Moolenaar071d4272004-06-13 20:20:40 +00002"
Bram Moolenaar21cf8232004-07-16 20:18:37 +00003" Language: D
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +01004" Maintainer: Jason Mills<jasonmills@nf.sympatico.ca>
5" Last Change: 2010 Jan 07
6" Version: 0.18
7"
8" Contributors:
9" - Kirk McDonald: version 0.17 updates, with minor modifications
10" (http://paste.dprogramming.com/dplmb7qx?view=hidelines)
11" - Jesse K. Phillips: patch for some keywords and attributes (annotations), with modifications
12" - Tim Keating: patch to fix a bug in highlighting the `\` literal
13" - Frank Benoit: Fixed a bug that caused some identifiers and numbers to highlight as octal number errors.
14"
15" Please email me with bugs, comments, and suggestions.
Bram Moolenaar071d4272004-06-13 20:20:40 +000016"
17" Options:
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010018" d_comment_strings - Set to highlight strings and numbers in comments.
Bram Moolenaar071d4272004-06-13 20:20:40 +000019"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010020" d_hl_operator_overload - Set to highlight D's specially named functions
21" that when overloaded implement unary and binary operators (e.g. opCmp).
Bram Moolenaar071d4272004-06-13 20:20:40 +000022"
23" Todo:
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010024" - Determine a better method of sync'ing than simply setting minlines
25" to a large number.
Bram Moolenaar071d4272004-06-13 20:20:40 +000026"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010027" - Several keywords (e.g., in, out, inout) are both storage class and
28" statements, depending on their context. Perhaps use pattern matching to
29" figure out which and highlight appropriately. For now I have made such
30" keywords storage classes so their highlighting is consistent with other
31" keywords that are commonly used with them, but are true storage classes,
32" such as lazy. Similarly, I made some statement keywords (e.g. body) storage
33" classes.
Bram Moolenaar071d4272004-06-13 20:20:40 +000034"
35" - Mark contents of the asm statement body as special
36"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010037" - Maybe highlight the 'exit', 'failure', and 'success' parts of the
38" scope() statement.
39"
40" - Highlighting DDoc comments.
41"
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
43" Quit when a syntax file was already loaded
44if exists("b:current_syntax")
45 finish
46endif
47
48" Keyword definitions
49"
Bram Moolenaar21cf8232004-07-16 20:18:37 +000050syn keyword dExternal import package module extern
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010051syn keyword dConditional if else switch
Bram Moolenaar21cf8232004-07-16 20:18:37 +000052syn keyword dBranch goto break continue
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010053syn keyword dRepeat while for do foreach foreach_reverse
Bram Moolenaar21cf8232004-07-16 20:18:37 +000054syn keyword dBoolean true false
55syn keyword dConstant null
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010056syn keyword dConstant __FILE__ __LINE__ __EOF__ __VERSION__
57syn keyword dConstant __DATE__ __TIME__ __TIMESTAMP__ __VENDOR__
58
Bram Moolenaar21cf8232004-07-16 20:18:37 +000059syn keyword dTypedef alias typedef
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010060syn keyword dStructure template interface class struct union
61syn keyword dEnum enum
Bram Moolenaar21cf8232004-07-16 20:18:37 +000062syn keyword dOperator new delete typeof typeid cast align is
63syn keyword dOperator this super
Bram Moolenaar071d4272004-06-13 20:20:40 +000064if exists("d_hl_operator_overload")
Bram Moolenaara5792f52005-11-23 21:25:05 +000065 syn keyword dOpOverload opNeg opCom opPostInc opPostDec opCast opAdd opSub opSub_r
Bram Moolenaar21cf8232004-07-16 20:18:37 +000066 syn keyword dOpOverload opMul opDiv opDiv_r opMod opMod_r opAnd opOr opXor
67 syn keyword dOpOverload opShl opShl_r opShr opShr_r opUShr opUShr_r opCat
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010068 syn keyword dOpOverload opCat_r opEquals opEquals opCmp
69 syn keyword dOpOverload opAssign opAddAssign opSubAssign opMulAssign opDivAssign
Bram Moolenaar21cf8232004-07-16 20:18:37 +000070 syn keyword dOpOverload opModAssign opAndAssign opOrAssign opXorAssign
71 syn keyword dOpOverload opShlAssign opShrAssign opUShrAssign opCatAssign
Bram Moolenaar5baddf02006-03-12 21:53:56 +000072 syn keyword dOpOverload opIndex opIndexAssign opCall opSlice opSliceAssign opPos
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010073 syn keyword dOpOverload opAdd_r opMul_r opAnd_r opOr_r opXor_r opIn opIn_r
74 syn keyword dOpOverload opPow opDispatch opStar opDot opApply opApplyReverse
Bram Moolenaar071d4272004-06-13 20:20:40 +000075endif
Bram Moolenaar21cf8232004-07-16 20:18:37 +000076syn keyword dType ushort int uint long ulong float
77syn keyword dType void byte ubyte double bit char wchar ucent cent
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010078syn keyword dType short bool dchar string wstring dstring
Bram Moolenaar21cf8232004-07-16 20:18:37 +000079syn keyword dType real ireal ifloat idouble creal cfloat cdouble
80syn keyword dDebug deprecated unittest
81syn keyword dExceptions throw try catch finally
82syn keyword dScopeDecl public protected private export
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010083syn keyword dStatement version debug return with
84syn keyword dStatement function delegate __traits asm mixin macro
85syn keyword dStorageClass in out inout ref lazy scope body
86syn keyword dStorageClass pure nothrow
87syn keyword dStorageClass auto static override final abstract volatile __gshared __thread
88syn keyword dStorageClass synchronized immutable shared const invariant lazy
Bram Moolenaar21cf8232004-07-16 20:18:37 +000089syn keyword dPragma pragma
Bram Moolenaar071d4272004-06-13 20:20:40 +000090
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010091" Attributes/annotations
92syn match dAnnotation "@[_$a-zA-Z][_$a-zA-Z0-9_]*\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000093
94" Assert is a statement and a module name.
95syn match dAssert "^assert\>"
96syn match dAssert "[^.]\s*\<assert\>"ms=s+1
97
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +010098" dTokens is used by the token string highlighting
99syn cluster dTokens contains=dExternal,dConditional,dBranch,dRepeat,dBoolean
100syn cluster dTokens add=dConstant,dTypedef,dStructure,dOperator,dOpOverload
101syn cluster dTokens add=dType,dDebug,dExceptions,dScopeDecl,dStatement
102syn cluster dTokens add=dStorageClass,dPragma,dAssert,dAnnotation
103
Bram Moolenaar071d4272004-06-13 20:20:40 +0000104" Marks contents of the asm statment body as special
105"
106" TODO
107"syn match dAsmStatement "\<asm\>"
108"syn region dAsmBody start="asm[\n]*\s*{"hs=e+1 end="}"he=e-1 contains=dAsmStatement
109"
110"hi def link dAsmBody dUnicode
111"hi def link dAsmStatement dStatement
112
113" Labels
114"
115" We contain dScopeDecl so public: private: etc. are not highlighted like labels
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100116syn match dUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=dLabel,dScopeDecl,dEnum
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000117syn keyword dLabel case default
Bram Moolenaar071d4272004-06-13 20:20:40 +0000118
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100119syn cluster dTokens add=dUserLabel,dLabel
120
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121" Comments
122"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100123syn keyword dTodo contained TODO FIXME TEMP REFACTOR REVIEW HACK BUG XXX
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000124syn match dCommentStar contained "^\s*\*[^/]"me=e-1
125syn match dCommentStar contained "^\s*\*$"
126syn match dCommentPlus contained "^\s*+[^/]"me=e-1
127syn match dCommentPlus contained "^\s*+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128if exists("d_comment_strings")
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000129 syn region dBlockCommentString contained start=+"+ end=+"+ end=+\*/+me=s-1,he=s-1 contains=dCommentStar,dUnicode,dEscSequence,@Spell
130 syn region dNestedCommentString contained start=+"+ end=+"+ end="+"me=s-1,he=s-1 contains=dCommentPlus,dUnicode,dEscSequence,@Spell
131 syn region dLineCommentString contained start=+"+ end=+$\|"+ contains=dUnicode,dEscSequence,@Spell
132 syn region dBlockComment start="/\*" end="\*/" contains=dBlockCommentString,dTodo,@Spell
133 syn region dNestedComment start="/+" end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell
134 syn match dLineComment "//.*" contains=dLineCommentString,dTodo,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135else
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000136 syn region dBlockComment start="/\*" end="\*/" contains=dBlockCommentString,dTodo,@Spell
137 syn region dNestedComment start="/+" end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell
138 syn match dLineComment "//.*" contains=dLineCommentString,dTodo,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139endif
140
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000141hi link dLineCommentString dBlockCommentString
142hi link dBlockCommentString dString
143hi link dNestedCommentString dString
144hi link dCommentStar dBlockComment
145hi link dCommentPlus dNestedComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000146
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100147syn cluster dTokens add=dBlockComment,dNestedComment,dLineComment
148
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000149" /+ +/ style comments and strings that span multiple lines can cause
150" problems. To play it safe, set minlines to a large number.
151syn sync minlines=200
152" Use ccomment for /* */ style comments
153syn sync ccomment dBlockComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154
155" Characters
156"
157syn match dSpecialCharError contained "[^']"
158
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000159" Escape sequences (oct,specal char,hex,wchar, character entities \&xxx;)
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100160" These are not contained because they are considered string literals.
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000161syn match dEscSequence "\\\(\o\{1,3}\|[\"\\'\\?ntbrfva]\|u\x\{4}\|U\x\{8}\|x\x\x\)"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100162syn match dEscSequence "\\&[^;& \t]\+;"
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000163syn match dCharacter "'[^']*'" contains=dEscSequence,dSpecialCharError
164syn match dCharacter "'\\''" contains=dEscSequence
165syn match dCharacter "'[^\\]'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100167syn cluster dTokens add=dEscSequence,dCharacter
168
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169" Unicode characters
170"
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000171syn match dUnicode "\\u\d\{4\}"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172
173" String.
174"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100175syn region dString start=+"+ end=+"[cwd]\=+ skip=+\\\\\|\\"+ contains=dEscSequence,@Spell
176syn region dRawString start=+`+ end=+`[cwd]\=+ contains=@Spell
177syn region dRawString start=+r"+ end=+"[cwd]\=+ contains=@Spell
178syn region dHexString start=+x"+ end=+"[cwd]\=+ contains=@Spell
179syn region dDelimString start=+q"\z(.\)+ end=+\z1"+ contains=@Spell
180syn region dHereString start=+q"\z(\I\i*\)\n+ end=+\n\z1"+ contains=@Spell
181
182" Nesting delimited string contents
183"
184syn region dNestParenString start=+(+ end=+)+ contained transparent contains=dNestParenString,@Spell
185syn region dNestBrackString start=+\[+ end=+\]+ contained transparent contains=dNestBrackString,@Spell
186syn region dNestAngleString start=+<+ end=+>+ contained transparent contains=dNestAngleString,@Spell
187syn region dNestCurlyString start=+{+ end=+}+ contained transparent contains=dNestCurlyString,@Spell
188
189" Nesting delimited strings
190"
191syn region dParenString matchgroup=dParenString start=+q"(+ end=+)"+ contains=dNestParenString,@Spell
192syn region dBrackString matchgroup=dBrackString start=+q"\[+ end=+\]"+ contains=dNestBrackString,@Spell
193syn region dAngleString matchgroup=dAngleString start=+q"<+ end=+>"+ contains=dNestAngleString,@Spell
194syn region dCurlyString matchgroup=dCurlyString start=+q"{+ end=+}"+ contains=dNestCurlyString,@Spell
195
196hi link dParenString dNestString
197hi link dBrackString dNestString
198hi link dAngleString dNestString
199hi link dCurlyString dNestString
200
201syn cluster dTokens add=dString,dRawString,dHexString,dDelimString,dNestString
202
203" Token strings
204"
205syn region dNestTokenString start=+{+ end=+}+ contained contains=dNestTokenString,@dTokens
206syn region dTokenString matchgroup=dTokenStringBrack transparent start=+q{+ end=+}+ contains=dNestTokenString,@dTokens
207
208syn cluster dTokens add=dTokenString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209
210" Numbers
211"
212syn case ignore
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000213
214syn match dDec display "\<\d[0-9_]*\(u\=l\=\|l\=u\=\)\>"
215
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216" Hex number
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000217syn match dHex display "\<0x[0-9a-f_]\+\(u\=l\=\|l\=u\=\)\>"
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000218
219syn match dOctal display "\<0[0-7_]\+\(u\=l\=\|l\=u\=\)\>"
220" flag an octal number with wrong digits
221syn match dOctalError display "\<0[0-7_]*[89][0-9_]*"
222
223" binary numbers
224syn match dBinary display "\<0b[01_]\+\(u\=l\=\|l\=u\=\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225
226"floating point without the dot
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000227syn match dFloat display "\<\d[0-9_]*\(fi\=\|l\=i\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228"floating point number, with dot, optional exponent
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000229syn match dFloat display "\<\d[0-9_]*\.[0-9_]*\(e[-+]\=[0-9_]\+\)\=[fl]\=i\="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230"floating point number, starting with a dot, optional exponent
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000231syn match dFloat display "\(\.[0-9_]\+\)\(e[-+]\=[0-9_]\+\)\=[fl]\=i\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232"floating point number, without dot, with exponent
Bram Moolenaar21cf8232004-07-16 20:18:37 +0000233"syn match dFloat display "\<\d\+e[-+]\=\d\+[fl]\=\>"
234syn match dFloat display "\<\d[0-9_]*e[-+]\=[0-9_]\+[fl]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000235
236"floating point without the dot
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000237syn match dHexFloat display "\<0x[0-9a-f_]\+\(fi\=\|l\=i\)\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000238"floating point number, with dot, optional exponent
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000239syn match dHexFloat display "\<0x[0-9a-f_]\+\.[0-9a-f_]*\(p[-+]\=[0-9_]\+\)\=[fl]\=i\="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000240"floating point number, without dot, with exponent
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000241syn match dHexFloat display "\<0x[0-9a-f_]\+p[-+]\=[0-9_]\+[fl]\=i\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100243syn cluster dTokens add=dDec,dHex,dOctal,dOctalError,dBinary,dFloat,dHexFloat
244
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245syn case match
246
247" Pragma (preprocessor) support
248" TODO: Highlight following Integer and optional Filespec.
249syn region dPragma start="#\s*\(line\>\)" skip="\\$" end="$"
250
251
252" The default highlighting.
253"
254hi def link dBinary Number
Bram Moolenaar5baddf02006-03-12 21:53:56 +0000255hi def link dDec Number
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256hi def link dHex Number
257hi def link dOctal Number
258hi def link dFloat Float
259hi def link dHexFloat Float
260hi def link dDebug Debug
261hi def link dBranch Conditional
262hi def link dConditional Conditional
263hi def link dLabel Label
264hi def link dUserLabel Label
265hi def link dRepeat Repeat
266hi def link dExceptions Exception
267hi def link dAssert Statement
268hi def link dStatement Statement
269hi def link dScopeDecl dStorageClass
270hi def link dStorageClass StorageClass
271hi def link dBoolean Boolean
272hi def link dUnicode Special
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100273hi def link dTokenStringBrack String
274hi def link dHereString String
275hi def link dNestString String
276hi def link dDelimString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000277hi def link dRawString String
278hi def link dString String
279hi def link dHexString String
280hi def link dCharacter Character
281hi def link dEscSequence SpecialChar
282hi def link dSpecialCharError Error
283hi def link dOctalError Error
284hi def link dOperator Operator
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100285hi def link dOpOverload Identifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286hi def link dConstant Constant
287hi def link dTypedef Typedef
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100288hi def link dEnum Structure
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289hi def link dStructure Structure
290hi def link dTodo Todo
291hi def link dType Type
292hi def link dLineComment Comment
293hi def link dBlockComment Comment
294hi def link dNestedComment Comment
295hi def link dExternal Include
296hi def link dPragma PreProc
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100297hi def link dAnnotation PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298
299let b:current_syntax = "d"
Bram Moolenaar9db9d9c2010-01-16 14:29:14 +0100300
Bram Moolenaara5792f52005-11-23 21:25:05 +0000301" vim: ts=8 noet