xref: /vim-8.2.3635/runtime/syntax/rust.vim (revision 3c2881dc)
1*3c2881dcSBram Moolenaar" Vim syntax file
2*3c2881dcSBram Moolenaar" Language:     Rust
3*3c2881dcSBram Moolenaar" Maintainer:   Patrick Walton <[email protected]>
4*3c2881dcSBram Moolenaar" Maintainer:   Ben Blum <[email protected]>
5*3c2881dcSBram Moolenaar" Maintainer:   Chris Morgan <[email protected]>
6*3c2881dcSBram Moolenaar" Last Change:  Feb 24, 2016
7*3c2881dcSBram Moolenaar" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
8*3c2881dcSBram Moolenaar
9*3c2881dcSBram Moolenaarif version < 600
10*3c2881dcSBram Moolenaar	syntax clear
11*3c2881dcSBram Moolenaarelseif exists("b:current_syntax")
12*3c2881dcSBram Moolenaar	finish
13*3c2881dcSBram Moolenaarendif
14*3c2881dcSBram Moolenaar
15*3c2881dcSBram Moolenaar" Syntax definitions {{{1
16*3c2881dcSBram Moolenaar" Basic keywords {{{2
17*3c2881dcSBram Moolenaarsyn keyword   rustConditional match if else
18*3c2881dcSBram Moolenaarsyn keyword   rustRepeat for loop while
19*3c2881dcSBram Moolenaarsyn keyword   rustTypedef type nextgroup=rustIdentifier skipwhite skipempty
20*3c2881dcSBram Moolenaarsyn keyword   rustStructure struct enum nextgroup=rustIdentifier skipwhite skipempty
21*3c2881dcSBram Moolenaarsyn keyword   rustUnion union nextgroup=rustIdentifier skipwhite skipempty contained
22*3c2881dcSBram Moolenaarsyn match rustUnionContextual /\<union\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*/ transparent contains=rustUnion
23*3c2881dcSBram Moolenaarsyn keyword   rustOperator    as
24*3c2881dcSBram Moolenaar
25*3c2881dcSBram Moolenaarsyn match     rustAssert      "\<assert\(\w\)*!" contained
26*3c2881dcSBram Moolenaarsyn match     rustPanic       "\<panic\(\w\)*!" contained
27*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     break
28*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     box nextgroup=rustBoxPlacement skipwhite skipempty
29*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     continue
30*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
31*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     fn nextgroup=rustFuncName skipwhite skipempty
32*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     in impl let
33*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     pub nextgroup=rustPubScope skipwhite skipempty
34*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     return
35*3c2881dcSBram Moolenaarsyn keyword   rustSuper       super
36*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     unsafe where
37*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     use nextgroup=rustModPath skipwhite skipempty
38*3c2881dcSBram Moolenaar" FIXME: Scoped impl's name is also fallen in this category
39*3c2881dcSBram Moolenaarsyn keyword   rustKeyword     mod trait nextgroup=rustIdentifier skipwhite skipempty
40*3c2881dcSBram Moolenaarsyn keyword   rustStorage     move mut ref static const
41*3c2881dcSBram Moolenaarsyn match rustDefault /\<default\ze\_s\+\(impl\|fn\|type\|const\)\>/
42*3c2881dcSBram Moolenaar
43*3c2881dcSBram Moolenaarsyn keyword   rustInvalidBareKeyword crate
44*3c2881dcSBram Moolenaar
45*3c2881dcSBram Moolenaarsyn keyword rustPubScopeCrate crate contained
46*3c2881dcSBram Moolenaarsyn match rustPubScopeDelim /[()]/ contained
47*3c2881dcSBram Moolenaarsyn match rustPubScope /([^()]*)/ contained contains=rustPubScopeDelim,rustPubScopeCrate,rustSuper,rustModPath,rustModPathSep,rustSelf transparent
48*3c2881dcSBram Moolenaar
49*3c2881dcSBram Moolenaarsyn keyword   rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty
50*3c2881dcSBram Moolenaar" This is to get the `bar` part of `extern crate "foo" as bar;` highlighting.
51*3c2881dcSBram Moolenaarsyn match   rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator
52*3c2881dcSBram Moolenaarsyn keyword   rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty
53*3c2881dcSBram Moolenaar
54*3c2881dcSBram Moolenaarsyn match     rustIdentifier  contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
55*3c2881dcSBram Moolenaarsyn match     rustFuncName    "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
56*3c2881dcSBram Moolenaar
57*3c2881dcSBram Moolenaarsyn region    rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained
58*3c2881dcSBram Moolenaar" Ideally we'd have syntax rules set up to match arbitrary expressions. Since
59*3c2881dcSBram Moolenaar" we don't, we'll just define temporary contained rules to handle balancing
60*3c2881dcSBram Moolenaar" delimiters.
61*3c2881dcSBram Moolenaarsyn region    rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent
62*3c2881dcSBram Moolenaarsyn region    rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent
63*3c2881dcSBram Moolenaar" {} are handled by rustFoldBraces
64*3c2881dcSBram Moolenaar
65*3c2881dcSBram Moolenaarsyn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount
66*3c2881dcSBram Moolenaarsyn match rustMacroRepeatCount ".\?[*+]" contained
67*3c2881dcSBram Moolenaarsyn match rustMacroVariable "$\w\+"
68*3c2881dcSBram Moolenaar
69*3c2881dcSBram Moolenaar" Reserved (but not yet used) keywords {{{2
70*3c2881dcSBram Moolenaarsyn keyword   rustReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized yield abstract virtual final override macro
71*3c2881dcSBram Moolenaar
72*3c2881dcSBram Moolenaar" Built-in types {{{2
73*3c2881dcSBram Moolenaarsyn keyword   rustType        isize usize char bool u8 u16 u32 u64 u128 f32
74*3c2881dcSBram Moolenaarsyn keyword   rustType        f64 i8 i16 i32 i64 i128 str Self
75*3c2881dcSBram Moolenaar
76*3c2881dcSBram Moolenaar" Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2
77*3c2881dcSBram Moolenaar" This section is just straight transformation of the contents of the prelude,
78*3c2881dcSBram Moolenaar" to make it easy to update.
79*3c2881dcSBram Moolenaar
80*3c2881dcSBram Moolenaar" Reexported core operators {{{3
81*3c2881dcSBram Moolenaarsyn keyword   rustTrait       Copy Send Sized Sync
82*3c2881dcSBram Moolenaarsyn keyword   rustTrait       Drop Fn FnMut FnOnce
83*3c2881dcSBram Moolenaar
84*3c2881dcSBram Moolenaar" Reexported functions {{{3
85*3c2881dcSBram Moolenaar" There’s no point in highlighting these; when one writes drop( or drop::< it
86*3c2881dcSBram Moolenaar" gets the same highlighting anyway, and if someone writes `let drop = …;` we
87*3c2881dcSBram Moolenaar" don’t really want *that* drop to be highlighted.
88*3c2881dcSBram Moolenaar"syn keyword rustFunction drop
89*3c2881dcSBram Moolenaar
90*3c2881dcSBram Moolenaar" Reexported types and traits {{{3
91*3c2881dcSBram Moolenaarsyn keyword rustTrait Box
92*3c2881dcSBram Moolenaarsyn keyword rustTrait ToOwned
93*3c2881dcSBram Moolenaarsyn keyword rustTrait Clone
94*3c2881dcSBram Moolenaarsyn keyword rustTrait PartialEq PartialOrd Eq Ord
95*3c2881dcSBram Moolenaarsyn keyword rustTrait AsRef AsMut Into From
96*3c2881dcSBram Moolenaarsyn keyword rustTrait Default
97*3c2881dcSBram Moolenaarsyn keyword rustTrait Iterator Extend IntoIterator
98*3c2881dcSBram Moolenaarsyn keyword rustTrait DoubleEndedIterator ExactSizeIterator
99*3c2881dcSBram Moolenaarsyn keyword rustEnum Option
100*3c2881dcSBram Moolenaarsyn keyword rustEnumVariant Some None
101*3c2881dcSBram Moolenaarsyn keyword rustEnum Result
102*3c2881dcSBram Moolenaarsyn keyword rustEnumVariant Ok Err
103*3c2881dcSBram Moolenaarsyn keyword rustTrait SliceConcatExt
104*3c2881dcSBram Moolenaarsyn keyword rustTrait String ToString
105*3c2881dcSBram Moolenaarsyn keyword rustTrait Vec
106*3c2881dcSBram Moolenaar
107*3c2881dcSBram Moolenaar" Other syntax {{{2
108*3c2881dcSBram Moolenaarsyn keyword   rustSelf        self
109*3c2881dcSBram Moolenaarsyn keyword   rustBoolean     true false
110*3c2881dcSBram Moolenaar
111*3c2881dcSBram Moolenaar" If foo::bar changes to foo.bar, change this ("::" to "\.").
112*3c2881dcSBram Moolenaar" If foo::bar changes to Foo::bar, change this (first "\w" to "\u").
113*3c2881dcSBram Moolenaarsyn match     rustModPath     "\w\(\w\)*::[^<]"he=e-3,me=e-3
114*3c2881dcSBram Moolenaarsyn match     rustModPathSep  "::"
115*3c2881dcSBram Moolenaar
116*3c2881dcSBram Moolenaarsyn match     rustFuncCall    "\w\(\w\)*("he=e-1,me=e-1
117*3c2881dcSBram Moolenaarsyn match     rustFuncCall    "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>();
118*3c2881dcSBram Moolenaar
119*3c2881dcSBram Moolenaar" This is merely a convention; note also the use of [A-Z], restricting it to
120*3c2881dcSBram Moolenaar" latin identifiers rather than the full Unicode uppercase. I have not used
121*3c2881dcSBram Moolenaar" [:upper:] as it depends upon 'noignorecase'
122*3c2881dcSBram Moolenaar"syn match     rustCapsIdent    display "[A-Z]\w\(\w\)*"
123*3c2881dcSBram Moolenaar
124*3c2881dcSBram Moolenaarsyn match     rustOperator     display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?"
125*3c2881dcSBram Moolenaar" This one isn't *quite* right, as we could have binary-& with a reference
126*3c2881dcSBram Moolenaarsyn match     rustSigil        display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1
127*3c2881dcSBram Moolenaarsyn match     rustSigil        display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1
128*3c2881dcSBram Moolenaar" This isn't actually correct; a closure with no arguments can be `|| { }`.
129*3c2881dcSBram Moolenaar" Last, because the & in && isn't a sigil
130*3c2881dcSBram Moolenaarsyn match     rustOperator     display "&&\|||"
131*3c2881dcSBram Moolenaar" This is rustArrowCharacter rather than rustArrow for the sake of matchparen,
132*3c2881dcSBram Moolenaar" so it skips the ->; see http://stackoverflow.com/a/30309949 for details.
133*3c2881dcSBram Moolenaarsyn match     rustArrowCharacter display "->"
134*3c2881dcSBram Moolenaarsyn match     rustQuestionMark display "?\([a-zA-Z]\+\)\@!"
135*3c2881dcSBram Moolenaar
136*3c2881dcSBram Moolenaarsyn match     rustMacro       '\w\(\w\)*!' contains=rustAssert,rustPanic
137*3c2881dcSBram Moolenaarsyn match     rustMacro       '#\w\(\w\)*' contains=rustAssert,rustPanic
138*3c2881dcSBram Moolenaar
139*3c2881dcSBram Moolenaarsyn match     rustEscapeError   display contained /\\./
140*3c2881dcSBram Moolenaarsyn match     rustEscape        display contained /\\\([nrt0\\'"]\|x\x\{2}\)/
141*3c2881dcSBram Moolenaarsyn match     rustEscapeUnicode display contained /\\u{\x\{1,6}}/
142*3c2881dcSBram Moolenaarsyn match     rustStringContinuation display contained /\\\n\s*/
143*3c2881dcSBram Moolenaarsyn region    rustString      start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation
144*3c2881dcSBram Moolenaarsyn region    rustString      start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell
145*3c2881dcSBram Moolenaarsyn region    rustString      start='b\?r\z(#*\)"' end='"\z1' contains=@Spell
146*3c2881dcSBram Moolenaar
147*3c2881dcSBram Moolenaarsyn region    rustAttribute   start="#!\?\[" end="\]" contains=rustString,rustDerive,rustCommentLine,rustCommentBlock,rustCommentLineDocError,rustCommentBlockDocError
148*3c2881dcSBram Moolenaarsyn region    rustDerive      start="derive(" end=")" contained contains=rustDeriveTrait
149*3c2881dcSBram Moolenaar" This list comes from src/libsyntax/ext/deriving/mod.rs
150*3c2881dcSBram Moolenaar" Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show).
151*3c2881dcSBram Moolenaarsyn keyword   rustDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy
152*3c2881dcSBram Moolenaar
153*3c2881dcSBram Moolenaar" Number literals
154*3c2881dcSBram Moolenaarsyn match     rustDecNumber   display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
155*3c2881dcSBram Moolenaarsyn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
156*3c2881dcSBram Moolenaarsyn match     rustOctNumber   display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
157*3c2881dcSBram Moolenaarsyn match     rustBinNumber   display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
158*3c2881dcSBram Moolenaar
159*3c2881dcSBram Moolenaar" Special case for numbers of the form "1." which are float literals, unless followed by
160*3c2881dcSBram Moolenaar" an identifier, which makes them integer literals with a method call or field access,
161*3c2881dcSBram Moolenaar" or by another ".", which makes them integer literals followed by the ".." token.
162*3c2881dcSBram Moolenaar" (This must go first so the others take precedence.)
163*3c2881dcSBram Moolenaarsyn match     rustFloat       display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!"
164*3c2881dcSBram Moolenaar" To mark a number as a normal float, it must have at least one of the three things integral values don't have:
165*3c2881dcSBram Moolenaar" a decimal point and more numbers; an exponent; and a type suffix.
166*3c2881dcSBram Moolenaarsyn match     rustFloat       display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\="
167*3c2881dcSBram Moolenaarsyn match     rustFloat       display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\="
168*3c2881dcSBram Moolenaarsyn match     rustFloat       display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"
169*3c2881dcSBram Moolenaar
170*3c2881dcSBram Moolenaar" For the benefit of delimitMate
171*3c2881dcSBram Moolenaarsyn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u{\x\{1,6}}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
172*3c2881dcSBram Moolenaarsyn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
173*3c2881dcSBram Moolenaarsyn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
174*3c2881dcSBram Moolenaar
175*3c2881dcSBram Moolenaar"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
176*3c2881dcSBram Moolenaarsyn match     rustLifetime    display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
177*3c2881dcSBram Moolenaarsyn match     rustLabel       display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*:"
178*3c2881dcSBram Moolenaarsyn match   rustCharacterInvalid   display contained /b\?'\zs[\n\r\t']\ze'/
179*3c2881dcSBram Moolenaar" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII).
180*3c2881dcSBram Moolenaarsyn match   rustCharacterInvalidUnicode   display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/
181*3c2881dcSBram Moolenaarsyn match   rustCharacter   /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode
182*3c2881dcSBram Moolenaarsyn match   rustCharacter   /'\([^\\]\|\\\(.\|x\x\{2}\|u{\x\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid
183*3c2881dcSBram Moolenaar
184*3c2881dcSBram Moolenaarsyn match rustShebang /\%^#![^[].*/
185*3c2881dcSBram Moolenaarsyn region rustCommentLine                                                  start="//"                      end="$"   contains=rustTodo,@Spell
186*3c2881dcSBram Moolenaarsyn region rustCommentLineDoc                                               start="//\%(//\@!\|!\)"         end="$"   contains=rustTodo,@Spell
187*3c2881dcSBram Moolenaarsyn region rustCommentLineDocError                                          start="//\%(//\@!\|!\)"         end="$"   contains=rustTodo,@Spell contained
188*3c2881dcSBram Moolenaarsyn region rustCommentBlock             matchgroup=rustCommentBlock         start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
189*3c2881dcSBram Moolenaarsyn region rustCommentBlockDoc          matchgroup=rustCommentBlockDoc      start="/\*\%(!\|\*[*/]\@!\)"    end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
190*3c2881dcSBram Moolenaarsyn region rustCommentBlockDocError     matchgroup=rustCommentBlockDocError start="/\*\%(!\|\*[*/]\@!\)"    end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained
191*3c2881dcSBram Moolenaarsyn region rustCommentBlockNest         matchgroup=rustCommentBlock         start="/\*"                     end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
192*3c2881dcSBram Moolenaarsyn region rustCommentBlockDocNest      matchgroup=rustCommentBlockDoc      start="/\*"                     end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
193*3c2881dcSBram Moolenaarsyn region rustCommentBlockDocNestError matchgroup=rustCommentBlockDocError start="/\*"                     end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained transparent
194*3c2881dcSBram Moolenaar" FIXME: this is a really ugly and not fully correct implementation. Most
195*3c2881dcSBram Moolenaar" importantly, a case like ``/* */*`` should have the final ``*`` not being in
196*3c2881dcSBram Moolenaar" a comment, but in practice at present it leaves comments open two levels
197*3c2881dcSBram Moolenaar" deep. But as long as you stay away from that particular case, I *believe*
198*3c2881dcSBram Moolenaar" the highlighting is correct. Due to the way Vim's syntax engine works
199*3c2881dcSBram Moolenaar" (greedy for start matches, unlike Rust's tokeniser which is searching for
200*3c2881dcSBram Moolenaar" the earliest-starting match, start or end), I believe this cannot be solved.
201*3c2881dcSBram Moolenaar" Oh you who would fix it, don't bother with things like duplicating the Block
202*3c2881dcSBram Moolenaar" rules and putting ``\*\@<!`` at the start of them; it makes it worse, as
203*3c2881dcSBram Moolenaar" then you must deal with cases like ``/*/**/*/``. And don't try making it
204*3c2881dcSBram Moolenaar" worse with ``\%(/\@<!\*\)\@<!``, either...
205*3c2881dcSBram Moolenaar
206*3c2881dcSBram Moolenaarsyn keyword rustTodo contained TODO FIXME XXX NB NOTE
207*3c2881dcSBram Moolenaar
208*3c2881dcSBram Moolenaar" Folding rules {{{2
209*3c2881dcSBram Moolenaar" Trivial folding rules to begin with.
210*3c2881dcSBram Moolenaar" FIXME: use the AST to make really good folding
211*3c2881dcSBram Moolenaarsyn region rustFoldBraces start="{" end="}" transparent fold
212*3c2881dcSBram Moolenaar
213*3c2881dcSBram Moolenaar" Default highlighting {{{1
214*3c2881dcSBram Moolenaarhi def link rustDecNumber       rustNumber
215*3c2881dcSBram Moolenaarhi def link rustHexNumber       rustNumber
216*3c2881dcSBram Moolenaarhi def link rustOctNumber       rustNumber
217*3c2881dcSBram Moolenaarhi def link rustBinNumber       rustNumber
218*3c2881dcSBram Moolenaarhi def link rustIdentifierPrime rustIdentifier
219*3c2881dcSBram Moolenaarhi def link rustTrait           rustType
220*3c2881dcSBram Moolenaarhi def link rustDeriveTrait     rustTrait
221*3c2881dcSBram Moolenaar
222*3c2881dcSBram Moolenaarhi def link rustMacroRepeatCount   rustMacroRepeatDelimiters
223*3c2881dcSBram Moolenaarhi def link rustMacroRepeatDelimiters   Macro
224*3c2881dcSBram Moolenaarhi def link rustMacroVariable Define
225*3c2881dcSBram Moolenaarhi def link rustSigil         StorageClass
226*3c2881dcSBram Moolenaarhi def link rustEscape        Special
227*3c2881dcSBram Moolenaarhi def link rustEscapeUnicode rustEscape
228*3c2881dcSBram Moolenaarhi def link rustEscapeError   Error
229*3c2881dcSBram Moolenaarhi def link rustStringContinuation Special
230*3c2881dcSBram Moolenaarhi def link rustString        String
231*3c2881dcSBram Moolenaarhi def link rustCharacterInvalid Error
232*3c2881dcSBram Moolenaarhi def link rustCharacterInvalidUnicode rustCharacterInvalid
233*3c2881dcSBram Moolenaarhi def link rustCharacter     Character
234*3c2881dcSBram Moolenaarhi def link rustNumber        Number
235*3c2881dcSBram Moolenaarhi def link rustBoolean       Boolean
236*3c2881dcSBram Moolenaarhi def link rustEnum          rustType
237*3c2881dcSBram Moolenaarhi def link rustEnumVariant   rustConstant
238*3c2881dcSBram Moolenaarhi def link rustConstant      Constant
239*3c2881dcSBram Moolenaarhi def link rustSelf          Constant
240*3c2881dcSBram Moolenaarhi def link rustFloat         Float
241*3c2881dcSBram Moolenaarhi def link rustArrowCharacter rustOperator
242*3c2881dcSBram Moolenaarhi def link rustOperator      Operator
243*3c2881dcSBram Moolenaarhi def link rustKeyword       Keyword
244*3c2881dcSBram Moolenaarhi def link rustTypedef       Keyword " More precise is Typedef, but it doesn't feel right for Rust
245*3c2881dcSBram Moolenaarhi def link rustStructure     Keyword " More precise is Structure
246*3c2881dcSBram Moolenaarhi def link rustUnion         rustStructure
247*3c2881dcSBram Moolenaarhi def link rustPubScopeDelim Delimiter
248*3c2881dcSBram Moolenaarhi def link rustPubScopeCrate rustKeyword
249*3c2881dcSBram Moolenaarhi def link rustSuper         rustKeyword
250*3c2881dcSBram Moolenaarhi def link rustReservedKeyword Error
251*3c2881dcSBram Moolenaarhi def link rustRepeat        Conditional
252*3c2881dcSBram Moolenaarhi def link rustConditional   Conditional
253*3c2881dcSBram Moolenaarhi def link rustIdentifier    Identifier
254*3c2881dcSBram Moolenaarhi def link rustCapsIdent     rustIdentifier
255*3c2881dcSBram Moolenaarhi def link rustModPath       Include
256*3c2881dcSBram Moolenaarhi def link rustModPathSep    Delimiter
257*3c2881dcSBram Moolenaarhi def link rustFunction      Function
258*3c2881dcSBram Moolenaarhi def link rustFuncName      Function
259*3c2881dcSBram Moolenaarhi def link rustFuncCall      Function
260*3c2881dcSBram Moolenaarhi def link rustShebang       Comment
261*3c2881dcSBram Moolenaarhi def link rustCommentLine   Comment
262*3c2881dcSBram Moolenaarhi def link rustCommentLineDoc SpecialComment
263*3c2881dcSBram Moolenaarhi def link rustCommentLineDocError Error
264*3c2881dcSBram Moolenaarhi def link rustCommentBlock  rustCommentLine
265*3c2881dcSBram Moolenaarhi def link rustCommentBlockDoc rustCommentLineDoc
266*3c2881dcSBram Moolenaarhi def link rustCommentBlockDocError Error
267*3c2881dcSBram Moolenaarhi def link rustAssert        PreCondit
268*3c2881dcSBram Moolenaarhi def link rustPanic         PreCondit
269*3c2881dcSBram Moolenaarhi def link rustMacro         Macro
270*3c2881dcSBram Moolenaarhi def link rustType          Type
271*3c2881dcSBram Moolenaarhi def link rustTodo          Todo
272*3c2881dcSBram Moolenaarhi def link rustAttribute     PreProc
273*3c2881dcSBram Moolenaarhi def link rustDerive        PreProc
274*3c2881dcSBram Moolenaarhi def link rustDefault       StorageClass
275*3c2881dcSBram Moolenaarhi def link rustStorage       StorageClass
276*3c2881dcSBram Moolenaarhi def link rustObsoleteStorage Error
277*3c2881dcSBram Moolenaarhi def link rustLifetime      Special
278*3c2881dcSBram Moolenaarhi def link rustLabel         Label
279*3c2881dcSBram Moolenaarhi def link rustInvalidBareKeyword Error
280*3c2881dcSBram Moolenaarhi def link rustExternCrate   rustKeyword
281*3c2881dcSBram Moolenaarhi def link rustObsoleteExternMod Error
282*3c2881dcSBram Moolenaarhi def link rustBoxPlacementParens Delimiter
283*3c2881dcSBram Moolenaarhi def link rustQuestionMark  Special
284*3c2881dcSBram Moolenaar
285*3c2881dcSBram Moolenaar" Other Suggestions:
286*3c2881dcSBram Moolenaar" hi rustAttribute ctermfg=cyan
287*3c2881dcSBram Moolenaar" hi rustDerive ctermfg=cyan
288*3c2881dcSBram Moolenaar" hi rustAssert ctermfg=yellow
289*3c2881dcSBram Moolenaar" hi rustPanic ctermfg=red
290*3c2881dcSBram Moolenaar" hi rustMacro ctermfg=magenta
291*3c2881dcSBram Moolenaar
292*3c2881dcSBram Moolenaarsyn sync minlines=200
293*3c2881dcSBram Moolenaarsyn sync maxlines=500
294*3c2881dcSBram Moolenaar
295*3c2881dcSBram Moolenaarlet b:current_syntax = "rust"
296