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