1" Vim syntax file 2" Language: C 3" Maintainer: Bram Moolenaar <[email protected]> 4" Last Change: 2020 Aug 28 5 6" Quit when a (custom) syntax file was already loaded 7if exists("b:current_syntax") 8 finish 9endif 10 11let s:cpo_save = &cpo 12set cpo&vim 13 14let s:ft = matchstr(&ft, '^\([^.]\)\+') 15 16" Optional embedded Autodoc parsing 17" To enable it add: let g:c_autodoc = 1 18" to your .vimrc 19if exists("c_autodoc") 20 syn include @cAutodoc <sfile>:p:h/autodoc.vim 21 unlet b:current_syntax 22endif 23 24" A bunch of useful C keywords 25syn keyword cStatement goto break return continue asm 26syn keyword cLabel case default 27syn keyword cConditional if else switch 28syn keyword cRepeat while for do 29 30syn keyword cTodo contained TODO FIXME XXX 31 32" It's easy to accidentally add a space after a backslash that was intended 33" for line continuation. Some compilers allow it, which makes it 34" unpredictable and should be avoided. 35syn match cBadContinuation contained "\\\s\+$" 36 37" cCommentGroup allows adding matches for special things in comments 38syn cluster cCommentGroup contains=cTodo,cBadContinuation 39 40" String and Character constants 41" Highlight special characters (those which have a backslash) differently 42syn match cSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)" 43if !exists("c_no_utf") 44 syn match cSpecial display contained "\\\(u\x\{4}\|U\x\{8}\)" 45endif 46 47if !exists("c_no_cformat") 48 " Highlight % items in strings. 49 if !exists("c_no_c99") " ISO C99 50 syn match cFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained 51 else 52 syn match cFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained 53 endif 54 syn match cFormat display "%%" contained 55endif 56 57" cCppString: same as cString, but ends at end of line 58if s:ft ==# "cpp" && !exists("cpp_no_cpp11") && !exists("c_no_cformat") 59 " ISO C++11 60 syn region cString start=+\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend 61 syn region cCppString start=+\(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell 62elseif s:ft ==# "c" && !exists("c_no_c11") && !exists("c_no_cformat") 63 " ISO C99 64 syn region cString start=+\%(L\|U\|u8\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend 65 syn region cCppString start=+\%(L\|U\|u8\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell 66else 67 " older C or C++ 68 syn match cFormat display "%%" contained 69 syn region cString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend 70 syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell 71endif 72 73syn region cCppSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppSkip 74 75syn cluster cStringGroup contains=cCppString,cCppSkip 76 77syn match cCharacter "L\='[^\\]'" 78syn match cCharacter "L'[^']*'" contains=cSpecial 79if exists("c_gnu") 80 syn match cSpecialError "L\='\\[^'\"?\\abefnrtv]'" 81 syn match cSpecialCharacter "L\='\\['\"?\\abefnrtv]'" 82else 83 syn match cSpecialError "L\='\\[^'\"?\\abfnrtv]'" 84 syn match cSpecialCharacter "L\='\\['\"?\\abfnrtv]'" 85endif 86syn match cSpecialCharacter display "L\='\\\o\{1,3}'" 87syn match cSpecialCharacter display "'\\x\x\{1,2}'" 88syn match cSpecialCharacter display "L'\\x\x\+'" 89 90if (s:ft ==# "c" && !exists("c_no_c11")) || (s:ft ==# "cpp" && !exists("cpp_no_cpp11")) 91 " ISO C11 or ISO C++ 11 92 if exists("c_no_cformat") 93 syn region cString start=+\%(U\|u8\=\)"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,@Spell extend 94 else 95 syn region cString start=+\%(U\|u8\=\)"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend 96 endif 97 syn match cCharacter "[Uu]'[^\\]'" 98 syn match cCharacter "[Uu]'[^']*'" contains=cSpecial 99 if exists("c_gnu") 100 syn match cSpecialError "[Uu]'\\[^'\"?\\abefnrtv]'" 101 syn match cSpecialCharacter "[Uu]'\\['\"?\\abefnrtv]'" 102 else 103 syn match cSpecialError "[Uu]'\\[^'\"?\\abfnrtv]'" 104 syn match cSpecialCharacter "[Uu]'\\['\"?\\abfnrtv]'" 105 endif 106 syn match cSpecialCharacter display "[Uu]'\\\o\{1,3}'" 107 syn match cSpecialCharacter display "[Uu]'\\x\x\+'" 108endif 109 110"when wanted, highlight trailing white space 111if exists("c_space_errors") 112 if !exists("c_no_trail_space_error") 113 syn match cSpaceError display excludenl "\s\+$" 114 endif 115 if !exists("c_no_tab_space_error") 116 syn match cSpaceError display " \+\t"me=e-1 117 endif 118endif 119 120" This should be before cErrInParen to avoid problems with #define ({ xxx }) 121if exists("c_curly_error") 122 syn match cCurlyError "}" 123 syn region cBlock start="{" end="}" contains=ALLBUT,cBadBlock,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell fold 124else 125 syn region cBlock start="{" end="}" transparent fold 126endif 127 128" Catch errors caused by wrong parenthesis and brackets. 129" Also accept <% for {, %> for }, <: for [ and :> for ] (C99) 130" But avoid matching <::. 131syn cluster cParenGroup contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserLabel,cBitField,cOctalZero,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom 132if exists("c_no_curly_error") 133 if s:ft ==# 'cpp' && !exists("cpp_no_cpp11") 134 syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell 135 " cCppParen: same as cParen but ends at end-of-line; used in cDefine 136 syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell 137 syn match cParenError display ")" 138 syn match cErrInParen display contained "^^<%\|^%>" 139 else 140 syn region cParen transparent start='(' end=')' contains=ALLBUT,cBlock,@cParenGroup,cCppParen,@cStringGroup,@Spell 141 " cCppParen: same as cParen but ends at end-of-line; used in cDefine 142 syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell 143 syn match cParenError display ")" 144 syn match cErrInParen display contained "^[{}]\|^<%\|^%>" 145 endif 146elseif exists("c_no_bracket_error") 147 if s:ft ==# 'cpp' && !exists("cpp_no_cpp11") 148 syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell 149 " cCppParen: same as cParen but ends at end-of-line; used in cDefine 150 syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell 151 syn match cParenError display ")" 152 syn match cErrInParen display contained "<%\|%>" 153 else 154 syn region cParen transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,@cStringGroup,@Spell 155 " cCppParen: same as cParen but ends at end-of-line; used in cDefine 156 syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell 157 syn match cParenError display ")" 158 syn match cErrInParen display contained "[{}]\|<%\|%>" 159 endif 160else 161 if s:ft ==# 'cpp' && !exists("cpp_no_cpp11") 162 syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell 163 " cCppParen: same as cParen but ends at end-of-line; used in cDefine 164 syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell 165 syn match cParenError display "[\])]" 166 syn match cErrInParen display contained "<%\|%>" 167 syn region cBracket transparent start='\[\|<::\@!' end=']\|:>' contains=ALLBUT,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell 168 else 169 syn region cParen transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell 170 " cCppParen: same as cParen but ends at end-of-line; used in cDefine 171 syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell 172 syn match cParenError display "[\])]" 173 syn match cErrInParen display contained "[\]{}]\|<%\|%>" 174 syn region cBracket transparent start='\[\|<::\@!' end=']\|:>' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell 175 endif 176 " cCppBracket: same as cParen but ends at end-of-line; used in cDefine 177 syn region cCppBracket transparent start='\[\|<::\@!' skip='\\$' excludenl end=']\|:>' end='$' contained contains=ALLBUT,@cParenGroup,cErrInParen,cParen,cBracket,cString,@Spell 178 syn match cErrInBracket display contained "[);{}]\|<%\|%>" 179endif 180 181if s:ft ==# 'c' || exists("cpp_no_cpp11") 182 syn region cBadBlock keepend start="{" end="}" contained containedin=cParen,cBracket,cBadBlock transparent fold 183endif 184 185"integer number, or floating point number without a dot and with "f". 186syn case ignore 187syn match cNumbers display transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalError,cOctal 188" Same, but without octal error (for comments) 189syn match cNumbersCom display contained transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctal 190syn match cNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>" 191"hex number 192syn match cNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>" 193" Flag the first zero of an octal number as something special 194syn match cOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=cOctalZero 195syn match cOctalZero display contained "\<0" 196syn match cFloat display contained "\d\+f" 197"floating point number, with dot, optional exponent 198syn match cFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=" 199"floating point number, starting with a dot, optional exponent 200syn match cFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>" 201"floating point number, without dot, with exponent 202syn match cFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>" 203if !exists("c_no_c99") 204 "hexadecimal floating point number, optional leading digits, with dot, with exponent 205 syn match cFloat display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>" 206 "hexadecimal floating point number, with leading digits, optional dot, with exponent 207 syn match cFloat display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>" 208endif 209 210" flag an octal number with wrong digits 211syn match cOctalError display contained "0\o*[89]\d*" 212syn case match 213 214if exists("c_comment_strings") 215 " A comment can contain cString, cCharacter and cNumber. 216 " But a "*/" inside a cString in a cComment DOES end the comment! So we 217 " need to use a special type of cString: cCommentString, which also ends on 218 " "*/", and sees a "*" at the start of the line as comment again. 219 " Unfortunately this doesn't very well work for // type of comments :-( 220 syn match cCommentSkip contained "^\s*\*\($\|\s\+\)" 221 syn region cCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=cSpecial,cCommentSkip 222 syn region cComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=cSpecial 223 syn region cCommentL start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,cWrongComTail,@Spell 224 if exists("c_no_comment_fold") 225 " Use "extend" here to have preprocessor lines not terminate halfway a 226 " comment. 227 syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell extend 228 else 229 syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell fold extend 230 endif 231else 232 syn region cCommentL start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell 233 if exists("c_no_comment_fold") 234 syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell extend 235 else 236 syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold extend 237 endif 238endif 239" keep a // comment separately, it terminates a preproc. conditional 240syn match cCommentError display "\*/" 241syn match cCommentStartError display "/\*"me=e-1 contained 242syn match cWrongComTail display "\*/" 243 244syn keyword cOperator sizeof 245if exists("c_gnu") 246 syn keyword cStatement __asm__ 247 syn keyword cOperator typeof __real__ __imag__ 248endif 249syn keyword cType int long short char void 250syn keyword cType signed unsigned float double 251if !exists("c_no_ansi") || exists("c_ansi_typedefs") 252 syn keyword cType size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t 253 syn keyword cType clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t 254 syn keyword cType mbstate_t wctrans_t wint_t wctype_t 255endif 256if !exists("c_no_c99") " ISO C99 257 syn keyword cType _Bool bool _Complex complex _Imaginary imaginary 258 syn keyword cType int8_t int16_t int32_t int64_t 259 syn keyword cType uint8_t uint16_t uint32_t uint64_t 260 if !exists("c_no_bsd") 261 " These are BSD specific. 262 syn keyword cType u_int8_t u_int16_t u_int32_t u_int64_t 263 endif 264 syn keyword cType int_least8_t int_least16_t int_least32_t int_least64_t 265 syn keyword cType uint_least8_t uint_least16_t uint_least32_t uint_least64_t 266 syn keyword cType int_fast8_t int_fast16_t int_fast32_t int_fast64_t 267 syn keyword cType uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t 268 syn keyword cType intptr_t uintptr_t 269 syn keyword cType intmax_t uintmax_t 270endif 271if exists("c_gnu") 272 syn keyword cType __label__ __complex__ __volatile__ 273endif 274 275syn keyword cTypedef typedef 276syn keyword cStructure struct union enum 277syn keyword cStorageClass static register auto volatile extern const 278if exists("c_gnu") 279 syn keyword cStorageClass inline __attribute__ 280endif 281if !exists("c_no_c99") && s:ft !=# 'cpp' 282 syn keyword cStorageClass inline restrict 283endif 284if !exists("c_no_c11") 285 syn keyword cStorageClass _Alignas alignas 286 syn keyword cOperator _Alignof alignof 287 syn keyword cStorageClass _Atomic 288 syn keyword cOperator _Generic 289 syn keyword cStorageClass _Noreturn noreturn 290 syn keyword cOperator _Static_assert static_assert 291 syn keyword cStorageClass _Thread_local thread_local 292 syn keyword cType char16_t char32_t 293 " C11 atomics (take down the shield wall!) 294 syn keyword cType atomic_bool atomic_char atomic_schar atomic_uchar 295 syn keyword Ctype atomic_short atomic_ushort atomic_int atomic_uint 296 syn keyword cType atomic_long atomic_ulong atomic_llong atomic_ullong 297 syn keyword cType atomic_char16_t atomic_char32_t atomic_wchar_t 298 syn keyword cType atomic_int_least8_t atomic_uint_least8_t 299 syn keyword cType atomic_int_least16_t atomic_uint_least16_t 300 syn keyword cType atomic_int_least32_t atomic_uint_least32_t 301 syn keyword cType atomic_int_least64_t atomic_uint_least64_t 302 syn keyword cType atomic_int_fast8_t atomic_uint_fast8_t 303 syn keyword cType atomic_int_fast16_t atomic_uint_fast16_t 304 syn keyword cType atomic_int_fast32_t atomic_uint_fast32_t 305 syn keyword cType atomic_int_fast64_t atomic_uint_fast64_t 306 syn keyword cType atomic_intptr_t atomic_uintptr_t 307 syn keyword cType atomic_size_t atomic_ptrdiff_t 308 syn keyword cType atomic_intmax_t atomic_uintmax_t 309endif 310 311if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu") 312 if exists("c_gnu") 313 syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ __func__ 314 endif 315 syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ __STDC_VERSION__ __STDC_HOSTED__ 316 syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX 317 syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX 318 syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN 319 syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX 320 syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN 321 syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX 322 if !exists("c_no_c99") 323 syn keyword cConstant __func__ __VA_ARGS__ 324 syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX 325 syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN 326 syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX 327 syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX 328 syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN 329 syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX 330 syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX 331 syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN 332 syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX 333 syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX 334 syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX 335 syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX 336 syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX 337 syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX 338 endif 339 syn keyword cConstant FLT_RADIX FLT_ROUNDS FLT_DIG FLT_MANT_DIG FLT_EPSILON DBL_DIG DBL_MANT_DIG DBL_EPSILON 340 syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP FLT_MIN_10_EXP FLT_MAX_10_EXP 341 syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP DBL_MIN_10_EXP DBL_MAX_10_EXP LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP 342 syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP HUGE_VAL CLOCKS_PER_SEC NULL LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY 343 syn keyword cConstant LC_NUMERIC LC_TIME SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM 344 " Add POSIX signals as well... 345 syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV 346 syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2 347 syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF FOPEN_MAX FILENAME_MAX L_tmpnam 348 syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout EXIT_FAILURE EXIT_SUCCESS RAND_MAX 349 " used in assert.h 350 syn keyword cConstant NDEBUG 351 " POSIX 2001 352 syn keyword cConstant SIGBUS SIGPOLL SIGPROF SIGSYS SIGURG SIGVTALRM SIGXCPU SIGXFSZ 353 " non-POSIX signals 354 syn keyword cConstant SIGWINCH SIGINFO 355 " Add POSIX errors as well. List comes from: 356 " http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 357 syn keyword cConstant E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF 358 syn keyword cConstant EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK 359 syn keyword cConstant EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTUNREACH EIDRM EILSEQ 360 syn keyword cConstant EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE 361 syn keyword cConstant EMULTIHOP ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODATA 362 syn keyword cConstant ENODEV ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG ENOPROTOOPT ENOSPC ENOSR 363 syn keyword cConstant ENOSTR ENOSYS ENOTBLK ENOTCONN ENOTDIR ENOTEMPTY ENOTRECOVERABLE ENOTSOCK ENOTSUP 364 syn keyword cConstant ENOTTY ENXIO EOPNOTSUPP EOVERFLOW EOWNERDEAD EPERM EPIPE EPROTO 365 syn keyword cConstant EPROTONOSUPPORT EPROTOTYPE ERANGE EROFS ESPIPE ESRCH ESTALE ETIME ETIMEDOUT 366 syn keyword cConstant ETXTBSY EWOULDBLOCK EXDEV 367 " math.h 368 syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4 369 syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2 370endif 371if !exists("c_no_c99") " ISO C99 372 syn keyword cConstant true false 373endif 374 375" Accept %: for # (C99) 376syn region cPreCondit start="^\s*\zs\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError 377syn match cPreConditMatch display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>" 378if !exists("c_no_if0") 379 syn cluster cCppOutInGroup contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip 380 syn region cCppOutWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold 381 syn region cCppOutIf contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse 382 if !exists("c_no_if0_fold") 383 syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold 384 else 385 syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell 386 endif 387 syn region cCppOutElse contained matchgroup=cCppOutWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit 388 syn region cCppInWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold 389 syn region cCppInIf contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit 390 if !exists("c_no_if0_fold") 391 syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold 392 else 393 syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 394 endif 395 syn region cCppInElse2 contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell 396 syn region cCppOutSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip 397 syn region cCppInSkip contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(if\s\+\(\d\+\s*\($\|//\|/\*\||\|&\)\)\@!\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" containedin=cCppOutElse,cCppInIf,cCppInSkip contains=TOP,cPreProc 398endif 399syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ 400syn match cIncluded display contained "<[^>]*>" 401syn match cInclude display "^\s*\zs\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded 402"syn match cLineSkip "\\$" 403syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cErrInParen,cErrInBracket,cUserLabel,cSpecial,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cString,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cParen,cBracket,cMulti,cBadBlock 404syn region cDefine start="^\s*\zs\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell 405syn region cPreProc start="^\s*\zs\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell 406 407" Optional embedded Autodoc parsing 408if exists("c_autodoc") 409 syn match cAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@cAutodoc containedin=cComment,cCommentL 410 syn cluster cCommentGroup add=cAutodocReal 411 syn cluster cPreProcGroup add=cAutodocReal 412endif 413 414" Highlight User Labels 415syn cluster cMultiGroup contains=cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cCppParen,cCppBracket,cCppString 416if s:ft ==# 'c' || exists("cpp_no_cpp11") 417 syn region cMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell,@cStringGroup 418endif 419" Avoid matching foo::bar() in C++ by requiring that the next char is not ':' 420syn cluster cLabelGroup contains=cUserLabel 421syn match cUserCont display "^\s*\zs\I\i*\s*:$" contains=@cLabelGroup 422syn match cUserCont display ";\s*\zs\I\i*\s*:$" contains=@cLabelGroup 423if s:ft ==# 'cpp' 424 syn match cUserCont display "^\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 425 syn match cUserCont display ";\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 426else 427 syn match cUserCont display "^\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 428 syn match cUserCont display ";\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 429endif 430 431syn match cUserLabel display "\I\i*" contained 432 433" Avoid recognizing most bitfields as labels 434syn match cBitField display "^\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType 435syn match cBitField display ";\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType 436 437if exists("c_minlines") 438 let b:c_minlines = c_minlines 439else 440 if !exists("c_no_if0") 441 let b:c_minlines = 50 " #if 0 constructs can be long 442 else 443 let b:c_minlines = 15 " mostly for () constructs 444 endif 445endif 446if exists("c_curly_error") 447 syn sync fromstart 448else 449 exec "syn sync ccomment cComment minlines=" . b:c_minlines 450endif 451 452" Define the default highlighting. 453" Only used when an item doesn't have highlighting yet 454hi def link cFormat cSpecial 455hi def link cCppString cString 456hi def link cCommentL cComment 457hi def link cCommentStart cComment 458hi def link cLabel Label 459hi def link cUserLabel Label 460hi def link cConditional Conditional 461hi def link cRepeat Repeat 462hi def link cCharacter Character 463hi def link cSpecialCharacter cSpecial 464hi def link cNumber Number 465hi def link cOctal Number 466hi def link cOctalZero PreProc " link this to Error if you want 467hi def link cFloat Float 468hi def link cOctalError cError 469hi def link cParenError cError 470hi def link cErrInParen cError 471hi def link cErrInBracket cError 472hi def link cCommentError cError 473hi def link cCommentStartError cError 474hi def link cSpaceError cError 475hi def link cWrongComTail cError 476hi def link cSpecialError cError 477hi def link cCurlyError cError 478hi def link cOperator Operator 479hi def link cStructure Structure 480hi def link cTypedef Structure 481hi def link cStorageClass StorageClass 482hi def link cInclude Include 483hi def link cPreProc PreProc 484hi def link cDefine Macro 485hi def link cIncluded cString 486hi def link cError Error 487hi def link cStatement Statement 488hi def link cCppInWrapper cCppOutWrapper 489hi def link cCppOutWrapper cPreCondit 490hi def link cPreConditMatch cPreCondit 491hi def link cPreCondit PreCondit 492hi def link cType Type 493hi def link cConstant Constant 494hi def link cCommentString cString 495hi def link cComment2String cString 496hi def link cCommentSkip cComment 497hi def link cString String 498hi def link cComment Comment 499hi def link cSpecial SpecialChar 500hi def link cTodo Todo 501hi def link cBadContinuation Error 502hi def link cCppOutSkip cCppOutIf2 503hi def link cCppInElse2 cCppOutIf2 504hi def link cCppOutIf2 cCppOut 505hi def link cCppOut Comment 506 507let b:current_syntax = "c" 508 509unlet s:ft 510 511let &cpo = s:cpo_save 512unlet s:cpo_save 513" vim: ts=8 514