Plain Text Paste by KirkMcDonald
Description: d.vim
Show line numbers

Create new paste
Post a reply
View replies

" Vim syntax file for the D programming language (version 2.004).
" Language:    D
" Maintainer:    Jason Mills <>
" Last Change:    2007 Sep 14
" Version:    0.17
" Please email me with bugs, comments, and suggestion. Put vim in the subject
" to ensure the email will not be marked as spam.
" (Version 0.17 updated by Kirk McDonald.)
" Options:
"   d_comment_strings - Set to highlight strings and numbers in comments.
"   d_hl_operator_overload - Set to highlight D's specially named functions
"   that when overloaded implement unary and binary operators (e.g. opCmp).
"   d_hl_string_types - Set to highlight the built-in string, wstring, and
"   dstring aliases.
" Todo:
"   - Must determine a better method of sync'ing than simply setting minlines
"   to a large number for /+ +/ style comments.
"   - Several keywords (namely, in, out, inout) are both storage class and
"   statements, depending on their context. I must use some matching to figure
"   out which and highlight appropriately. For now I have made such keywords
"   statements. To be somewhat consistent, I also made lazy a statement, even
"   though it's a storage class.
"   - Mark contents of the asm statement body as special
"   - Maybe highlight the 'exit', 'failure', and 'success' parts of the
"   scope() statement.

" Quit when a syntax file was already loaded
if exists("b:current_syntax")

" Keyword definitions
syn keyword dExternal        import package module extern
syn keyword dConditional    if else switch
syn keyword dBranch        goto break continue
syn keyword dRepeat        while for do foreach foreach_reverse
syn keyword dBoolean        true false
syn keyword dConstant        null
syn keyword dConstant        __FILE__ __LINE__ __DATE__ __TIME__ __TIMESTAMP__
syn keyword dTypedef        alias typedef
syn keyword dStructure        template interface class struct union
syn keyword dEnum        enum
syn keyword dOperator        new delete typeof typeid cast align is
syn keyword dOperator        this super
if exists("d_hl_operator_overload")
  syn keyword dOpOverload    opNeg opCom opPostInc opPostDec opAdd opSub opSub_r
  syn keyword dOpOverload    opMul opDiv opDiv_r opMod opMod_r opAnd opOr opXor
  syn keyword dOpOverload    opShl opShl_r opShr opShr_r opUShr opUShr_r opCat
  syn keyword dOpOverload    opCat_r opEquals opEquals opCmp opCast
  syn keyword dOpOverload    opAddAssign opSubAssign opMulAssign opDivAssign
  syn keyword dOpOverload    opModAssign opAndAssign opOrAssign opXorAssign
  syn keyword dOpOverload    opShlAssign opShrAssign opUShrAssign opCatAssign
  syn keyword dOpOverload    opIndex opIndexAssign opCall opSlice opPos opAssign
  syn keyword dOpOverload    opSliceAssign opApply opApplyReverse opIn opIn_r
  syn keyword dOpOverload    opAdd_r opMul_r opAnd_r opOr_r opXor_r 
syn keyword dType        ushort int uint long ulong float
syn keyword dType        void byte ubyte double bit char wchar ucent cent
syn keyword dType        short bool dchar
syn keyword dType        real ireal ifloat idouble creal cfloat cdouble
syn keyword dDebug        deprecated unittest
syn keyword dExceptions        throw try catch finally
syn keyword dScopeDecl        public protected private export
syn keyword dStatement        version debug return with invariant body scope
syn keyword dStatement        in out inout asm mixin lazy ref macro
syn keyword dStatement        function delegate __traits
syn keyword dStorageClass    auto static override final const abstract volatile
syn keyword dStorageClass    synchronized
syn keyword dPragma        pragma

if exists("d_hl_string_types")
  syn keyword dStringType        string wstring dstring

" Assert is a statement and a module name.
syn match dAssert "^assert\>"
syn match dAssert "[^.]\s*\<assert\>"ms=s+1

" dTokens is used by the token string highlighting
syn cluster dTokens contains=dExternal,dConditional,dBranch,dRepeat,dBoolean
syn cluster dTokens add=dConstant,dTypedef,dStructure,dOperator,dOpOverload
syn cluster dTokens add=dType,dDebug,dExceptions,dScopeDecl,dStatement
syn cluster dTokens add=dStorageClass,dPragma,dAssert

