1" Vim syntax file 2" Language: C 3" Maintainer: Bram Moolenaar <[email protected]> 4" Last Change: 2018 Sep 21 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=')' end='}'me=s-1 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 cStructure struct union enum typedef 276syn keyword cStorageClass static register auto volatile extern const 277if exists("c_gnu") 278 syn keyword cStorageClass inline __attribute__ 279endif 280if !exists("c_no_c99") && s:ft !=# 'cpp' 281 syn keyword cStorageClass inline restrict 282endif 283if !exists("c_no_c11") 284 syn keyword cStorageClass _Alignas alignas 285 syn keyword cOperator _Alignof alignof 286 syn keyword cStorageClass _Atomic 287 syn keyword cOperator _Generic 288 syn keyword cStorageClass _Noreturn noreturn 289 syn keyword cOperator _Static_assert static_assert 290 syn keyword cStorageClass _Thread_local thread_local 291 syn keyword cType char16_t char32_t 292endif 293 294if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu") 295 if exists("c_gnu") 296 syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ __func__ 297 endif 298 syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ 299 syn keyword cConstant __STDC_VERSION__ 300 syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX 301 syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX 302 syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN 303 syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX 304 syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN 305 syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX 306 if !exists("c_no_c99") 307 syn keyword cConstant __func__ __VA_ARGS__ 308 syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX 309 syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN 310 syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX 311 syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX 312 syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN 313 syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX 314 syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX 315 syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN 316 syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX 317 syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX 318 syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX 319 syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX 320 syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX 321 syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX 322 endif 323 syn keyword cConstant FLT_RADIX FLT_ROUNDS FLT_DIG FLT_MANT_DIG FLT_EPSILON DBL_DIG DBL_MANT_DIG DBL_EPSILON 324 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 325 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 326 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 327 syn keyword cConstant LC_NUMERIC LC_TIME SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM 328 " Add POSIX signals as well... 329 syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV 330 syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2 331 syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF FOPEN_MAX FILENAME_MAX L_tmpnam 332 syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET TMP_MAX stderr stdin stdout EXIT_FAILURE EXIT_SUCCESS RAND_MAX 333 " POSIX 2001 334 syn keyword cConstant SIGBUS SIGPOLL SIGPROF SIGSYS SIGURG SIGVTALRM SIGXCPU SIGXFSZ 335 " non-POSIX signals 336 syn keyword cConstant SIGWINCH SIGINFO 337 " Add POSIX errors as well. List comes from: 338 " http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 339 syn keyword cConstant E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF 340 syn keyword cConstant EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK 341 syn keyword cConstant EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTUNREACH EIDRM EILSEQ 342 syn keyword cConstant EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE 343 syn keyword cConstant EMULTIHOP ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODATA 344 syn keyword cConstant ENODEV ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG ENOPROTOOPT ENOSPC ENOSR 345 syn keyword cConstant ENOSTR ENOSYS ENOTCONN ENOTDIR ENOTEMPTY ENOTRECOVERABLE ENOTSOCK ENOTSUP 346 syn keyword cConstant ENOTTY ENXIO EOPNOTSUPP EOVERFLOW EOWNERDEAD EPERM EPIPE EPROTO 347 syn keyword cConstant EPROTONOSUPPORT EPROTOTYPE ERANGE EROFS ESPIPE ESRCH ESTALE ETIME ETIMEDOUT 348 syn keyword cConstant ETXTBSY EWOULDBLOCK EXDEV 349 " math.h 350 syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4 351 syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2 352endif 353if !exists("c_no_c99") " ISO C99 354 syn keyword cConstant true false 355endif 356 357" Accept %: for # (C99) 358syn region cPreCondit start="^\s*\zs\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError 359syn match cPreConditMatch display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>" 360if !exists("c_no_if0") 361 syn cluster cCppOutInGroup contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip 362 syn region cCppOutWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold 363 syn region cCppOutIf contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse 364 if !exists("c_no_if0_fold") 365 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 366 else 367 syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell 368 endif 369 syn region cCppOutElse contained matchgroup=cCppOutWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit 370 syn region cCppInWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold 371 syn region cCppInIf contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit 372 if !exists("c_no_if0_fold") 373 syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold 374 else 375 syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 376 endif 377 syn region cCppInElse2 contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell 378 syn region cCppOutSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip 379 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 380endif 381syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ 382syn match cIncluded display contained "<[^>]*>" 383syn match cInclude display "^\s*\zs\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded 384"syn match cLineSkip "\\$" 385syn 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 386syn region cDefine start="^\s*\zs\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell 387syn region cPreProc start="^\s*\zs\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell 388 389" Optional embedded Autodoc parsing 390if exists("c_autodoc") 391 syn match cAutodocReal display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@cAutodoc containedin=cComment,cCommentL 392 syn cluster cCommentGroup add=cAutodocReal 393 syn cluster cPreProcGroup add=cAutodocReal 394endif 395 396" Highlight User Labels 397syn 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 398if s:ft ==# 'c' || exists("cpp_no_cpp11") 399 syn region cMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell,@cStringGroup 400endif 401" Avoid matching foo::bar() in C++ by requiring that the next char is not ':' 402syn cluster cLabelGroup contains=cUserLabel 403syn match cUserCont display "^\s*\zs\I\i*\s*:$" contains=@cLabelGroup 404syn match cUserCont display ";\s*\zs\I\i*\s*:$" contains=@cLabelGroup 405if s:ft ==# 'cpp' 406 syn match cUserCont display "^\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 407 syn match cUserCont display ";\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 408else 409 syn match cUserCont display "^\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 410 syn match cUserCont display ";\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup 411endif 412 413syn match cUserLabel display "\I\i*" contained 414 415" Avoid recognizing most bitfields as labels 416syn match cBitField display "^\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType 417syn match cBitField display ";\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType 418 419if exists("c_minlines") 420 let b:c_minlines = c_minlines 421else 422 if !exists("c_no_if0") 423 let b:c_minlines = 50 " #if 0 constructs can be long 424 else 425 let b:c_minlines = 15 " mostly for () constructs 426 endif 427endif 428if exists("c_curly_error") 429 syn sync fromstart 430else 431 exec "syn sync ccomment cComment minlines=" . b:c_minlines 432endif 433 434" Define the default highlighting. 435" Only used when an item doesn't have highlighting yet 436hi def link cFormat cSpecial 437hi def link cCppString cString 438hi def link cCommentL cComment 439hi def link cCommentStart cComment 440hi def link cLabel Label 441hi def link cUserLabel Label 442hi def link cConditional Conditional 443hi def link cRepeat Repeat 444hi def link cCharacter Character 445hi def link cSpecialCharacter cSpecial 446hi def link cNumber Number 447hi def link cOctal Number 448hi def link cOctalZero PreProc " link this to Error if you want 449hi def link cFloat Float 450hi def link cOctalError cError 451hi def link cParenError cError 452hi def link cErrInParen cError 453hi def link cErrInBracket cError 454hi def link cCommentError cError 455hi def link cCommentStartError cError 456hi def link cSpaceError cError 457hi def link cWrongComTail cError 458hi def link cSpecialError cError 459hi def link cCurlyError cError 460hi def link cOperator Operator 461hi def link cStructure Structure 462hi def link cStorageClass StorageClass 463hi def link cInclude Include 464hi def link cPreProc PreProc 465hi def link cDefine Macro 466hi def link cIncluded cString 467hi def link cError Error 468hi def link cStatement Statement 469hi def link cCppInWrapper cCppOutWrapper 470hi def link cCppOutWrapper cPreCondit 471hi def link cPreConditMatch cPreCondit 472hi def link cPreCondit PreCondit 473hi def link cType Type 474hi def link cConstant Constant 475hi def link cCommentString cString 476hi def link cComment2String cString 477hi def link cCommentSkip cComment 478hi def link cString String 479hi def link cComment Comment 480hi def link cSpecial SpecialChar 481hi def link cTodo Todo 482hi def link cBadContinuation Error 483hi def link cCppOutSkip cCppOutIf2 484hi def link cCppInElse2 cCppOutIf2 485hi def link cCppOutIf2 cCppOut 486hi def link cCppOut Comment 487 488let b:current_syntax = "c" 489 490unlet s:ft 491 492let &cpo = s:cpo_save 493unlet s:cpo_save 494" vim: ts=8 495