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