" Marks contents of the asm statment body as special
"syn match dAsmStatement "\<asm\>"
"syn region dAsmBody start="asm[\n]*\s*{"hs=e+1 end="}"he=e-1 contains=dAsmStatement
"hi def link dAsmBody dUnicode
"hi def link dAsmStatement dStatement

" Labels
" We contain dScopeDecl so public: private: etc. are not highlighted like labels
syn match dUserLabel    "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=dLabel,dScopeDecl,dEnum
syn keyword dLabel    case default

syn cluster dTokens add=dUserLabel,dLabel

" Comments
syn keyword dTodo    contained TODO FIXME TEMP XXX BUG
syn match dCommentStar    contained "^\s*\*[^/]"me=e-1
syn match dCommentStar    contained "^\s*\*$"
syn match dCommentPlus    contained "^\s*+[^/]"me=e-1
syn match dCommentPlus    contained "^\s*+$"
if exists("d_comment_strings")
  syn region dBlockCommentString    contained start=+"+ end=+"+ end=+\*/+me=s-1,he=s-1 contains=dCommentStar,dUnicode,dEscSequence,@Spell
  syn region dNestedCommentString    contained start=+"+ end=+"+ end="+"me=s-1,he=s-1 contains=dCommentPlus,dUnicode,dEscSequence,@Spell
  syn region dLineCommentString        contained start=+"+ end=+$\|"+ contains=dUnicode,dEscSequence,@Spell
  syn region dBlockComment    start="/\*"  end="\*/" contains=dBlockCommentString,dTodo,@Spell
  syn region dNestedComment    start="/+"  end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell
  syn match  dLineComment    "//.*" contains=dLineCommentString,dTodo,@Spell
  syn region dBlockComment    start="/\*"  end="\*/" contains=dBlockCommentString,dTodo,@Spell
  syn region dNestedComment    start="/+"  end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell
  syn match  dLineComment    "//.*" contains=dLineCommentString,dTodo,@Spell

hi link dLineCommentString    dBlockCommentString
hi link dBlockCommentString    dString
hi link dNestedCommentString    dString
hi link dCommentStar        dBlockComment
hi link dCommentPlus        dNestedComment

syn cluster dTokens add=dBlockComment,dNestedComment,dLineComment

" /+ +/ style comments and strings that span multiple lines can cause
" problems. To play it safe, set minlines to a large number.
syn sync minlines=200
" Use ccomment for /* */ style comments
syn sync ccomment dBlockComment

" Characters
syn match dSpecialCharError contained "[^']"

" Escape sequences (oct,specal char,hex,wchar, character entities \&xxx;)
" These are not contained because they are considered string literals.
syn match dEscSequence    "\\\(\o\{1,3}\|[\"\\'\\?ntbrfva]\|u\x\{4}\|U\x\{8}\|x\x\x\)"
syn match dEscSequence "\\&[^;& \t]\+;"
syn match dCharacter    "'[^']*'" contains=dEscSequence,dSpecialCharError
syn match dCharacter    "'\\''" contains=dEscSequence
syn match dCharacter    "'[^\\]'"

syn cluster dTokens add=dEscSequence,dCharacter

" Unicode characters
syn match dUnicode "\\u\d\{4\}"

" String.
syn region dString    start=+"+ end=+"[cwd]\=+ contains=dEscSequence,@Spell
syn region dRawString    start=+`+ end=+`[cwd]\=+ contains=@Spell
syn region dRawString    start=+r"+ end=+"[cwd]\=+ contains=@Spell
syn region dHexString    start=+x"+ end=+"[cwd]\=+ contains=@Spell
syn region dDelimString    start=+q"\z(.\)+ end=+\z1"+ contains=@Spell
syn region dHereString    start=+q"\z(\I\i*\)\n+ end=+\n\z1"+ contains=@Spell

" Nesting delimited string contents
syn region dNestParenString start=+(+ end=+)+ contained transparent contains=dNestParenString,@Spell
syn region dNestBrackString start=+\[+ end=+\]+ contained transparent contains=dNestBrackString,@Spell
syn region dNestAngleString start=+<+ end=+>+ contained transparent contains=dNestAngleString,@Spell
syn region dNestCurlyString start=+{+ end=+}+ contained transparent contains=dNestCurlyString,@Spell

" Nesting delimited strings
syn region dParenString    matchgroup=dParenString start=+q"(+ end=+)"+ contains=dNestParenString,@Spell
syn region dBrackString    matchgroup=dBrackString start=+q"\[+ end=+\]"+ contains=dNestBrackString,@Spell
syn region dAngleString    matchgroup=dAngleString start=+q"<+ end=+>"+ contains=dNestAngleString,@Spell
syn region dCurlyString    matchgroup=dCurlyString start=+q"{+ end=+}"+ contains=dNestCurlyString,@Spell

