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