vim-polyglot/syntax/rust.vim

297 lines
16 KiB
VimL
Raw Normal View History

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
2013-09-26 06:44:31 -04:00
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
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
syn match rustAssert "\<assert\(\w\)*!" contained
2014-12-09 17:09:20 -05:00
syn match rustPanic "\<panic\(\w\)*!" contained
2014-06-08 07:18:33 -04:00
syn keyword rustKeyword break
syn keyword rustKeyword box nextgroup=rustBoxPlacement skipwhite skipempty
syn keyword rustKeyword continue
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
syn keyword rustKeyword pub nextgroup=rustPubScope skipwhite skipempty
syn keyword rustKeyword return
syn keyword rustSuper super
syn keyword rustKeyword unsafe where
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
2014-02-28 18:15:51 -05:00
syn keyword rustInvalidBareKeyword crate
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
2015-12-06 05:31:38 -05:00
syn keyword rustReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized yield abstract virtual final override macro
2013-09-26 06:44:31 -04:00
" Built-in types {{{2
2015-12-06 05:31:38 -05:00
syn keyword rustType isize usize char bool u8 u16 u32 u64 f32
2013-09-26 06:44:31 -04:00
syn keyword rustType f64 i8 i16 i32 i64 str Self
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
" Theres no point in highlighting these; when one writes drop( or drop::< it
" gets the same highlighting anyway, and if someone writes `let drop = …;` we
" dont 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 "->"
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}\)/
2014-12-22 15:57:06 -05: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
" Number literals
2015-12-06 05:31:38 -05:00
syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\)\)\="
syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\)\)\="
syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\)\)\="
syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\)\)\="
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
2016-05-02 04:42:37 -04:00
syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u{\x\{1,6}}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
2013-09-26 06:44:31 -04:00
syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
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
2016-05-02 04:42:37 -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
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
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
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
" 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
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
hi def link rustPubScopeDelim Delimiter
hi def link rustPubScopeCrate rustKeyword
hi def link rustSuper rustKeyword
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
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
2016-05-02 04:42:37 -04:00
hi def link rustCommentBlockDocError Error
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 rustInvalidBareKeyword Error
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
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"
endif