hi link dParenString dNestString
hi link dBrackString dNestString
hi link dAngleString dNestString
hi link dCurlyString dNestString

syn cluster dTokens add=dString,dRawString,dHexString,dDelimString,dNestString

" Token strings
syn region dNestTokenString start=+{+ end=+}+ contained contains=dNestTokenString,@dTokens
syn region dTokenString matchgroup=dTokenStringBrack transparent start=+q{+ end=+}+ contains=dNestTokenString,@dTokens

syn cluster dTokens add=dTokenString

" Numbers
syn case ignore

syn match dDec        display "\<\d[0-9_]*\(u\=l\=\|l\=u\=\)\>"

" Hex number
syn match dHex        display "\<0x[0-9a-f_]\+\(u\=l\=\|l\=u\=\)\>"

syn match dOctal    display "\<0[0-7_]\+\(u\=l\=\|l\=u\=\)\>"
" flag an octal number with wrong digits
syn match dOctalError    display "\<0[0-7_]*[89][0-9_]*"

" binary numbers
syn match dBinary    display "\<0b[01_]\+\(u\=l\=\|l\=u\=\)\>"

"floating point without the dot
syn match dFloat    display "\<\d[0-9_]*\(fi\=\|l\=i\)\>"
"floating point number, with dot, optional exponent
syn match dFloat    display "\<\d[0-9_]*\.[0-9_]*\(e[-+]\=[0-9_]\+\)\=[fl]\=i\="
"floating point number, starting with a dot, optional exponent
syn match dFloat    display "\(\.[0-9_]\+\)\(e[-+]\=[0-9_]\+\)\=[fl]\=i\=\>"
"floating point number, without dot, with exponent
"syn match dFloat    display "\<\d\+e[-+]\=\d\+[fl]\=\>"
syn match dFloat    display "\<\d[0-9_]*e[-+]\=[0-9_]\+[fl]\=\>"

"floating point without the dot
syn match dHexFloat    display "\<0x[0-9a-f_]\+\(fi\=\|l\=i\)\>"
"floating point number, with dot, optional exponent
syn match dHexFloat    display "\<0x[0-9a-f_]\+\.[0-9a-f_]*\(p[-+]\=[0-9_]\+\)\=[fl]\=i\="
"floating point number, without dot, with exponent
syn match dHexFloat    display "\<0x[0-9a-f_]\+p[-+]\=[0-9_]\+[fl]\=i\=\>"

syn cluster dTokens add=dDec,dHex,dOctal,dOctalError,dBinary,dFloat,dHexFloat

syn case match

" Pragma (preprocessor) support
" TODO: Highlight following Integer and optional Filespec.
syn region  dPragma start="#\s*\(line\>\)" skip="\\$" end="$"

" The default highlighting.
hi def link dBinary        Number
hi def link dDec        Number
hi def link dHex        Number
hi def link dOctal        Number
hi def link dFloat        Float
hi def link dHexFloat        Float
hi def link dDebug        Debug
hi def link dBranch        Conditional
hi def link dConditional    Conditional
hi def link dLabel        Label
hi def link dUserLabel        Label
hi def link dRepeat        Repeat
hi def link dExceptions        Exception
hi def link dAssert        Statement
hi def link dStatement        Statement
hi def link dScopeDecl        dStorageClass
hi def link dStorageClass    StorageClass
hi def link dBoolean        Boolean
hi def link dUnicode        Special
hi def link dTokenStringBrack    String
hi def link dHereString        String
hi def link dNestString        String
hi def link dDelimString    String
hi def link dRawString        String
hi def link dString        String
hi def link dHexString        String
hi def link dCharacter        Character
hi def link dEscSequence    SpecialChar
hi def link dSpecialCharError    Error
hi def link dOctalError        Error
hi def link dOperator        Operator
hi def link dOpOverload        Identifier
hi def link dStringType        Identifier
hi def link dConstant        Constant
hi def link dTypedef        Typedef
hi def link dEnum        Structure
hi def link dStructure        Structure
hi def link dTodo        Todo
hi def link dType        Type
hi def link dLineComment    Comment
hi def link dBlockComment    Comment
hi def link dNestedComment    Comment
hi def link dExternal        Include
hi def link dPragma        PreProc

let b:current_syntax = "d"
" vim: ts=8 noet


    (some replies deleted)