rust.vim (22785B)
1 " Vim syntax file 2 " Language: Rust 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: 2023-09-11 7 " For bugs, patches and license go to https://github.com/rust-lang/rust.vim 8 9 if version < 600 10 syntax clear 11 elseif exists("b:current_syntax") 12 finish 13 endif 14 15 " Syntax definitions {{{1 16 " Basic keywords {{{2 17 syn keyword rustConditional match if else 18 syn keyword rustRepeat loop while 19 " `:syn match` must be used to prioritize highlighting `for` keyword. 20 syn match rustRepeat /\<for\>/ 21 " Highlight `for` keyword in `impl ... for ... {}` statement. This line must 22 " be put after previous `syn match` line to overwrite it. 23 syn match rustKeyword /\%(\<impl\>.\+\)\@<=\<for\>/ 24 syn keyword rustRepeat in 25 syn keyword rustTypedef type nextgroup=rustIdentifier skipwhite skipempty 26 syn keyword rustStructure struct enum nextgroup=rustIdentifier skipwhite skipempty 27 syn keyword rustUnion union nextgroup=rustIdentifier skipwhite skipempty contained 28 syn match rustUnionContextual /\<union\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*/ transparent contains=rustUnion 29 syn keyword rustOperator as 30 syn keyword rustExistential existential nextgroup=rustTypedef skipwhite skipempty contained 31 syn match rustExistentialContextual /\<existential\_s\+type/ transparent contains=rustExistential,rustTypedef 32 33 syn match rustAssert "\<assert\(\w\)*!" contained 34 syn match rustPanic "\<panic\(\w\)*!" contained 35 syn match rustAsync "\<async\%(\s\|\n\)\@=" 36 syn keyword rustKeyword break 37 syn keyword rustKeyword box 38 syn keyword rustKeyword continue 39 syn keyword rustKeyword crate 40 syn keyword rustKeyword extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty 41 syn keyword rustKeyword fn nextgroup=rustFuncName skipwhite skipempty 42 syn keyword rustKeyword impl let 43 syn keyword rustKeyword macro 44 syn keyword rustKeyword pub nextgroup=rustPubScope skipwhite skipempty 45 syn keyword rustKeyword return 46 syn keyword rustKeyword yield 47 syn keyword rustSuper super 48 syn keyword rustKeyword where 49 syn keyword rustUnsafeKeyword unsafe 50 syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty 51 " FIXME: Scoped impl's name is also fallen in this category 52 syn keyword rustKeyword mod trait nextgroup=rustIdentifier skipwhite skipempty 53 syn keyword rustStorage move mut ref static const 54 syn match rustDefault /\<default\ze\_s\+\(impl\|fn\|type\|const\)\>/ 55 syn keyword rustAwait await 56 syn match rustKeyword /\<try\>!\@!/ display 57 58 syn keyword rustPubScopeCrate crate contained 59 syn match rustPubScopeDelim /[()]/ contained 60 syn match rustPubScope /([^()]*)/ contained contains=rustPubScopeDelim,rustPubScopeCrate,rustSuper,rustModPath,rustModPathSep,rustSelf transparent 61 62 syn keyword rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty 63 " This is to get the `bar` part of `extern crate "foo" as bar;` highlighting. 64 syn match rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator 65 syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty 66 67 syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained 68 syn match rustFuncName "\%(r#\)\=\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained 69 70 syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end="),\=[*+]" contains=TOP 71 syn match rustMacroVariable "$\w\+" 72 syn match rustRawIdent "\<r#\h\w*" contains=NONE 73 74 " Reserved (but not yet used) keywords {{{2 75 syn keyword rustReservedKeyword become do priv typeof unsized abstract virtual final override 76 77 " Built-in types {{{2 78 syn keyword rustType isize usize char bool u8 u16 u32 u64 u128 f32 79 syn keyword rustType f64 i8 i16 i32 i64 i128 str Self 80 81 " Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2 82 " This section is just straight transformation of the contents of the prelude, 83 " to make it easy to update. 84 85 " Reexported core operators {{{3 86 syn keyword rustTrait Copy Send Sized Sync 87 syn keyword rustTrait Drop Fn FnMut FnOnce 88 89 " Reexported functions {{{3 90 " There’s no point in highlighting these; when one writes drop( or drop::< it 91 " gets the same highlighting anyway, and if someone writes `let drop = …;` we 92 " don’t really want *that* drop to be highlighted. 93 "syn keyword rustFunction drop 94 95 " Reexported types and traits {{{3 96 syn keyword rustTrait Box 97 syn keyword rustTrait ToOwned 98 syn keyword rustTrait Clone 99 syn keyword rustTrait PartialEq PartialOrd Eq Ord 100 syn keyword rustTrait AsRef AsMut Into From 101 syn keyword rustTrait Default 102 syn keyword rustTrait Iterator Extend IntoIterator 103 syn keyword rustTrait DoubleEndedIterator ExactSizeIterator 104 syn keyword rustEnum Option 105 syn keyword rustEnumVariant Some None 106 syn keyword rustEnum Result 107 syn keyword rustEnumVariant Ok Err 108 syn keyword rustTrait SliceConcatExt 109 syn keyword rustTrait String ToString 110 syn keyword rustTrait Vec 111 112 " Other syntax {{{2 113 syn keyword rustSelf self 114 syn keyword rustBoolean true false 115 116 " If foo::bar changes to foo.bar, change this ("::" to "\."). 117 " If foo::bar changes to Foo::bar, change this (first "\w" to "\u"). 118 syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3 119 syn match rustModPathSep "::" 120 121 syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1 122 syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>(); 123 124 " This is merely a convention; note also the use of [A-Z], restricting it to 125 " latin identifiers rather than the full Unicode uppercase. I have not used 126 " [:upper:] as it depends upon 'noignorecase' 127 "syn match rustCapsIdent display "[A-Z]\w\(\w\)*" 128 129 syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?" 130 " This one isn't *quite* right, as we could have binary-& with a reference 131 syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1 132 syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1 133 " This isn't actually correct; a closure with no arguments can be `|| { }`. 134 " Last, because the & in && isn't a sigil 135 syn match rustOperator display "&&\|||" 136 " This is rustArrowCharacter rather than rustArrow for the sake of matchparen, 137 " so it skips the ->; see http://stackoverflow.com/a/30309949 for details. 138 syn match rustArrowCharacter display "->" 139 syn match rustQuestionMark display "?\([a-zA-Z]\+\)\@!" 140 141 syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustPanic 142 syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic 143 144 syn match rustEscapeError display contained /\\./ 145 syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/ 146 syn match rustEscapeUnicode display contained /\\u{\%(\x_*\)\{1,6}}/ 147 syn match rustStringContinuation display contained /\\\n\s*/ 148 syn region rustString matchgroup=rustStringDelimiter start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation 149 syn region rustString matchgroup=rustStringDelimiter start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell 150 syn region rustString matchgroup=rustStringDelimiter start='b\?r\z(#*\)"' end='"\z1' contains=@Spell 151 152 " Match attributes with either arbitrary syntax or special highlighting for 153 " derives. We still highlight strings and comments inside of the attribute. 154 syn region rustAttribute start="#!\?\[" end="\]" contains=@rustAttributeContents,rustAttributeParenthesizedParens,rustAttributeParenthesizedCurly,rustAttributeParenthesizedBrackets,rustDerive 155 syn region rustAttributeParenthesizedParens matchgroup=rustAttribute start="\w\%(\w\)*("rs=e end=")"re=s transparent contained contains=rustAttributeBalancedParens,@rustAttributeContents 156 syn region rustAttributeParenthesizedCurly matchgroup=rustAttribute start="\w\%(\w\)*{"rs=e end="}"re=s transparent contained contains=rustAttributeBalancedCurly,@rustAttributeContents 157 syn region rustAttributeParenthesizedBrackets matchgroup=rustAttribute start="\w\%(\w\)*\["rs=e end="\]"re=s transparent contained contains=rustAttributeBalancedBrackets,@rustAttributeContents 158 syn region rustAttributeBalancedParens matchgroup=rustAttribute start="("rs=e end=")"re=s transparent contained contains=rustAttributeBalancedParens,@rustAttributeContents 159 syn region rustAttributeBalancedCurly matchgroup=rustAttribute start="{"rs=e end="}"re=s transparent contained contains=rustAttributeBalancedCurly,@rustAttributeContents 160 syn region rustAttributeBalancedBrackets matchgroup=rustAttribute start="\["rs=e end="\]"re=s transparent contained contains=rustAttributeBalancedBrackets,@rustAttributeContents 161 syn cluster rustAttributeContents contains=rustString,rustCommentLine,rustCommentBlock,rustCommentLineDocError,rustCommentBlockDocError 162 syn region rustDerive start="derive(" end=")" contained contains=rustDeriveTrait 163 " This list comes from src/libsyntax/ext/deriving/mod.rs 164 " Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show). 165 syn keyword rustDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy 166 167 " dyn keyword: It's only a keyword when used inside a type expression, so 168 " we make effort here to highlight it only when Rust identifiers follow it 169 " (not minding the case of pre-2018 Rust where a path starting with :: can 170 " follow). 171 " 172 " This is so that uses of dyn variable names such as in 'let &dyn = &2' 173 " and 'let dyn = 2' will not get highlighted as a keyword. 174 syn match rustKeyword "\<dyn\ze\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)" contains=rustDynKeyword 175 syn keyword rustDynKeyword dyn contained 176 177 " Number literals 178 syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" 179 syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" 180 syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" 181 syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\=" 182 183 " Special case for numbers of the form "1." which are float literals, unless followed by 184 " an identifier, which makes them integer literals with a method call or field access, 185 " or by another ".", which makes them integer literals followed by the ".." token. 186 " (This must go first so the others take precedence.) 187 syn match rustFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!" 188 " To mark a number as a normal float, it must have at least one of the three things integral values don't have: 189 " a decimal point and more numbers; an exponent; and a type suffix. 190 syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\=" 191 syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\=" 192 syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)" 193 194 " For the benefit of delimitMate 195 syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u{\%(\x_*\)\{1,6}}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime 196 syn region rustGenericRegion display start=/<\%('\|[^[:cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate 197 syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime 198 199 "rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting 200 syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" 201 syn match rustLabel display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*:" 202 syn match rustLabel display "\%(\<\%(break\|continue\)\s*\)\@<=\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" 203 syn match rustCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/ 204 " The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII). 205 syn match rustCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/ 206 syn match rustCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode 207 syn match rustCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u{\%(\x_*\)\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid 208 209 syn match rustShebang /\%^#![^[].*/ 210 syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell 211 syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell 212 syn region rustCommentLineDocError start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell contained 213 syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell 214 syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,rustCommentBlockDocRustCode,@Spell 215 syn region rustCommentBlockDocError matchgroup=rustCommentBlockDocError start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained 216 syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent 217 syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent 218 syn region rustCommentBlockDocNestError matchgroup=rustCommentBlockDocError start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained transparent 219 220 " FIXME: this is a really ugly and not fully correct implementation. Most 221 " importantly, a case like ``/* */*`` should have the final ``*`` not being in 222 " a comment, but in practice at present it leaves comments open two levels 223 " deep. But as long as you stay away from that particular case, I *believe* 224 " the highlighting is correct. Due to the way Vim's syntax engine works 225 " (greedy for start matches, unlike Rust's tokeniser which is searching for 226 " the earliest-starting match, start or end), I believe this cannot be solved. 227 " Oh you who would fix it, don't bother with things like duplicating the Block 228 " rules and putting ``\*\@<!`` at the start of them; it makes it worse, as 229 " then you must deal with cases like ``/*/**/*/``. And don't try making it 230 " worse with ``\%(/\@<!\*\)\@<!``, either... 231 232 syn keyword rustTodo contained TODO FIXME XXX NB NOTE SAFETY 233 234 " asm! macro {{{2 235 syn region rustAsmMacro matchgroup=rustMacro start="\<asm!\s*(" end=")" contains=rustAsmDirSpec,rustAsmSym,rustAsmConst,rustAsmOptionsGroup,rustComment.*,rustString.* 236 237 " Clobbered registers 238 syn keyword rustAsmDirSpec in out lateout inout inlateout contained nextgroup=rustAsmReg skipwhite skipempty 239 syn region rustAsmReg start="(" end=")" contained contains=rustString 240 241 " Symbol operands 242 syn keyword rustAsmSym sym contained nextgroup=rustAsmSymPath skipwhite skipempty 243 syn region rustAsmSymPath start="\S" end=",\|)"me=s-1 contained contains=rustComment.*,rustIdentifier 244 245 " Const 246 syn region rustAsmConstBalancedParens start="("ms=s+1 end=")" contained contains=@rustAsmConstExpr 247 syn cluster rustAsmConstExpr contains=rustComment.*,rust.*Number,rustString,rustAsmConstBalancedParens 248 syn region rustAsmConst start="const" end=",\|)"me=s-1 contained contains=rustStorage,@rustAsmConstExpr 249 250 " Options 251 syn region rustAsmOptionsGroup start="options\s*(" end=")" contained contains=rustAsmOptions,rustAsmOptionsKey 252 syn keyword rustAsmOptionsKey options contained 253 syn keyword rustAsmOptions pure nomem readonly preserves_flags noreturn nostack att_syntax contained 254 255 " Folding rules {{{2 256 " Trivial folding rules to begin with. 257 " FIXME: use the AST to make really good folding 258 syn region rustFoldBraces start="{" end="}" transparent fold 259 260 if !exists("b:current_syntax_embed") 261 let b:current_syntax_embed = 1 262 syntax include @RustCodeInComment <sfile>:p:h/rust.vim 263 unlet b:current_syntax_embed 264 265 " Currently regions marked as ```<some-other-syntax> will not get 266 " highlighted at all. In the future, we can do as vim-markdown does and 267 " highlight with the other syntax. But for now, let's make sure we find 268 " the closing block marker, because the rules below won't catch it. 269 syn region rustCommentLinesDocNonRustCode matchgroup=rustCommentDocCodeFence start='^\z(\s*//[!/]\s*```\).\+$' end='^\z1$' keepend contains=rustCommentLineDoc 270 271 " We borrow the rules from rust’s src/librustdoc/html/markdown.rs, so that 272 " we only highlight as Rust what it would perceive as Rust (almost; it’s 273 " possible to trick it if you try hard, and indented code blocks aren’t 274 " supported because Markdown is a menace to parse and only mad dogs and 275 " Englishmen would try to handle that case correctly in this syntax file). 276 syn region rustCommentLinesDocRustCode matchgroup=rustCommentDocCodeFence start='^\z(\s*//[!/]\s*```\)[^A-Za-z0-9_-]*\%(\%(should_panic\|no_run\|ignore\|allow_fail\|rust\|test_harness\|compile_fail\|E\d\{4}\|edition201[58]\)\%([^A-Za-z0-9_-]\+\|$\)\)*$' end='^\z1$' keepend contains=@RustCodeInComment,rustCommentLineDocLeader 277 syn region rustCommentBlockDocRustCode matchgroup=rustCommentDocCodeFence start='^\z(\%(\s*\*\)\?\s*```\)[^A-Za-z0-9_-]*\%(\%(should_panic\|no_run\|ignore\|allow_fail\|rust\|test_harness\|compile_fail\|E\d\{4}\|edition201[58]\)\%([^A-Za-z0-9_-]\+\|$\)\)*$' end='^\z1$' keepend contains=@RustCodeInComment,rustCommentBlockDocStar 278 " Strictly, this may or may not be correct; this code, for example, would 279 " mishighlight: 280 " 281 " /** 282 " ```rust 283 " println!("{}", 1 284 " * 1); 285 " ``` 286 " */ 287 " 288 " … but I don’t care. Balance of probability, and all that. 289 syn match rustCommentBlockDocStar /^\s*\*\s\?/ contained 290 syn match rustCommentLineDocLeader "^\s*//\%(//\@!\|!\)" contained 291 endif 292 293 " Default highlighting {{{1 294 hi def link rustDecNumber rustNumber 295 hi def link rustHexNumber rustNumber 296 hi def link rustOctNumber rustNumber 297 hi def link rustBinNumber rustNumber 298 hi def link rustIdentifierPrime rustIdentifier 299 hi def link rustTrait rustType 300 hi def link rustDeriveTrait rustTrait 301 302 hi def link rustMacroRepeatDelimiters Macro 303 hi def link rustMacroVariable Define 304 hi def link rustSigil StorageClass 305 hi def link rustEscape Special 306 hi def link rustEscapeUnicode rustEscape 307 hi def link rustEscapeError Error 308 hi def link rustStringContinuation Special 309 hi def link rustString String 310 hi def link rustStringDelimiter String 311 hi def link rustCharacterInvalid Error 312 hi def link rustCharacterInvalidUnicode rustCharacterInvalid 313 hi def link rustCharacter Character 314 hi def link rustNumber Number 315 hi def link rustBoolean Boolean 316 hi def link rustEnum rustType 317 hi def link rustEnumVariant rustConstant 318 hi def link rustConstant Constant 319 hi def link rustSelf Constant 320 hi def link rustFloat Float 321 hi def link rustArrowCharacter rustOperator 322 hi def link rustOperator Operator 323 hi def link rustKeyword Keyword 324 hi def link rustDynKeyword rustKeyword 325 hi def link rustTypedef Keyword " More precise is Typedef, but it doesn't feel right for Rust 326 hi def link rustStructure Keyword " More precise is Structure 327 hi def link rustUnion rustStructure 328 hi def link rustExistential rustKeyword 329 hi def link rustPubScopeDelim Delimiter 330 hi def link rustPubScopeCrate rustKeyword 331 hi def link rustSuper rustKeyword 332 hi def link rustUnsafeKeyword Exception 333 hi def link rustReservedKeyword Error 334 hi def link rustRepeat Conditional 335 hi def link rustConditional Conditional 336 hi def link rustIdentifier Identifier 337 hi def link rustCapsIdent rustIdentifier 338 hi def link rustModPath Include 339 hi def link rustModPathSep Delimiter 340 hi def link rustFunction Function 341 hi def link rustFuncName Function 342 hi def link rustFuncCall Function 343 hi def link rustShebang Comment 344 hi def link rustCommentLine Comment 345 hi def link rustCommentLineDoc SpecialComment 346 hi def link rustCommentLineDocLeader rustCommentLineDoc 347 hi def link rustCommentLineDocError Error 348 hi def link rustCommentBlock rustCommentLine 349 hi def link rustCommentBlockDoc rustCommentLineDoc 350 hi def link rustCommentBlockDocStar rustCommentBlockDoc 351 hi def link rustCommentBlockDocError Error 352 hi def link rustCommentDocCodeFence rustCommentLineDoc 353 hi def link rustAssert PreCondit 354 hi def link rustPanic PreCondit 355 hi def link rustMacro Macro 356 hi def link rustType Type 357 hi def link rustTodo Todo 358 hi def link rustAttribute PreProc 359 hi def link rustDerive PreProc 360 hi def link rustDefault StorageClass 361 hi def link rustStorage StorageClass 362 hi def link rustObsoleteStorage Error 363 hi def link rustLifetime Special 364 hi def link rustLabel Label 365 hi def link rustExternCrate rustKeyword 366 hi def link rustObsoleteExternMod Error 367 hi def link rustQuestionMark Special 368 hi def link rustAsync rustKeyword 369 hi def link rustAwait rustKeyword 370 hi def link rustAsmDirSpec rustKeyword 371 hi def link rustAsmSym rustKeyword 372 hi def link rustAsmOptions rustKeyword 373 hi def link rustAsmOptionsKey rustAttribute 374 375 " Other Suggestions: 376 " hi rustAttribute ctermfg=cyan 377 " hi rustDerive ctermfg=cyan 378 " hi rustAssert ctermfg=yellow 379 " hi rustPanic ctermfg=red 380 " hi rustMacro ctermfg=magenta 381 382 syn sync minlines=200 383 syn sync maxlines=500 384 385 let b:current_syntax = "rust" 386 387 " vim: set et sw=4 sts=4 ts=8: