vim/syntax/cpp.vim

167 lines
6.1 KiB
VimL

" Language: C++
" Description: Override default C++ syntax file.
" Quit when a syntax file was already loaded
if exists('b:current_syntax')
finish
endif
" Disable C syntax options to improve performance
let b:c_no_curly_error = 1
let b:c_no_bracket_error = 1
let b:c_no_cformat = 1
let b:c_no_c11 = 1
let b:c_no_ansi = 1
let b:c_no_bsd = 1
let b:c_no_operators = 1
" Read the C syntax to start with
runtime! syntax/c.vim
unlet b:current_syntax
" C++98
syn keyword cppStatement this friend using
syn keyword cppAccess public protected private
syn keyword cppModifier inline virtual explicit export
syn keyword cppType bool wchar_t
syn keyword cppExceptions throw try catch
syn keyword cppOperator new delete typeid and bitor or xor compl bitand and_eq or_eq xor_eq not not_eq
if exists('c_no_operators')
syn keyword cppOperator operator
endif
syn keyword cppCast const_cast static_cast dynamic_cast reinterpret_cast
syn keyword cppStorageClass mutable
syn keyword cppStructure class typename template namespace
syn keyword cppBoolean true false
syn keyword cppConstant __cplusplus
" C++11
if !exists('cpp_no_cpp11')
" Identifiers with special meaning: override final
" TODO: These should not be keyword's, instead highlight based on context
" since these can be used as regular identifiers outside of those contexts.
syn keyword cppModifier override final
syn keyword cppType char16_t char32_t nullptr_t
syn keyword cppExceptions noexcept
syn keyword cppStorageClass constexpr decltype thread_local
syn keyword cppConstant nullptr
syn keyword cppOperator alignas alignof decltype static_assert
syn region cppRawString matchgroup=cppRawStringDelimiter start=+\%(u8\|[uLU]\)\=R"\z([[:alnum:]_{}[\]#<>%:;.?*\+\-/\^&|~!=,"']\{,16}\)(+ end=+)\z1"+ contains=@Spell display
" Match: = delete; and = default;
" ^^^^^^ ^^^^^^^
" Both `delete` and `default` are keywords which normally take precidence,
" however if the match starts before the beginning of the keyword it will be
" chosen instead so we can specialze for this case.
syn match cppStatement '=\s*\(delete\|default\)\>\ze\s*;\?' contains=cOperator display
" Attribute Specifier Sequence
" Match: [[attribute-list]]
syn region cppAttributeDelimiter matchgroup=cppDelimiter start='\[\[' skip='\[\[' end='\]\]' transparent contains=cppAttribute,cppNamespace,cppAttributeUsing,cppAttributeUsingNamespace,cDelimiter,cString,cOperator,cNumber,cppFunction,cFunction
" Standard Attributes
syn keyword cppAttribute noreturn carries_dependency contained
endif
" C++14
if !exists('cpp_no_cpp14')
syn match cppNumber display '\<0b[01]\+\(u\=l\{0,2}\|ll\=u\)\>'
" Standard Attributes
syn keyword cppAttribute deprecated contained
endif
" C++17
if !exists('cpp_no_cpp17')
" Attribute Specifier Sequence
" Match: [[using attribute-namespace: attribute-list]]
syn match cppAttributeUsingNamespace '\s\+\zs\w\+\ze\s*:' contained contains=cppAttributeUsing
syn keyword cppAttributeUsing using contained
" Standard Attributes
syn keyword cppAttribute fallthrough nodiscard maybe_unused contained
hi def link cppAttributeUsing cppStatement
hi def link cppAttributeUsingNamespace cInclude
hi def link cppAttributeUsingDelimiter cppDelimiter
endif
" C++20
if !exists('cpp_no_cpp20')
syn keyword cppStatement concept requires
" TODO: Attribute Specifier Sequence
" Match: [[contract-attribute-token contract-level(opt) identifier(opt): expression]]
"
" Standard Attributes
syn keyword cppAttribute likely unlikely no_unique_address contained
syn keyword cppAttribute expects ensures assert contained
" Contract Levels
syn keyword cppAttribute default audit axiom contained
"
" TODO: These should not be keyword's, instead highlight based on context
" since these can be used as regular identifiers outside of those contexts.
" These only occur inside an contracts generalised attribute.
syn keyword cppModifier audit axiom
endif
if !exists('cpp_no_function')
" Match function expressions: expr<T>()
" ^^^^
syn match cppFunction '\h\w*\ze<.*>\s*(' display
hi default link cppFunction Function
endif
if !exists('cpp_no_delimiters')
" Match: delimiter expressions: <expr>, ex::pr
" ^ ^ ^^
syn match cppDelimiter '\(<\|>\|::\)' display
" Match: nested namespace expressions: expr::
" ^^^^
syn match cppNamespace '\w\+::' display contains=cppDelimiter
" Match: label: as a Label and public: protected: private: as a Statement
" ^^^^^ ^^^^^^ ^^^^^^^^^ ^^^^^^^
syn match cUserCont "^\s*\I\i*\s*:$" contains=cUserLabel,cppAccess display
hi default link cppDelimiter cDelimiter
hi default link cppNamespace cInclude
endif
if !exists('cpp_no_operators') && !exists('cpp_no_delimiters')
" Match: single character operators if they are surrounded by white space: / < >
" ^ ^ ^
syn match cppOperator '\(\s\zs\/\s\ze\|\s\zs<\s\ze\|\s\zs>\s\ze\)' display
" Match: <= >= -> << >> <<= >>= ->*
" ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^^
syn match cppOperator '\(<=\|>=\|->\|<<\ze\s\|\s\zs>>\|>>=\|<<=\|->\*\)' display
" Match: operator<< operator>> operator< operator> operator[]
" ^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^
" operator new operator delete operator new[] operator delete[]
" ^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
syn match cppOperator '\<operator\>\s*\(\/\|<<\|>>\|<\|>\|\(new\|delete\)\?\s*\[\s*\]\)\?' display
endif
" Default highlighting
hi def link cppAccess cppStatement
hi def link cppCast cppOperator
hi def link cppExceptions Exception
hi def link cppOperator Operator
hi def link cppStatement Statement
hi def link cppModifier cppStatement
hi def link cppType Type
hi def link cppStorageClass StorageClass
hi def link cppStructure Structure
hi def link cppBoolean Boolean
hi def link cppConstant Constant
hi def link cppRawStringDelimiter Delimiter
hi def link cppRawString String
hi def link cppNumber Number
hi def link cppAttribute Keyword
let b:current_syntax = 'cpp'