3 " Maintainer: Patrick Walton <pcwalton@mozilla.com>
4 " Maintainer: Ben Blum <bblum@cs.cmu.edu>
5 " Maintainer: Chris Morgan <me@chrismorgan.info>
6 " Last Change: 2014 Feb 27
10 elseif exists("b:current_syntax")
14 " Syntax definitions {{{1
16 syn keyword rustConditional match if else
17 syn keyword rustOperator as
19 syn match rustAssert "\<assert\(\w\)*!" contained
20 syn match rustFail "\<fail\(\w\)*!" contained
21 syn keyword rustKeyword break
22 syn keyword rustKeyword box nextgroup=rustBoxPlacement skipwhite skipempty
23 syn keyword rustKeyword continue
24 syn keyword rustKeyword extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
25 syn keyword rustKeyword fn nextgroup=rustFuncName skipwhite skipempty
26 syn keyword rustKeyword for in if impl let
27 syn keyword rustKeyword loop once proc pub
28 syn keyword rustKeyword return super
29 syn keyword rustKeyword unsafe virtual while
30 syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty
31 " FIXME: Scoped impl's name is also fallen in this category
32 syn keyword rustKeyword mod trait struct enum type nextgroup=rustIdentifier skipwhite skipempty
33 syn keyword rustStorage mut ref static
34 syn keyword rustObsoleteStorage const
36 syn keyword rustInvalidBareKeyword crate
38 syn keyword rustExternCrate crate contained nextgroup=rustIdentifier skipwhite skipempty
39 syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty
41 syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
42 syn match rustFuncName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
44 syn region rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained
45 syn keyword rustBoxPlacementExpr GC containedin=rustBoxPlacement
46 " Ideally we'd have syntax rules set up to match arbitrary expressions. Since
47 " we don't, we'll just define temporary contained rules to handle balancing
49 syn region rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent
50 syn region rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent
51 " {} are handled by rustFoldBraces
53 " Reserved (but not yet used) keywords {{{2
54 syn keyword rustReservedKeyword alignof be do offsetof priv pure sizeof typeof unsized yield
57 syn keyword rustType int uint float char bool u8 u16 u32 u64 f32
58 syn keyword rustType f64 i8 i16 i32 i64 str Self
60 " Things from the prelude (src/libstd/prelude.rs) {{{2
61 " This section is just straight transformation of the contents of the prelude,
62 " to make it easy to update.
65 syn keyword rustTrait Copy Send Sized Share
66 syn keyword rustTrait Add Sub Mul Div Rem Neg Not
67 syn keyword rustTrait BitAnd BitOr BitXor
68 syn keyword rustTrait Drop Deref DerefMut
69 syn keyword rustTrait Shl Shr Index
70 syn keyword rustEnum Option
71 syn keyword rustEnumVariant Some None
72 syn keyword rustEnum Result
73 syn keyword rustEnumVariant Ok Err
76 "syn keyword rustFunction from_str
77 "syn keyword rustFunction range
78 "syn keyword rustFunction drop
80 " Types and traits {{{3
81 syn keyword rustTrait Ascii AsciiCast OwnedAsciiCast AsciiStr IntoBytes
82 syn keyword rustTrait ToCStr
83 syn keyword rustTrait Char
84 syn keyword rustTrait Clone
85 syn keyword rustTrait Eq Ord TotalEq TotalOrd Ordering Equiv
86 syn keyword rustEnumVariant Less Equal Greater
87 syn keyword rustTrait Container Mutable Map MutableMap Set MutableSet
88 syn keyword rustTrait FromIterator Extendable
89 syn keyword rustTrait Iterator DoubleEndedIterator RandomAccessIterator CloneableIterator
90 syn keyword rustTrait OrdIterator MutableDoubleEndedIterator ExactSize
91 syn keyword rustTrait Num NumCast CheckedAdd CheckedSub CheckedMul
92 syn keyword rustTrait Signed Unsigned
93 syn keyword rustTrait Primitive Int Float FloatMath ToPrimitive FromPrimitive
94 "syn keyword rustTrait Expect
95 syn keyword rustTrait Box
96 syn keyword rustTrait GenericPath Path PosixPath WindowsPath
97 syn keyword rustTrait RawPtr
98 syn keyword rustTrait Buffer Writer Reader Seek
99 syn keyword rustTrait Str StrVector StrSlice OwnedStr IntoMaybeOwned
100 syn keyword rustTrait StrAllocating
101 syn keyword rustTrait ToStr IntoStr
102 syn keyword rustTrait Tuple1 Tuple2 Tuple3 Tuple4
103 syn keyword rustTrait Tuple5 Tuple6 Tuple7 Tuple8
104 syn keyword rustTrait Tuple9 Tuple10 Tuple11 Tuple12
105 syn keyword rustTrait CloneableVector ImmutableCloneableVector MutableCloneableVector
106 syn keyword rustTrait ImmutableVector MutableVector
107 syn keyword rustTrait ImmutableEqVector ImmutableTotalOrdVector MutableTotalOrdVector
108 syn keyword rustTrait Vector VectorVector OwnedVector MutableVectorAllocating
109 syn keyword rustTrait String
110 syn keyword rustTrait Vec
112 "syn keyword rustFunction sync_channel channel
113 syn keyword rustTrait SyncSender Sender Receiver
114 "syn keyword rustFunction spawn
116 "syn keyword rustConstant GC
118 syn keyword rustSelf self
119 syn keyword rustBoolean true false
123 " If foo::bar changes to foo.bar, change this ("::" to "\.").
124 " If foo::bar changes to Foo::bar, change this (first "\w" to "\u").
125 syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3
126 syn match rustModPath "\w\(\w\)*" contained " only for 'use path;'
127 syn match rustModPathSep "::"
129 syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1
130 syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>();
132 " This is merely a convention; note also the use of [A-Z], restricting it to
133 " latin identifiers rather than the full Unicode uppercase. I have not used
134 " [:upper:] as it depends upon 'noignorecase'
135 "syn match rustCapsIdent display "[A-Z]\w\(\w\)*"
137 syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?"
138 " This one isn't *quite* right, as we could have binary-& with a reference
139 syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1
140 syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1
141 " This isn't actually correct; a closure with no arguments can be `|| { }`.
142 " Last, because the & in && isn't a sigil
143 syn match rustOperator display "&&\|||"
145 syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustFail
146 syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustFail
148 syn match rustSpecialError display contained /\\./
149 syn match rustSpecial display contained /\\\([nrt0\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)/
150 syn match rustStringContinuation display contained /\\\n\s*/
151 syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustSpecial,rustSpecialError,rustStringContinuation,@Spell
152 syn region rustString start='r\z(#*\)"' end='"\z1' contains=@Spell
154 syn region rustAttribute start="#!\?\[" end="\]" contains=rustString,rustDeriving
155 syn region rustDeriving start="deriving(" end=")" contained contains=rustTrait
158 syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(8\|16\|32\|64\)\=\)\="
159 syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(8\|16\|32\|64\)\=\)\="
160 syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(8\|16\|32\|64\)\=\)\="
161 syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(8\|16\|32\|64\)\=\)\="
163 " Special case for numbers of the form "1." which are float literals, unless followed by
164 " an identifier, which makes them integer literals with a method call or field access.
165 " (This must go first so the others take precedence.)
166 syn match rustFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\@!"
167 " To mark a number as a normal float, it must have at least one of the three things integral values don't have:
168 " a decimal point and more numbers; an exponent; and a type suffix.
169 syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\="
170 syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\="
171 syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"
173 " For the benefit of delimitMate
174 syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
175 syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
176 syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
178 "rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
179 syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
180 syn match rustCharacter /'\([^'\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustSpecial,rustSpecialError
182 syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
183 syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
184 syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
185 syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
186 syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
187 syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
188 " FIXME: this is a really ugly and not fully correct implementation. Most
189 " importantly, a case like ``/* */*`` should have the final ``*`` not being in
190 " a comment, but in practice at present it leaves comments open two levels
191 " deep. But as long as you stay away from that particular case, I *believe*
192 " the highlighting is correct. Due to the way Vim's syntax engine works
193 " (greedy for start matches, unlike Rust's tokeniser which is searching for
194 " the earliest-starting match, start or end), I believe this cannot be solved.
195 " Oh you who would fix it, don't bother with things like duplicating the Block
196 " rules and putting ``\*\@<!`` at the start of them; it makes it worse, as
197 " then you must deal with cases like ``/*/**/*/``. And don't try making it
198 " worse with ``\%(/\@<!\*\)\@<!``, either...
200 syn keyword rustTodo contained TODO FIXME XXX NB NOTE
203 " Trivial folding rules to begin with.
204 " TODO: use the AST to make really good folding
205 syn region rustFoldBraces start="{" end="}" transparent fold
206 " If you wish to enable this, setlocal foldmethod=syntax
207 " It's not enabled by default as it would drive some people mad.
209 " Default highlighting {{{1
210 hi def link rustDecNumber rustNumber
211 hi def link rustHexNumber rustNumber
212 hi def link rustOctNumber rustNumber
213 hi def link rustBinNumber rustNumber
214 hi def link rustIdentifierPrime rustIdentifier
215 hi def link rustTrait rustType
217 hi def link rustSigil StorageClass
218 hi def link rustSpecial Special
219 hi def link rustSpecialError Error
220 hi def link rustStringContinuation Special
221 hi def link rustString String
222 hi def link rustCharacter Character
223 hi def link rustNumber Number
224 hi def link rustBoolean Boolean
225 hi def link rustEnum rustType
226 hi def link rustEnumVariant rustConstant
227 hi def link rustConstant Constant
228 hi def link rustSelf Constant
229 hi def link rustFloat Float
230 hi def link rustOperator Operator
231 hi def link rustKeyword Keyword
232 hi def link rustReservedKeyword Error
233 hi def link rustConditional Conditional
234 hi def link rustIdentifier Identifier
235 hi def link rustCapsIdent rustIdentifier
236 hi def link rustModPath Include
237 hi def link rustModPathSep Delimiter
238 hi def link rustFunction Function
239 hi def link rustFuncName Function
240 hi def link rustFuncCall Function
241 hi def link rustCommentLine Comment
242 hi def link rustCommentLineDoc SpecialComment
243 hi def link rustCommentBlock rustCommentLine
244 hi def link rustCommentBlockDoc rustCommentLineDoc
245 hi def link rustAssert PreCondit
246 hi def link rustFail PreCondit
247 hi def link rustMacro Macro
248 hi def link rustType Type
249 hi def link rustTodo Todo
250 hi def link rustAttribute PreProc
251 hi def link rustDeriving PreProc
252 hi def link rustStorage StorageClass
253 hi def link rustObsoleteStorage Error
254 hi def link rustLifetime Special
255 hi def link rustInvalidBareKeyword Error
256 hi def link rustExternCrate rustKeyword
257 hi def link rustObsoleteExternMod Error
258 hi def link rustBoxPlacementParens Delimiter
259 hi def link rustBoxPlacementExpr rustKeyword
262 " hi rustAttribute ctermfg=cyan
263 " hi rustDeriving ctermfg=cyan
264 " hi rustAssert ctermfg=yellow
265 " hi rustFail ctermfg=red
266 " hi rustMacro ctermfg=magenta
268 syn sync minlines=200
269 syn sync maxlines=500
271 let b:current_syntax = "rust"