1" Vim syntax file for the D programming language (version 1.053 and 2.039).
2"
3" Language:	D
4" 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.
16"
17" Options:
18"   d_comment_strings - Set to highlight strings and numbers in comments.
19"
20"   d_hl_operator_overload - Set to highlight D's specially named functions
21"   that when overloaded implement unary and binary operators (e.g. opCmp).
22"
23" Todo:
24"   - Determine a better method of sync'ing than simply setting minlines
25"   to a large number.
26"
27"   - 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.
34"
35"   - Mark contents of the asm statement body as special
36"
37"   - Maybe highlight the 'exit', 'failure', and 'success' parts of the
38"   scope() statement.
39"
40"   - Highlighting DDoc comments.
41"
42
43" Quit when a syntax file was already loaded
44if exists("b:current_syntax")
45  finish
46endif
47
48" Keyword definitions
49"
50syn keyword dExternal		import package module extern
51syn keyword dConditional	if else switch
52syn keyword dBranch		goto break continue
53syn keyword dRepeat		while for do foreach foreach_reverse
54syn keyword dBoolean		true false
55syn keyword dConstant		null
56syn keyword dConstant		__FILE__ __LINE__ __EOF__ __VERSION__
57syn keyword dConstant		__DATE__ __TIME__ __TIMESTAMP__ __VENDOR__
58
59syn keyword dTypedef		alias typedef
60syn keyword dStructure		template interface class struct union
61syn keyword dEnum		enum
62syn keyword dOperator		new delete typeof typeid cast align is
63syn keyword dOperator		this super
64if exists("d_hl_operator_overload")
65  syn keyword dOpOverload	opNeg opCom opPostInc opPostDec opCast opAdd opSub opSub_r
66  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
68  syn keyword dOpOverload	opCat_r opEquals opEquals opCmp
69  syn keyword dOpOverload	opAssign opAddAssign opSubAssign opMulAssign opDivAssign
70  syn keyword dOpOverload	opModAssign opAndAssign opOrAssign opXorAssign
71  syn keyword dOpOverload	opShlAssign opShrAssign opUShrAssign opCatAssign
72  syn keyword dOpOverload	opIndex opIndexAssign opCall opSlice opSliceAssign opPos
73  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
75endif
76syn keyword dType		ushort int uint long ulong float
77syn keyword dType		void byte ubyte double bit char wchar ucent cent
78syn keyword dType		short bool dchar string wstring dstring
79syn 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
83syn 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
89syn keyword dPragma		pragma
90
91" Attributes/annotations
92syn match dAnnotation	"@[_$a-zA-Z][_$a-zA-Z0-9_]*\>"
93
94" Assert is a statement and a module name.
95syn match dAssert "^assert\>"
96syn match dAssert "[^.]\s*\<assert\>"ms=s+1
97
98" 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
104" 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
116syn match dUserLabel    "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=dLabel,dScopeDecl,dEnum
117syn keyword dLabel	case default
118
119syn cluster dTokens add=dUserLabel,dLabel
120
121" Comments
122"
123syn keyword dTodo	contained TODO FIXME TEMP REFACTOR REVIEW HACK BUG XXX
124syn 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*+$"
128if exists("d_comment_strings")
129  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
135else
136  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
139endif
140
141hi link dLineCommentString	dBlockCommentString
142hi link dBlockCommentString	dString
143hi link dNestedCommentString	dString
144hi link dCommentStar		dBlockComment
145hi link dCommentPlus		dNestedComment
146
147syn cluster dTokens add=dBlockComment,dNestedComment,dLineComment
148
149" /+ +/ 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
154
155" Characters
156"
157syn match dSpecialCharError contained "[^']"
158
159" Escape sequences (oct,specal char,hex,wchar, character entities \&xxx;)
160" These are not contained because they are considered string literals.
161syn match dEscSequence	"\\\(\o\{1,3}\|[\"\\'\\?ntbrfva]\|u\x\{4}\|U\x\{8}\|x\x\x\)"
162syn match dEscSequence	"\\&[^;& \t]\+;"
163syn match dCharacter	"'[^']*'" contains=dEscSequence,dSpecialCharError
164syn match dCharacter	"'\\''" contains=dEscSequence
165syn match dCharacter	"'[^\\]'"
166
167syn cluster dTokens add=dEscSequence,dCharacter
168
169" Unicode characters
170"
171syn match dUnicode "\\u\d\{4\}"
172
173" String.
174"
175syn 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
209
210" Numbers
211"
212syn case ignore
213
214syn match dDec		display "\<\d[0-9_]*\(u\=l\=\|l\=u\=\)\>"
215
216" Hex number
217syn match dHex		display "\<0x[0-9a-f_]\+\(u\=l\=\|l\=u\=\)\>"
218
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\=\)\>"
225
226"floating point without the dot
227syn match dFloat	display "\<\d[0-9_]*\(fi\=\|l\=i\)\>"
228"floating point number, with dot, optional exponent
229syn match dFloat	display "\<\d[0-9_]*\.[0-9_]*\(e[-+]\=[0-9_]\+\)\=[fl]\=i\="
230"floating point number, starting with a dot, optional exponent
231syn match dFloat	display "\(\.[0-9_]\+\)\(e[-+]\=[0-9_]\+\)\=[fl]\=i\=\>"
232"floating point number, without dot, with exponent
233"syn match dFloat	display "\<\d\+e[-+]\=\d\+[fl]\=\>"
234syn match dFloat	display "\<\d[0-9_]*e[-+]\=[0-9_]\+[fl]\=\>"
235
236"floating point without the dot
237syn match dHexFloat	display "\<0x[0-9a-f_]\+\(fi\=\|l\=i\)\>"
238"floating point number, with dot, optional exponent
239syn match dHexFloat	display "\<0x[0-9a-f_]\+\.[0-9a-f_]*\(p[-+]\=[0-9_]\+\)\=[fl]\=i\="
240"floating point number, without dot, with exponent
241syn match dHexFloat	display "\<0x[0-9a-f_]\+p[-+]\=[0-9_]\+[fl]\=i\=\>"
242
243syn cluster dTokens add=dDec,dHex,dOctal,dOctalError,dBinary,dFloat,dHexFloat
244
245syn 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
255hi def link dDec		Number
256hi 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
273hi def link dTokenStringBrack	String
274hi def link dHereString		String
275hi def link dNestString		String
276hi def link dDelimString	String
277hi 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
285hi def link dOpOverload		Identifier
286hi def link dConstant		Constant
287hi def link dTypedef		Typedef
288hi def link dEnum		Structure
289hi 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
297hi def link dAnnotation		PreProc
298
299let b:current_syntax = "d"
300
301" vim: ts=8 noet
302