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