xref: /vim-8.2.3635/runtime/syntax/d.vim (revision 044b68f4)
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