blob: ff1226b7b0201c87bd668e75c212991cb70051af [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: C++
Bram Moolenaard8b77f72015-03-05 21:21:19 +01003" Current Maintainer: vim-jp (https://github.com/vim-jp/vim-cpp)
Bram Moolenaarac7bd632013-03-19 11:35:58 +01004" Previous Maintainer: Ken Shan <ccshan@post.harvard.edu>
Wu Yongweic5def652024-05-07 18:24:55 +02005" Last Change: 2024 May 04
6" 2024 May 04 by Vim Project (fix digit separator in octals and floats)
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02008" quit when a syntax file was already loaded
9if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000010 finish
11endif
12
Bram Moolenaar98a29d02021-01-18 19:55:44 +010013" inform C syntax that the file was included from cpp.vim
14let b:filetype_in_cpp_family = 1
15
Bram Moolenaar071d4272004-06-13 20:20:40 +000016" Read the C syntax to start with
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020017runtime! syntax/c.vim
18unlet b:current_syntax
laburnumTff0baca2023-12-08 21:27:03 +010019unlet b:filetype_in_cpp_family
Bram Moolenaar071d4272004-06-13 20:20:40 +000020
Bram Moolenaarac7bd632013-03-19 11:35:58 +010021" C++ extensions
Bram Moolenaar071d4272004-06-13 20:20:40 +000022syn keyword cppStatement new delete this friend using
23syn keyword cppAccess public protected private
Bram Moolenaarb4ff5182015-11-10 21:15:48 +010024syn keyword cppModifier inline virtual explicit export
25syn keyword cppType bool wchar_t
Bram Moolenaar071d4272004-06-13 20:20:40 +000026syn keyword cppExceptions throw try catch
27syn keyword cppOperator operator typeid
28syn keyword cppOperator and bitor or xor compl bitand and_eq or_eq xor_eq not not_eq
29syn match cppCast "\<\(const\|static\|dynamic\|reinterpret\)_cast\s*<"me=e-1
30syn match cppCast "\<\(const\|static\|dynamic\|reinterpret\)_cast\s*$"
31syn keyword cppStorageClass mutable
32syn keyword cppStructure class typename template namespace
Bram Moolenaar071d4272004-06-13 20:20:40 +000033syn keyword cppBoolean true false
Bram Moolenaard8b77f72015-03-05 21:21:19 +010034syn keyword cppConstant __cplusplus
Bram Moolenaar071d4272004-06-13 20:20:40 +000035
Bram Moolenaarac7bd632013-03-19 11:35:58 +010036" C++ 11 extensions
37if !exists("cpp_no_cpp11")
Bram Moolenaarb4ff5182015-11-10 21:15:48 +010038 syn keyword cppModifier override final
Bram Moolenaarb4ada792016-10-30 21:55:26 +010039 syn keyword cppType nullptr_t auto
Bram Moolenaarac7bd632013-03-19 11:35:58 +010040 syn keyword cppExceptions noexcept
Bram Moolenaard8b77f72015-03-05 21:21:19 +010041 syn keyword cppStorageClass constexpr decltype thread_local
Bram Moolenaarac7bd632013-03-19 11:35:58 +010042 syn keyword cppConstant nullptr
Bram Moolenaard8b77f72015-03-05 21:21:19 +010043 syn keyword cppConstant ATOMIC_FLAG_INIT ATOMIC_VAR_INIT
44 syn keyword cppConstant ATOMIC_BOOL_LOCK_FREE ATOMIC_CHAR_LOCK_FREE
45 syn keyword cppConstant ATOMIC_CHAR16_T_LOCK_FREE ATOMIC_CHAR32_T_LOCK_FREE
46 syn keyword cppConstant ATOMIC_WCHAR_T_LOCK_FREE ATOMIC_SHORT_LOCK_FREE
47 syn keyword cppConstant ATOMIC_INT_LOCK_FREE ATOMIC_LONG_LOCK_FREE
48 syn keyword cppConstant ATOMIC_LLONG_LOCK_FREE ATOMIC_POINTER_LOCK_FREE
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020049 syn region cppRawString matchgroup=cppRawStringDelimiter start=+\%(u8\|[uLU]\)\=R"\z([[:alnum:]_{}[\]#<>%:;.?*\+\-/\^&|~!=,"']\{,16}\)(+ end=+)\z1"\(sv\|s\|_[_a-zA-Z][_a-zA-Z0-9]*\)\=+ contains=@Spell
Bram Moolenaar95a9dd12019-12-19 22:12:03 +010050 syn match cppCast "\<\(const\|static\|dynamic\)_pointer_cast\s*<"me=e-1
51 syn match cppCast "\<\(const\|static\|dynamic\)_pointer_cast\s*$"
Bram Moolenaarac7bd632013-03-19 11:35:58 +010052endif
53
Bram Moolenaarb4ff5182015-11-10 21:15:48 +010054" C++ 14 extensions
55if !exists("cpp_no_cpp14")
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020056 syn match cppNumbers display transparent "\<\d\|\.\d" contains=cppNumber,cppFloat
57 syn match cppNumber display contained "\<0\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
58 syn match cppNumber display contained "\<[1-9]\('\=\d\+\)*\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
Wu Yongweic5def652024-05-07 18:24:55 +020059 syn match cppNumber display contained "\<0\('\=\o\+\)\+\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020060 syn match cppNumber display contained "\<0b[01]\('\=[01]\+\)*\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
61 syn match cppNumber display contained "\<0x\x\('\=\x\+\)*\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
Wu Yongweic5def652024-05-07 18:24:55 +020062 syn match cppFloat display contained "\<\d\('\=\d\+\)*\.\(\d\('\=\d\+\)*\)\=\(e[-+]\=\d\+\)\=\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
63 syn match cppFloat display contained "\.\d\('\=\d\+\)*\(e[-+]\=\d\+\)\=\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020064 syn match cppFloat display contained "\<\d\+e[-+]\=\d\+\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
Bram Moolenaar89a9c152021-08-29 21:55:35 +020065 syn region cppString start=+\(L\|u\|u8\|U\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"\(sv\|s\|_\i*\)\=+ end='$' contains=cSpecial,cFormat,@Spell
Bram Moolenaar95a9dd12019-12-19 22:12:03 +010066endif
67
68" C++ 17 extensions
69if !exists("cpp_no_cpp17")
70 syn match cppCast "\<reinterpret_pointer_cast\s*<"me=e-1
71 syn match cppCast "\<reinterpret_pointer_cast\s*$"
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020072 syn match cppFloat display contained "\<0x\x*\.\x\+p[-+]\=\d\+\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
73 syn match cppFloat display contained "\<0x\x\+\.\=p[-+]\=\d\+\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
Bram Moolenaar89a9c152021-08-29 21:55:35 +020074
75 " TODO: push this up to c.vim if/when supported in C23
76 syn match cppCharacter "u8'[^\\]'"
77 syn match cppCharacter "u8'[^']*'" contains=cSpecial
78 if exists("c_gnu")
79 syn match cppSpecialError "u8'\\[^'\"?\\abefnrtv]'"
80 syn match cppSpecialCharacter "u8'\\['\"?\\abefnrtv]'"
81 else
82 syn match cppSpecialError "u8'\\[^'\"?\\abfnrtv]'"
83 syn match cppSpecialCharacter "u8'\\['\"?\\abfnrtv]'"
84 endif
85 syn match cppSpecialCharacter display "u8'\\\o\{1,3}'"
86 syn match cppSpecialCharacter display "u8'\\x\x\+'"
87
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020088endif
89
90" C++ 20 extensions
91if !exists("cpp_no_cpp20")
92 syn match cppNumber display contained "\<0\(y\|d\)\>"
93 syn match cppNumber display contained "\<[1-9]\('\=\d\+\)*\(y\|d\)\>"
94 syn match cppNumber display contained "\<0\o\+\(y\|d\)\>"
95 syn match cppNumber display contained "\<0b[01]\('\=[01]\+\)*\(y\|d\)\>"
96 syn match cppNumber display contained "\<0x\x\('\=\x\+\)*\(y\|d\)\>"
97 syn keyword cppStatement co_await co_return co_yield requires
98 syn keyword cppStorageClass consteval constinit
99 syn keyword cppStructure concept
100 syn keyword cppType char8_t
101 syn keyword cppModule import module export
Bram Moolenaar95a9dd12019-12-19 22:12:03 +0100102endif
103
Bram Moolenaar071d4272004-06-13 20:20:40 +0000104" The minimum and maximum operators in GNU C++
105syn match cppMinMax "[<>]?"
106
107" Default highlighting
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200108hi def link cppAccess cppStatement
109hi def link cppCast cppStatement
110hi def link cppExceptions Exception
111hi def link cppOperator Operator
112hi def link cppStatement Statement
113hi def link cppModifier Type
114hi def link cppType Type
115hi def link cppStorageClass StorageClass
116hi def link cppStructure Structure
117hi def link cppBoolean Boolean
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200118hi def link cppCharacter cCharacter
119hi def link cppSpecialCharacter cSpecialCharacter
120hi def link cppSpecialError cSpecialError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200121hi def link cppConstant Constant
122hi def link cppRawStringDelimiter Delimiter
123hi def link cppRawString String
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200124hi def link cppString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200125hi def link cppNumber Number
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200126hi def link cppFloat Number
Bram Moolenaar95a9dd12019-12-19 22:12:03 +0100127hi def link cppModule Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128
129let b:current_syntax = "cpp"
130
131" vim: ts=8