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