blob: 51ecc43ae98ef76ec6262642d3d641374076d19c [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file for the D programming language (version 0.90).
2"
3" Language: D
4" Maintainer: Jason Mills<jmills@cs.mun.ca>
5" URL:
6" Last Change: 2004 May 21
7" Version: 0.8
8"
9" Options:
10" d_comment_strings - set to highlight strings and numbers in comments
11"
12" d_hl_operator_overload - set to highlight D's specially named functions
13" that when overloaded implement unary and binary operators (e.g. cmp).
14"
15" Todo:
16" - Allow user to set sync minlines
17"
18" - Several keywords (namely, in and out) are both storage class and
19" statements, depending on their context. Must use some matching to figure
20" out which and highlight appropriately. For now I have made such keywords
21" statements.
22"
23" - Mark contents of the asm statement body as special
24"
25
26" Quit when a syntax file was already loaded
27if exists("b:current_syntax")
28 finish
29endif
30
31" Keyword definitions
32"
33syn keyword dExternal import module extern
34syn keyword dConditional if else switch
35syn keyword dBranch goto break continue
36syn keyword dRepeat while for do foreach
37syn keyword dBoolean true false
38syn keyword dConstant null
39syn keyword dTypedef alias typedef
40syn keyword dStructure template interface class enum struct union
41syn keyword dOperator new delete typeof cast align is
42syn keyword dOperator this super
43if exists("d_hl_operator_overload")
44 syn keyword dOpOverload opNeg opCom opPostInc opPostDec opAdd opSub opSub_r
45 syn keyword dOpOverload opMul opDiv opDiv_r opMod opMod_r opAnd opOr opXor
46 syn keyword dOpOverload opShl opShl_r opShr opShr_r opUShr opUShr_r opCat
47 syn keyword dOpOverload opCat_r opEquals opEquals opCmp opCmp opCmp opCmp
48 syn keyword dOpOverload opAddAssign opSubAssign opMulAssign opDivAssign
49 syn keyword dOpOverload opModAssign opAndAssign opOrAssign opXorAssign
50 syn keyword dOpOverload opShlAssign opShrAssign opUShrAssign opCatAssign
51 syn keyword dOpOverload opIndex opCall opSlice
52endif
53syn keyword dType ushort int uint long ulong float
54syn keyword dType void byte ubyte double bit char wchar ucent cent
55syn keyword dType short bool dchar
56syn keyword dType real ireal ifloat idouble creal cfloat cdouble
57syn keyword dDebug deprecated unittest
58syn keyword dExceptions throw try catch finally
59syn keyword dScopeDecl public protected private export
60syn keyword dStatement version debug return with invariant body
61syn keyword dStatement in out inout asm mixin
62syn keyword dStatement function delegate
63syn keyword dStorageClass auto static override final const abstract volatile
64syn keyword dStorageClass synchronized
65syn keyword dPragma pragma
66
67
68" Assert is a statement and a module name.
69syn match dAssert "^assert\>"
70syn match dAssert "[^.]\s*\<assert\>"ms=s+1
71
72" Marks contents of the asm statment body as special
73"
74" TODO
75"syn match dAsmStatement "\<asm\>"
76"syn region dAsmBody start="asm[\n]*\s*{"hs=e+1 end="}"he=e-1 contains=dAsmStatement
77"
78"hi def link dAsmBody dUnicode
79"hi def link dAsmStatement dStatement
80
81" Labels
82"
83" We contain dScopeDecl so public: private: etc. are not highlighted like labels
84syn match dUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=dLabel,dScopeDecl
85syn keyword dLabel case default
86
87" Comments
88"
89syn keyword dTodo contained TODO FIXME TEMP XXX
90syn match dCommentStar contained "^\s*\*[^/]"me=e-1
91syn match dCommentStar contained "^\s*\*$"
92syn match dCommentPlus contained "^\s*+[^/]"me=e-1
93syn match dCommentPlus contained "^\s*+$"
94if exists("d_comment_strings")
95 syn region dBlockCommentString contained start=+"+ end=+"+ end=+\*/+me=s-1,he=s-1 contains=dCommentStar,dUnicode,dEscSequence,@Spell
96 syn region dNestedCommentString contained start=+"+ end=+"+ end="+"me=s-1,he=s-1 contains=dCommentPlus,dUnicode,dEscSequence,@Spell
97 syn region dLineCommentString contained start=+"+ end=+$\|"+ contains=dUnicode,dEscSequence,@Spell
98 syn region dBlockComment start="/\*" end="\*/" contains=dBlockCommentString,dTodo,@Spell
99 syn region dNestedComment start="/+" end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell
100 syn match dLineComment "//.*" contains=dLineCommentString,dTodo,@Spell
101else
102 syn region dBlockComment start="/\*" end="\*/" contains=dBlockCommentString,dTodo,@Spell
103 syn region dNestedComment start="/+" end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell
104 syn match dLineComment "//.*" contains=dLineCommentString,dTodo,@Spell
105endif
106
107hi link dLineCommentString dBlockCommentString
108hi link dBlockCommentString dString
109hi link dNestedCommentString dString
110hi link dCommentStar dBlockComment
111hi link dCommentPlus dNestedComment
112
113syn sync minlines=25
114
115" Characters
116"
117syn match dSpecialCharError contained "[^']"
118
119" Escape sequences (oct,specal char,hex,wchar). These are not contained
120" because they are considered string litterals
121syn match dEscSequence "\\\(\o\{1,3}\|[\"\\'\\?ntbrfva]\|u\x\{4}\|U\x\{8}\|x\x\x\)"
122syn match dCharacter "'[^']*'" contains=dEscSequence,dSpecialCharError
123syn match dCharacter "'\\''" contains=dEscSequence
124syn match dCharacter "'[^\\]'"
125
126" Unicode characters
127"
128syn match dUnicode "\\u\d\{4\}"
129
130" String.
131"
132syn region dString start=+"+ end=+"+ contains=dEscSequence,@Spell
133syn region dRawString start=+`+ skip=+\\`+ end=+`+ contains=@Spell
134syn region dRawString start=+r"+ skip=+\\"+ end=+"+ contains=@Spell
135syn region dHexString start=+x"+ skip=+\\"+ end=+"+
136
137" Numbers
138"
139syn case ignore
140syn match dInt display "\<\d[0-9_]*\(u\=l\=\|l\=u\=\)\>"
141" Hex number
142syn match dHex display "\<0x[0-9a-f_]\+\(u\=l\=\|l\=u\=\)\>"
143syn match dHex display "\<\x[0-9a-f_]*h\(u\=l\=\|l\=u\=\)\>"
144" Flag the first zero of an octal number as something special
145syn match dOctal display "\<0[0-7_]\+\(u\=l\=\|l\=u\=\)\>" contains=cOctalZero
146syn match dOctalZero display contained "\<0"
147
148"floating point without the dot
149syn match dFloat display "\<\d[0-9_]*\(fi\=\|l\=i\)\>"
150"floating point number, with dot, optional exponent
151syn match dFloat display "\<\d[0-9_]*\.[0-9_]*\(e[-+]\=[0-9_]\+\)\=[fl]\=i\="
152"floating point number, starting with a dot, optional exponent
153syn match dFloat display "\(\.[0-9_]\+\)\(e[-+]\=[0-9_]\+\)\=[fl]\=i\=\>"
154"floating point number, without dot, with exponent
155"syn match dFloat display "\<\d\+e[-+]\=\d\+[fl]\=\>"
156syn match dFloat display "\<\d[0-9_]*e[-+]\=[0-9_]\+[fl]\=\>"
157
158"floating point without the dot
159syn match dHexFloat display "\<0x\x\+\(fi\=\|l\=i\)\>"
160"floating point number, with dot, optional exponent
161syn match dHexFloat display "\<0x\x\+\.\x*\(p[-+]\=\x\+\)\=[fl]\=i\="
162"floating point number, without dot, with exponent
163syn match dHexFloat display "\<0x\x\+p[-+]\=\x\+[fl]\=\>"
164
165" binary numbers
166syn match dBinary display "\<0b[01_]\+\>"
167" flag an octal number with wrong digits
168syn match dOctalError display "0\o*[89]\d*"
169syn case match
170
171" Pragma (preprocessor) support
172" TODO: Highlight following Integer and optional Filespec.
173syn region dPragma start="#\s*\(line\>\)" skip="\\$" end="$"
174
175
176" The default highlighting.
177"
178hi def link dBinary Number
179hi def link dInt Number
180hi def link dHex Number
181hi def link dOctal Number
182hi def link dFloat Float
183hi def link dHexFloat Float
184hi def link dDebug Debug
185hi def link dBranch Conditional
186hi def link dConditional Conditional
187hi def link dLabel Label
188hi def link dUserLabel Label
189hi def link dRepeat Repeat
190hi def link dExceptions Exception
191hi def link dAssert Statement
192hi def link dStatement Statement
193hi def link dScopeDecl dStorageClass
194hi def link dStorageClass StorageClass
195hi def link dBoolean Boolean
196hi def link dUnicode Special
197hi def link dRawString String
198hi def link dString String
199hi def link dHexString String
200hi def link dCharacter Character
201hi def link dEscSequence SpecialChar
202hi def link dSpecialCharError Error
203hi def link dOctalError Error
204hi def link dOperator Operator
205hi def link dOpOverload Operator
206hi def link dConstant Constant
207hi def link dTypedef Typedef
208hi def link dStructure Structure
209hi def link dTodo Todo
210hi def link dType Type
211hi def link dLineComment Comment
212hi def link dBlockComment Comment
213hi def link dNestedComment Comment
214hi def link dExternal Include
215hi def link dPragma PreProc
216
217let b:current_syntax = "d"
218
219" vim: ts=8