2015-07-18 17:05:45 -04:00
|
|
|
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
|
|
|
|
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" Vim syntax file
|
|
|
|
|
" Language: Rust
|
|
|
|
|
" Maintainer: Patrick Walton <pcwalton@mozilla.com>
|
|
|
|
|
" Maintainer: Ben Blum <bblum@cs.cmu.edu>
|
|
|
|
|
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
2016-05-02 04:42:37 -04:00
|
|
|
|
" Last Change: Feb 24, 2016
|
2017-09-27 13:57:29 -04:00
|
|
|
|
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
|
|
|
|
if version < 600
|
2018-07-08 09:16:28 -04:00
|
|
|
|
syntax clear
|
2013-09-26 06:44:31 -04:00
|
|
|
|
elseif exists("b:current_syntax")
|
2018-07-08 09:16:28 -04:00
|
|
|
|
finish
|
2013-09-26 06:44:31 -04:00
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
" Syntax definitions {{{1
|
|
|
|
|
" Basic keywords {{{2
|
|
|
|
|
syn keyword rustConditional match if else
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn keyword rustRepeat for loop while
|
|
|
|
|
syn keyword rustTypedef type nextgroup=rustIdentifier skipwhite skipempty
|
|
|
|
|
syn keyword rustStructure struct enum nextgroup=rustIdentifier skipwhite skipempty
|
|
|
|
|
syn keyword rustUnion union nextgroup=rustIdentifier skipwhite skipempty contained
|
|
|
|
|
syn match rustUnionContextual /\<union\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*/ transparent contains=rustUnion
|
2013-09-26 06:44:31 -04:00
|
|
|
|
syn keyword rustOperator as
|
2018-12-26 04:41:57 -05:00
|
|
|
|
syn keyword rustExistential existential nextgroup=rustTypedef skipwhite skipempty contained
|
|
|
|
|
syn match rustExistentialContextual /\<existential\_s\+type/ transparent contains=rustExistential,rustTypedef
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
|
|
|
|
syn match rustAssert "\<assert\(\w\)*!" contained
|
2014-12-09 17:09:20 -05:00
|
|
|
|
syn match rustPanic "\<panic\(\w\)*!" contained
|
2018-12-26 04:41:57 -05:00
|
|
|
|
syn match rustKeyword "\<async\%(\s\|\n\)\@="
|
2014-06-08 07:18:33 -04:00
|
|
|
|
syn keyword rustKeyword break
|
|
|
|
|
syn keyword rustKeyword box nextgroup=rustBoxPlacement skipwhite skipempty
|
|
|
|
|
syn keyword rustKeyword continue
|
2018-07-08 09:16:28 -04:00
|
|
|
|
syn keyword rustKeyword crate
|
2014-06-08 07:18:33 -04:00
|
|
|
|
syn keyword rustKeyword extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
|
|
|
|
|
syn keyword rustKeyword fn nextgroup=rustFuncName skipwhite skipempty
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn keyword rustKeyword in impl let
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn keyword rustKeyword macro
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn keyword rustKeyword pub nextgroup=rustPubScope skipwhite skipempty
|
|
|
|
|
syn keyword rustKeyword return
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn keyword rustKeyword yield
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn keyword rustSuper super
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn keyword rustKeyword where
|
|
|
|
|
syn keyword rustUnsafeKeyword unsafe
|
2014-11-10 20:37:21 -05:00
|
|
|
|
syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" FIXME: Scoped impl's name is also fallen in this category
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn keyword rustKeyword mod trait nextgroup=rustIdentifier skipwhite skipempty
|
2014-12-09 17:09:20 -05:00
|
|
|
|
syn keyword rustStorage move mut ref static const
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn match rustDefault /\<default\ze\_s\+\(impl\|fn\|type\|const\)\>/
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn keyword rustPubScopeCrate crate contained
|
|
|
|
|
syn match rustPubScopeDelim /[()]/ contained
|
|
|
|
|
syn match rustPubScope /([^()]*)/ contained contains=rustPubScopeDelim,rustPubScopeCrate,rustSuper,rustModPath,rustModPathSep,rustSelf transparent
|
|
|
|
|
|
2014-11-10 20:37:21 -05:00
|
|
|
|
syn keyword rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty
|
|
|
|
|
" This is to get the `bar` part of `extern crate "foo" as bar;` highlighting.
|
|
|
|
|
syn match rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator
|
2014-06-08 07:18:33 -04:00
|
|
|
|
syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty
|
2014-02-28 18:15:51 -05:00
|
|
|
|
|
2013-09-26 06:44:31 -04:00
|
|
|
|
syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
|
|
|
|
|
syn match rustFuncName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
|
|
|
|
|
|
2014-06-08 07:18:33 -04:00
|
|
|
|
syn region rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained
|
|
|
|
|
" Ideally we'd have syntax rules set up to match arbitrary expressions. Since
|
|
|
|
|
" we don't, we'll just define temporary contained rules to handle balancing
|
|
|
|
|
" delimiters.
|
|
|
|
|
syn region rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent
|
|
|
|
|
syn region rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent
|
|
|
|
|
" {} are handled by rustFoldBraces
|
|
|
|
|
|
2014-07-29 07:03:49 -04:00
|
|
|
|
syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount
|
|
|
|
|
syn match rustMacroRepeatCount ".\?[*+]" contained
|
|
|
|
|
syn match rustMacroVariable "$\w\+"
|
|
|
|
|
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" Reserved (but not yet used) keywords {{{2
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn keyword rustReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized abstract virtual final override
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
|
|
|
|
" Built-in types {{{2
|
2017-02-02 15:16:29 -05:00
|
|
|
|
syn keyword rustType isize usize char bool u8 u16 u32 u64 u128 f32
|
|
|
|
|
syn keyword rustType f64 i8 i16 i32 i64 i128 str Self
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2015-12-06 05:31:38 -05:00
|
|
|
|
" Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" This section is just straight transformation of the contents of the prelude,
|
|
|
|
|
" to make it easy to update.
|
|
|
|
|
|
2014-12-09 17:09:20 -05:00
|
|
|
|
" Reexported core operators {{{3
|
2014-08-12 17:45:36 -04:00
|
|
|
|
syn keyword rustTrait Copy Send Sized Sync
|
2015-01-23 15:09:23 -05:00
|
|
|
|
syn keyword rustTrait Drop Fn FnMut FnOnce
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2014-12-09 17:09:20 -05:00
|
|
|
|
" Reexported functions {{{3
|
2015-12-06 05:31:38 -05:00
|
|
|
|
" There’s no point in highlighting these; when one writes drop( or drop::< it
|
|
|
|
|
" gets the same highlighting anyway, and if someone writes `let drop = …;` we
|
|
|
|
|
" don’t really want *that* drop to be highlighted.
|
|
|
|
|
"syn keyword rustFunction drop
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2014-12-09 17:09:20 -05:00
|
|
|
|
" Reexported types and traits {{{3
|
2015-01-23 15:09:23 -05:00
|
|
|
|
syn keyword rustTrait Box
|
2015-12-06 05:31:38 -05:00
|
|
|
|
syn keyword rustTrait ToOwned
|
2014-04-14 19:05:44 -04:00
|
|
|
|
syn keyword rustTrait Clone
|
2014-12-09 17:09:20 -05:00
|
|
|
|
syn keyword rustTrait PartialEq PartialOrd Eq Ord
|
2015-12-06 05:31:38 -05:00
|
|
|
|
syn keyword rustTrait AsRef AsMut Into From
|
|
|
|
|
syn keyword rustTrait Default
|
|
|
|
|
syn keyword rustTrait Iterator Extend IntoIterator
|
|
|
|
|
syn keyword rustTrait DoubleEndedIterator ExactSizeIterator
|
2014-12-09 17:09:20 -05:00
|
|
|
|
syn keyword rustEnum Option
|
|
|
|
|
syn keyword rustEnumVariant Some None
|
|
|
|
|
syn keyword rustEnum Result
|
|
|
|
|
syn keyword rustEnumVariant Ok Err
|
2015-12-06 05:31:38 -05:00
|
|
|
|
syn keyword rustTrait SliceConcatExt
|
2015-01-23 15:09:23 -05:00
|
|
|
|
syn keyword rustTrait String ToString
|
2014-06-08 07:18:33 -04:00
|
|
|
|
syn keyword rustTrait Vec
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2014-12-09 17:09:20 -05:00
|
|
|
|
" Other syntax {{{2
|
2013-09-26 06:44:31 -04:00
|
|
|
|
syn keyword rustSelf self
|
|
|
|
|
syn keyword rustBoolean true false
|
|
|
|
|
|
|
|
|
|
" If foo::bar changes to foo.bar, change this ("::" to "\.").
|
|
|
|
|
" If foo::bar changes to Foo::bar, change this (first "\w" to "\u").
|
|
|
|
|
syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3
|
|
|
|
|
syn match rustModPathSep "::"
|
|
|
|
|
|
|
|
|
|
syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1
|
|
|
|
|
syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>();
|
|
|
|
|
|
|
|
|
|
" This is merely a convention; note also the use of [A-Z], restricting it to
|
|
|
|
|
" latin identifiers rather than the full Unicode uppercase. I have not used
|
|
|
|
|
" [:upper:] as it depends upon 'noignorecase'
|
|
|
|
|
"syn match rustCapsIdent display "[A-Z]\w\(\w\)*"
|
|
|
|
|
|
|
|
|
|
syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?"
|
|
|
|
|
" This one isn't *quite* right, as we could have binary-& with a reference
|
|
|
|
|
syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1
|
|
|
|
|
syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1
|
|
|
|
|
" This isn't actually correct; a closure with no arguments can be `|| { }`.
|
|
|
|
|
" Last, because the & in && isn't a sigil
|
|
|
|
|
syn match rustOperator display "&&\|||"
|
2015-12-06 05:31:38 -05:00
|
|
|
|
" This is rustArrowCharacter rather than rustArrow for the sake of matchparen,
|
|
|
|
|
" so it skips the ->; see http://stackoverflow.com/a/30309949 for details.
|
|
|
|
|
syn match rustArrowCharacter display "->"
|
2016-12-20 14:57:20 -05:00
|
|
|
|
syn match rustQuestionMark display "?\([a-zA-Z]\+\)\@!"
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2014-12-09 17:09:20 -05:00
|
|
|
|
syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustPanic
|
|
|
|
|
syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2014-07-29 07:03:49 -04:00
|
|
|
|
syn match rustEscapeError display contained /\\./
|
|
|
|
|
syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn match rustEscapeUnicode display contained /\\u{\%(\x_*\)\{1,6}}/
|
2013-09-26 06:44:31 -04:00
|
|
|
|
syn match rustStringContinuation display contained /\\\n\s*/
|
2014-07-29 07:03:49 -04:00
|
|
|
|
syn region rustString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation
|
|
|
|
|
syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell
|
|
|
|
|
syn region rustString start='b\?r\z(#*\)"' end='"\z1' contains=@Spell
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn region rustAttribute start="#!\?\[" end="\]" contains=rustString,rustDerive,rustCommentLine,rustCommentBlock,rustCommentLineDocError,rustCommentBlockDocError
|
2015-12-06 05:31:38 -05:00
|
|
|
|
syn region rustDerive start="derive(" end=")" contained contains=rustDeriveTrait
|
|
|
|
|
" This list comes from src/libsyntax/ext/deriving/mod.rs
|
|
|
|
|
" Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show).
|
|
|
|
|
syn keyword rustDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2018-07-08 09:16:28 -04:00
|
|
|
|
" dyn keyword: It's only a keyword when used inside a type expression, so
|
|
|
|
|
" we make effort here to highlight it only when Rust identifiers follow it
|
|
|
|
|
" (not minding the case of pre-2018 Rust where a path starting with :: can
|
|
|
|
|
" follow).
|
|
|
|
|
"
|
|
|
|
|
" This is so that uses of dyn variable names such as in 'let &dyn = &2'
|
|
|
|
|
" and 'let dyn = 2' will not get highlighted as a keyword.
|
|
|
|
|
syn match rustKeyword "\<dyn\ze\_s\+\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)" contains=rustDynKeyword
|
|
|
|
|
syn keyword rustDynKeyword dyn contained
|
|
|
|
|
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" Number literals
|
2017-02-02 15:16:29 -05:00
|
|
|
|
syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
|
|
|
|
|
syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
|
|
|
|
|
syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
|
|
|
|
|
syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\|128\)\)\="
|
2013-12-12 19:37:01 -05:00
|
|
|
|
|
|
|
|
|
" Special case for numbers of the form "1." which are float literals, unless followed by
|
2014-11-10 20:37:21 -05:00
|
|
|
|
" an identifier, which makes them integer literals with a method call or field access,
|
|
|
|
|
" or by another ".", which makes them integer literals followed by the ".." token.
|
2013-12-12 19:37:01 -05:00
|
|
|
|
" (This must go first so the others take precedence.)
|
2014-11-10 20:37:21 -05:00
|
|
|
|
syn match rustFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!"
|
2013-12-12 19:37:01 -05:00
|
|
|
|
" To mark a number as a normal float, it must have at least one of the three things integral values don't have:
|
|
|
|
|
" a decimal point and more numbers; an exponent; and a type suffix.
|
|
|
|
|
syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\="
|
|
|
|
|
syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\="
|
|
|
|
|
syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
|
|
|
|
" For the benefit of delimitMate
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u{\%(\x_*\)\{1,6}}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
|
2018-07-08 09:16:28 -04:00
|
|
|
|
syn region rustGenericRegion display start=/<\%('\|[^[:cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
|
2013-09-26 06:44:31 -04:00
|
|
|
|
syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
|
|
|
|
|
|
|
|
|
|
"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
|
|
|
|
|
syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn match rustLabel display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*:"
|
2014-07-29 07:03:49 -04:00
|
|
|
|
syn match rustCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/
|
|
|
|
|
" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII).
|
|
|
|
|
syn match rustCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/
|
|
|
|
|
syn match rustCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode
|
2017-09-27 13:57:29 -04:00
|
|
|
|
syn match rustCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u{\%(\x_*\)\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid
|
2013-12-12 19:37:01 -05:00
|
|
|
|
|
2015-12-06 05:31:38 -05:00
|
|
|
|
syn match rustShebang /\%^#![^[].*/
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
|
|
|
|
|
syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
|
|
|
|
|
syn region rustCommentLineDocError start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell contained
|
|
|
|
|
syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
|
2018-07-08 09:16:28 -04:00
|
|
|
|
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,rustCommentBlockDocRustCode,@Spell
|
2016-05-02 04:42:37 -04:00
|
|
|
|
syn region rustCommentBlockDocError matchgroup=rustCommentBlockDocError start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained
|
|
|
|
|
syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
|
|
|
|
|
syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
|
|
|
|
|
syn region rustCommentBlockDocNestError matchgroup=rustCommentBlockDocError start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained transparent
|
2018-07-08 09:16:28 -04:00
|
|
|
|
|
2013-12-12 19:37:01 -05:00
|
|
|
|
" FIXME: this is a really ugly and not fully correct implementation. Most
|
|
|
|
|
" importantly, a case like ``/* */*`` should have the final ``*`` not being in
|
|
|
|
|
" a comment, but in practice at present it leaves comments open two levels
|
|
|
|
|
" deep. But as long as you stay away from that particular case, I *believe*
|
|
|
|
|
" the highlighting is correct. Due to the way Vim's syntax engine works
|
|
|
|
|
" (greedy for start matches, unlike Rust's tokeniser which is searching for
|
|
|
|
|
" the earliest-starting match, start or end), I believe this cannot be solved.
|
|
|
|
|
" Oh you who would fix it, don't bother with things like duplicating the Block
|
|
|
|
|
" rules and putting ``\*\@<!`` at the start of them; it makes it worse, as
|
|
|
|
|
" then you must deal with cases like ``/*/**/*/``. And don't try making it
|
|
|
|
|
" worse with ``\%(/\@<!\*\)\@<!``, either...
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
|
|
|
|
syn keyword rustTodo contained TODO FIXME XXX NB NOTE
|
|
|
|
|
|
|
|
|
|
" Folding rules {{{2
|
|
|
|
|
" Trivial folding rules to begin with.
|
2014-11-10 20:37:21 -05:00
|
|
|
|
" FIXME: use the AST to make really good folding
|
2013-09-26 06:44:31 -04:00
|
|
|
|
syn region rustFoldBraces start="{" end="}" transparent fold
|
|
|
|
|
|
2018-07-08 09:16:28 -04:00
|
|
|
|
if !exists("b:current_syntax_embed")
|
|
|
|
|
let b:current_syntax_embed = 1
|
|
|
|
|
syntax include @RustCodeInComment <sfile>:p:h/rust.vim
|
|
|
|
|
unlet b:current_syntax_embed
|
|
|
|
|
|
2018-10-08 13:00:59 -04:00
|
|
|
|
" Currently regions marked as ```<some-other-syntax> will not get
|
|
|
|
|
" highlighted at all. In the future, we can do as vim-markdown does and
|
|
|
|
|
" highlight with the other syntax. But for now, let's make sure we find
|
|
|
|
|
" the closing block marker, because the rules below won't catch it.
|
|
|
|
|
syn region rustCommentLinesDocNonRustCode matchgroup=rustCommentDocCodeFence start='^\z(\s*//[!/]\s*```\).\+$' end='^\z1$' keepend contains=rustCommentLineDoc
|
|
|
|
|
|
2018-07-08 09:16:28 -04:00
|
|
|
|
" We borrow the rules from rust’s src/librustdoc/html/markdown.rs, so that
|
|
|
|
|
" we only highlight as Rust what it would perceive as Rust (almost; it’s
|
|
|
|
|
" possible to trick it if you try hard, and indented code blocks aren’t
|
|
|
|
|
" supported because Markdown is a menace to parse and only mad dogs and
|
|
|
|
|
" Englishmen would try to handle that case correctly in this syntax file).
|
2018-10-08 13:00:59 -04:00
|
|
|
|
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}\)\%([^A-Za-z0-9_-]\+\|$\)\)*$' end='^\z1$' keepend contains=@RustCodeInComment,rustCommentLineDocLeader
|
2018-07-08 09:16:28 -04:00
|
|
|
|
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}\)\%([^A-Za-z0-9_-]\+\|$\)\)*$' end='^\z1$' keepend contains=@RustCodeInComment,rustCommentBlockDocStar
|
|
|
|
|
" Strictly, this may or may not be correct; this code, for example, would
|
|
|
|
|
" mishighlight:
|
|
|
|
|
"
|
|
|
|
|
" /**
|
|
|
|
|
" ```rust
|
|
|
|
|
" println!("{}", 1
|
|
|
|
|
" * 1);
|
|
|
|
|
" ```
|
|
|
|
|
" */
|
|
|
|
|
"
|
|
|
|
|
" … but I don’t care. Balance of probability, and all that.
|
|
|
|
|
syn match rustCommentBlockDocStar /^\s*\*\s\?/ contained
|
2018-10-08 13:00:59 -04:00
|
|
|
|
syn match rustCommentLineDocLeader "^\s*//\%(//\@!\|!\)" contained
|
2018-07-08 09:16:28 -04:00
|
|
|
|
endif
|
|
|
|
|
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" Default highlighting {{{1
|
2013-12-12 19:37:01 -05:00
|
|
|
|
hi def link rustDecNumber rustNumber
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustHexNumber rustNumber
|
2013-11-10 19:34:19 -05:00
|
|
|
|
hi def link rustOctNumber rustNumber
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustBinNumber rustNumber
|
|
|
|
|
hi def link rustIdentifierPrime rustIdentifier
|
|
|
|
|
hi def link rustTrait rustType
|
2015-12-06 05:31:38 -05:00
|
|
|
|
hi def link rustDeriveTrait rustTrait
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
2014-07-29 07:03:49 -04:00
|
|
|
|
hi def link rustMacroRepeatCount rustMacroRepeatDelimiters
|
|
|
|
|
hi def link rustMacroRepeatDelimiters Macro
|
|
|
|
|
hi def link rustMacroVariable Define
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustSigil StorageClass
|
2014-07-29 07:03:49 -04:00
|
|
|
|
hi def link rustEscape Special
|
|
|
|
|
hi def link rustEscapeUnicode rustEscape
|
|
|
|
|
hi def link rustEscapeError Error
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustStringContinuation Special
|
|
|
|
|
hi def link rustString String
|
2014-07-29 07:03:49 -04:00
|
|
|
|
hi def link rustCharacterInvalid Error
|
|
|
|
|
hi def link rustCharacterInvalidUnicode rustCharacterInvalid
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustCharacter Character
|
|
|
|
|
hi def link rustNumber Number
|
|
|
|
|
hi def link rustBoolean Boolean
|
|
|
|
|
hi def link rustEnum rustType
|
|
|
|
|
hi def link rustEnumVariant rustConstant
|
|
|
|
|
hi def link rustConstant Constant
|
|
|
|
|
hi def link rustSelf Constant
|
|
|
|
|
hi def link rustFloat Float
|
2015-12-06 05:31:38 -05:00
|
|
|
|
hi def link rustArrowCharacter rustOperator
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustOperator Operator
|
|
|
|
|
hi def link rustKeyword Keyword
|
2018-07-08 09:16:28 -04:00
|
|
|
|
hi def link rustDynKeyword rustKeyword
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustTypedef Keyword " More precise is Typedef, but it doesn't feel right for Rust
|
|
|
|
|
hi def link rustStructure Keyword " More precise is Structure
|
|
|
|
|
hi def link rustUnion rustStructure
|
2018-12-26 04:41:57 -05:00
|
|
|
|
hi def link rustExistential rustKeyword
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustPubScopeDelim Delimiter
|
|
|
|
|
hi def link rustPubScopeCrate rustKeyword
|
|
|
|
|
hi def link rustSuper rustKeyword
|
2017-09-27 13:57:29 -04:00
|
|
|
|
hi def link rustUnsafeKeyword Exception
|
2013-12-12 19:37:01 -05:00
|
|
|
|
hi def link rustReservedKeyword Error
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustRepeat Conditional
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustConditional Conditional
|
|
|
|
|
hi def link rustIdentifier Identifier
|
|
|
|
|
hi def link rustCapsIdent rustIdentifier
|
|
|
|
|
hi def link rustModPath Include
|
|
|
|
|
hi def link rustModPathSep Delimiter
|
|
|
|
|
hi def link rustFunction Function
|
|
|
|
|
hi def link rustFuncName Function
|
|
|
|
|
hi def link rustFuncCall Function
|
2015-12-06 05:31:38 -05:00
|
|
|
|
hi def link rustShebang Comment
|
2013-12-12 19:37:01 -05:00
|
|
|
|
hi def link rustCommentLine Comment
|
|
|
|
|
hi def link rustCommentLineDoc SpecialComment
|
2018-10-08 13:00:59 -04:00
|
|
|
|
hi def link rustCommentLineDocLeader rustCommentLineDoc
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustCommentLineDocError Error
|
2013-12-12 19:37:01 -05:00
|
|
|
|
hi def link rustCommentBlock rustCommentLine
|
|
|
|
|
hi def link rustCommentBlockDoc rustCommentLineDoc
|
2018-07-08 09:16:28 -04:00
|
|
|
|
hi def link rustCommentBlockDocStar rustCommentBlockDoc
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustCommentBlockDocError Error
|
2018-07-08 09:16:28 -04:00
|
|
|
|
hi def link rustCommentDocCodeFence rustCommentLineDoc
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustAssert PreCondit
|
2014-12-09 17:09:20 -05:00
|
|
|
|
hi def link rustPanic PreCondit
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustMacro Macro
|
|
|
|
|
hi def link rustType Type
|
|
|
|
|
hi def link rustTodo Todo
|
|
|
|
|
hi def link rustAttribute PreProc
|
2015-01-23 15:09:23 -05:00
|
|
|
|
hi def link rustDerive PreProc
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustDefault StorageClass
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustStorage StorageClass
|
2013-12-12 19:37:01 -05:00
|
|
|
|
hi def link rustObsoleteStorage Error
|
2013-09-26 06:44:31 -04:00
|
|
|
|
hi def link rustLifetime Special
|
2016-05-02 04:42:37 -04:00
|
|
|
|
hi def link rustLabel Label
|
2014-02-28 18:15:51 -05:00
|
|
|
|
hi def link rustExternCrate rustKeyword
|
2014-03-10 19:36:09 -04:00
|
|
|
|
hi def link rustObsoleteExternMod Error
|
2014-06-08 07:18:33 -04:00
|
|
|
|
hi def link rustBoxPlacementParens Delimiter
|
2016-12-20 14:57:20 -05:00
|
|
|
|
hi def link rustQuestionMark Special
|
2013-09-26 06:44:31 -04:00
|
|
|
|
|
|
|
|
|
" Other Suggestions:
|
|
|
|
|
" hi rustAttribute ctermfg=cyan
|
2015-01-23 15:09:23 -05:00
|
|
|
|
" hi rustDerive ctermfg=cyan
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" hi rustAssert ctermfg=yellow
|
2014-12-09 17:09:20 -05:00
|
|
|
|
" hi rustPanic ctermfg=red
|
2013-09-26 06:44:31 -04:00
|
|
|
|
" hi rustMacro ctermfg=magenta
|
|
|
|
|
|
|
|
|
|
syn sync minlines=200
|
|
|
|
|
syn sync maxlines=500
|
|
|
|
|
|
|
|
|
|
let b:current_syntax = "rust"
|
2015-07-18 17:05:45 -04:00
|
|
|
|
|
2018-07-08 09:16:28 -04:00
|
|
|
|
" vim: set et sw=4 sts=4 ts=8:
|
|
|
|
|
|
2015-07-18 17:05:45 -04:00
|
|
|
|
endif
|