Install vim73
[msysgit/mtrensch.git] / share / vim / vim73 / syntax / d.vim
blob964936e60642c72900308024ab3b94356b43f8f2
1 " Vim syntax file for the D programming language (version 1.053 and 2.039).
3 " Language:     D
4 " Maintainer:   Jason Mills<jasonmills@nf.sympatico.ca>
5 " Last Change:  2010 Jan 07
6 " Version:      0.18
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.
15 " Please email me with bugs, comments, and suggestions.
17 " Options:
18 "   d_comment_strings - Set to highlight strings and numbers in comments.
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).
23 " Todo:
24 "   - Determine a better method of sync'ing than simply setting minlines
25 "   to a large number.
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.
35 "   - Mark contents of the asm statement body as special
37 "   - Maybe highlight the 'exit', 'failure', and 'success' parts of the
38 "   scope() statement.
40 "   - Highlighting DDoc comments.
43 " Quit when a syntax file was already loaded
44 if exists("b:current_syntax")
45   finish
46 endif
48 " Keyword definitions
50 syn keyword dExternal           import package module extern
51 syn keyword dConditional        if else switch
52 syn keyword dBranch             goto break continue
53 syn keyword dRepeat             while for do foreach foreach_reverse
54 syn keyword dBoolean            true false
55 syn keyword dConstant           null
56 syn keyword dConstant           __FILE__ __LINE__ __EOF__ __VERSION__
57 syn keyword dConstant           __DATE__ __TIME__ __TIMESTAMP__ __VENDOR__
59 syn keyword dTypedef            alias typedef
60 syn keyword dStructure          template interface class struct union
61 syn keyword dEnum               enum
62 syn keyword dOperator           new delete typeof typeid cast align is
63 syn keyword dOperator           this super
64 if 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
75 endif
76 syn keyword dType               ushort int uint long ulong float
77 syn keyword dType               void byte ubyte double bit char wchar ucent cent
78 syn keyword dType               short bool dchar string wstring dstring
79 syn keyword dType               real ireal ifloat idouble creal cfloat cdouble
80 syn keyword dDebug              deprecated unittest
81 syn keyword dExceptions         throw try catch finally
82 syn keyword dScopeDecl          public protected private export
83 syn keyword dStatement          version debug return with
84 syn keyword dStatement          function delegate __traits asm mixin macro
85 syn keyword dStorageClass       in out inout ref lazy scope body
86 syn keyword dStorageClass       pure nothrow
87 syn keyword dStorageClass       auto static override final abstract volatile __gshared __thread
88 syn keyword dStorageClass       synchronized immutable shared const invariant lazy
89 syn keyword dPragma             pragma
91 " Attributes/annotations
92 syn match dAnnotation   "@[_$a-zA-Z][_$a-zA-Z0-9_]*\>"
94 " Assert is a statement and a module name.
95 syn match dAssert "^assert\>"
96 syn match dAssert "[^.]\s*\<assert\>"ms=s+1
98 " dTokens is used by the token string highlighting
99 syn cluster dTokens contains=dExternal,dConditional,dBranch,dRepeat,dBoolean
100 syn cluster dTokens add=dConstant,dTypedef,dStructure,dOperator,dOpOverload
101 syn cluster dTokens add=dType,dDebug,dExceptions,dScopeDecl,dStatement
102 syn cluster dTokens add=dStorageClass,dPragma,dAssert,dAnnotation
104 " Marks contents of the asm statment body as special
106 " TODO
107 "syn match dAsmStatement "\<asm\>"
108 "syn region dAsmBody start="asm[\n]*\s*{"hs=e+1 end="}"he=e-1 contains=dAsmStatement
110 "hi def link dAsmBody dUnicode
111 "hi def link dAsmStatement dStatement
113 " Labels
115 " We contain dScopeDecl so public: private: etc. are not highlighted like labels
116 syn match dUserLabel    "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=dLabel,dScopeDecl,dEnum
117 syn keyword dLabel      case default
119 syn cluster dTokens add=dUserLabel,dLabel
121 " Comments
123 syn keyword dTodo       contained TODO FIXME TEMP REFACTOR REVIEW HACK BUG XXX
124 syn match dCommentStar  contained "^\s*\*[^/]"me=e-1
125 syn match dCommentStar  contained "^\s*\*$"
126 syn match dCommentPlus  contained "^\s*+[^/]"me=e-1
127 syn match dCommentPlus  contained "^\s*+$"
128 if 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
135 else
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
139 endif
141 hi link dLineCommentString      dBlockCommentString
142 hi link dBlockCommentString     dString
143 hi link dNestedCommentString    dString
144 hi link dCommentStar            dBlockComment
145 hi link dCommentPlus            dNestedComment
147 syn cluster dTokens add=dBlockComment,dNestedComment,dLineComment
149 " /+ +/ style comments and strings that span multiple lines can cause
150 " problems. To play it safe, set minlines to a large number.
151 syn sync minlines=200
152 " Use ccomment for /* */ style comments
153 syn sync ccomment dBlockComment
155 " Characters
157 syn match dSpecialCharError contained "[^']"
159 " Escape sequences (oct,specal char,hex,wchar, character entities \&xxx;)
160 " These are not contained because they are considered string literals.
161 syn match dEscSequence  "\\\(\o\{1,3}\|[\"\\'\\?ntbrfva]\|u\x\{4}\|U\x\{8}\|x\x\x\)"
162 syn match dEscSequence  "\\&[^;& \t]\+;"
163 syn match dCharacter    "'[^']*'" contains=dEscSequence,dSpecialCharError
164 syn match dCharacter    "'\\''" contains=dEscSequence
165 syn match dCharacter    "'[^\\]'"
167 syn cluster dTokens add=dEscSequence,dCharacter
169 " Unicode characters
171 syn match dUnicode "\\u\d\{4\}"
173 " String.
175 syn region dString      start=+"+ end=+"[cwd]\=+ skip=+\\\\\|\\"+ contains=dEscSequence,@Spell
176 syn region dRawString   start=+`+ end=+`[cwd]\=+ contains=@Spell
177 syn region dRawString   start=+r"+ end=+"[cwd]\=+ contains=@Spell
178 syn region dHexString   start=+x"+ end=+"[cwd]\=+ contains=@Spell
179 syn region dDelimString start=+q"\z(.\)+ end=+\z1"+ contains=@Spell
180 syn region dHereString  start=+q"\z(\I\i*\)\n+ end=+\n\z1"+ contains=@Spell
182 " Nesting delimited string contents
184 syn region dNestParenString start=+(+ end=+)+ contained transparent contains=dNestParenString,@Spell
185 syn region dNestBrackString start=+\[+ end=+\]+ contained transparent contains=dNestBrackString,@Spell
186 syn region dNestAngleString start=+<+ end=+>+ contained transparent contains=dNestAngleString,@Spell
187 syn region dNestCurlyString start=+{+ end=+}+ contained transparent contains=dNestCurlyString,@Spell
189 " Nesting delimited strings
191 syn region dParenString matchgroup=dParenString start=+q"(+ end=+)"+ contains=dNestParenString,@Spell
192 syn region dBrackString matchgroup=dBrackString start=+q"\[+ end=+\]"+ contains=dNestBrackString,@Spell
193 syn region dAngleString matchgroup=dAngleString start=+q"<+ end=+>"+ contains=dNestAngleString,@Spell
194 syn region dCurlyString matchgroup=dCurlyString start=+q"{+ end=+}"+ contains=dNestCurlyString,@Spell
196 hi link dParenString dNestString
197 hi link dBrackString dNestString
198 hi link dAngleString dNestString
199 hi link dCurlyString dNestString
201 syn cluster dTokens add=dString,dRawString,dHexString,dDelimString,dNestString
203 " Token strings
205 syn region dNestTokenString start=+{+ end=+}+ contained contains=dNestTokenString,@dTokens
206 syn region dTokenString matchgroup=dTokenStringBrack transparent start=+q{+ end=+}+ contains=dNestTokenString,@dTokens
208 syn cluster dTokens add=dTokenString
210 " Numbers
212 syn case ignore
214 syn match dDec          display "\<\d[0-9_]*\(u\=l\=\|l\=u\=\)\>"
216 " Hex number
217 syn match dHex          display "\<0x[0-9a-f_]\+\(u\=l\=\|l\=u\=\)\>"
219 syn match dOctal        display "\<0[0-7_]\+\(u\=l\=\|l\=u\=\)\>"
220 " flag an octal number with wrong digits
221 syn match dOctalError   display "\<0[0-7_]*[89][0-9_]*"
223 " binary numbers
224 syn match dBinary       display "\<0b[01_]\+\(u\=l\=\|l\=u\=\)\>"
226 "floating point without the dot
227 syn match dFloat        display "\<\d[0-9_]*\(fi\=\|l\=i\)\>"
228 "floating point number, with dot, optional exponent
229 syn match dFloat        display "\<\d[0-9_]*\.[0-9_]*\(e[-+]\=[0-9_]\+\)\=[fl]\=i\="
230 "floating point number, starting with a dot, optional exponent
231 syn 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]\=\>"
234 syn match dFloat        display "\<\d[0-9_]*e[-+]\=[0-9_]\+[fl]\=\>"
236 "floating point without the dot
237 syn match dHexFloat     display "\<0x[0-9a-f_]\+\(fi\=\|l\=i\)\>"
238 "floating point number, with dot, optional exponent
239 syn match dHexFloat     display "\<0x[0-9a-f_]\+\.[0-9a-f_]*\(p[-+]\=[0-9_]\+\)\=[fl]\=i\="
240 "floating point number, without dot, with exponent
241 syn match dHexFloat     display "\<0x[0-9a-f_]\+p[-+]\=[0-9_]\+[fl]\=i\=\>"
243 syn cluster dTokens add=dDec,dHex,dOctal,dOctalError,dBinary,dFloat,dHexFloat
245 syn case match
247 " Pragma (preprocessor) support
248 " TODO: Highlight following Integer and optional Filespec.
249 syn region  dPragma start="#\s*\(line\>\)" skip="\\$" end="$"
252 " The default highlighting.
254 hi def link dBinary             Number
255 hi def link dDec                Number
256 hi def link dHex                Number
257 hi def link dOctal              Number
258 hi def link dFloat              Float
259 hi def link dHexFloat           Float
260 hi def link dDebug              Debug
261 hi def link dBranch             Conditional
262 hi def link dConditional        Conditional
263 hi def link dLabel              Label
264 hi def link dUserLabel          Label
265 hi def link dRepeat             Repeat
266 hi def link dExceptions         Exception
267 hi def link dAssert             Statement
268 hi def link dStatement          Statement
269 hi def link dScopeDecl          dStorageClass
270 hi def link dStorageClass       StorageClass
271 hi def link dBoolean            Boolean
272 hi def link dUnicode            Special
273 hi def link dTokenStringBrack   String
274 hi def link dHereString         String
275 hi def link dNestString         String
276 hi def link dDelimString        String
277 hi def link dRawString          String
278 hi def link dString             String
279 hi def link dHexString          String
280 hi def link dCharacter          Character
281 hi def link dEscSequence        SpecialChar
282 hi def link dSpecialCharError   Error
283 hi def link dOctalError         Error
284 hi def link dOperator           Operator
285 hi def link dOpOverload         Identifier
286 hi def link dConstant           Constant
287 hi def link dTypedef            Typedef
288 hi def link dEnum               Structure
289 hi def link dStructure          Structure
290 hi def link dTodo               Todo
291 hi def link dType               Type
292 hi def link dLineComment        Comment
293 hi def link dBlockComment       Comment
294 hi def link dNestedComment      Comment
295 hi def link dExternal           Include
296 hi def link dPragma             PreProc
297 hi def link dAnnotation         PreProc
299 let b:current_syntax = "d"
301 " vim: ts=8 noet