358 lines · 18.0 KB · Text
RawDownload
" Vim syntax file" Language:	C" Maintainer:	Bram Moolenaar <Bram@vim.org>" Last Change:	2007 Feb 13 " Quit when a (custom) syntax file was already loadedif exists("b:current_syntax")  finishendif " A bunch of useful C keywordssyn keyword	cStatement	goto break return continue asmsyn keyword	cLabel		case defaultsyn keyword	cConditional	if else switchsyn keyword	cRepeat		while for do syn keyword	cTodo		contained TODO FIXME XXX " cCommentGroup allows adding matches for special things in commentssyn cluster	cCommentGroup	contains=cTodo " String and Character constants" Highlight special characters (those which have a backslash) differentlysyn match	cSpecial	display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"if !exists("c_no_utf")  syn match	cSpecial	display contained "\\\(u\x\{4}\|U\x\{8}\)"endifif exists("c_no_cformat")  syn region	cString		start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,@Spell  " cCppString: same as cString, but ends at end of line  syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,@Spellelse  if !exists("c_no_c99") " ISO C99    syn match	cFormat		display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained  else    syn match	cFormat		display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained  endif  syn match	cFormat		display "%%" contained  syn region	cString		start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell  " cCppString: same as cString, but ends at end of line  syn region	cCppString	start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spellendif syn match	cCharacter	"L\='[^\\]'"syn match	cCharacter	"L'[^']*'" contains=cSpecialif exists("c_gnu")  syn match	cSpecialError	"L\='\\[^'\"?\\abefnrtv]'"  syn match	cSpecialCharacter "L\='\\['\"?\\abefnrtv]'"else  syn match	cSpecialError	"L\='\\[^'\"?\\abfnrtv]'"  syn match	cSpecialCharacter "L\='\\['\"?\\abfnrtv]'"endifsyn match	cSpecialCharacter display "L\='\\\o\{1,3}'"syn match	cSpecialCharacter display "'\\x\x\{1,2}'"syn match	cSpecialCharacter display "L'\\x\x\+'" "when wanted, highlight trailing white spaceif exists("c_space_errors")  if !exists("c_no_trail_space_error")    syn match	cSpaceError	display excludenl "\s\+$"  endif  if !exists("c_no_tab_space_error")    syn match	cSpaceError	display " \+\t"me=e-1  endifendif " This should be before cErrInParen to avoid problems with #define ({ xxx })syntax region	cBlock		start="{" end="}" transparent fold "catch errors caused by wrong parenthesis and brackets" also accept <% for {, %> for }, <: for [ and :> for ] (C99)" But avoid matching <::.syn cluster	cParenGroup	contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cCommentSkip,cOctalZero,cCppOut,cCppOut2,cCppSkip,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersComif exists("c_no_curly_error")  syn region	cParen		transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cCppString,@Spell  " cCppParen: same as cParen but ends at end-of-line; used in cDefine  syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell  syn match	cParenError	display ")"  syn match	cErrInParen	display contained "^[{}]\|^<%\|^%>"elseif exists("c_no_bracket_error")  syn region	cParen		transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cCppString,@Spell  " cCppParen: same as cParen but ends at end-of-line; used in cDefine  syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell  syn match	cParenError	display ")"  syn match	cErrInParen	display contained "[{}]\|<%\|%>"else  syn region	cParen		transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,cCppString,@Spell  " cCppParen: same as cParen but ends at end-of-line; used in cDefine  syn region	cCppParen	transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell  syn match	cParenError	display "[\])]"  syn match	cErrInParen	display contained "[\]{}]\|<%\|%>"  syn region	cBracket	transparent start='\[\|<::\@!' end=']\|:>' contains=ALLBUT,@cParenGroup,cErrInParen,cCppParen,cCppBracket,cCppString,@Spell  " cCppBracket: same as cParen but ends at end-of-line; used in cDefine  syn region	cCppBracket	transparent start='\[\|<::\@!' skip='\\$' excludenl end=']\|:>' end='$' contained contains=ALLBUT,@cParenGroup,cErrInParen,cParen,cBracket,cString,@Spell  syn match	cErrInBracket	display contained "[);{}]\|<%\|%>"endif "integer number, or floating point number without a dot and with "f".syn case ignoresyn match	cNumbers	display transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalError,cOctal" Same, but without octal error (for comments)syn match	cNumbersCom	display contained transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalsyn match	cNumber		display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>""hex numbersyn match	cNumber		display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"" Flag the first zero of an octal number as something specialsyn match	cOctal		display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=cOctalZerosyn match	cOctalZero	display contained "\<0"syn match	cFloat		display contained "\d\+f""floating point number, with dot, optional exponentsyn match	cFloat		display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=""floating point number, starting with a dot, optional exponentsyn match	cFloat		display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>""floating point number, without dot, with exponentsyn match	cFloat		display contained "\d\+e[-+]\=\d\+[fl]\=\>"if !exists("c_no_c99")  "hexadecimal floating point number, optional leading digits, with dot, with exponent  syn match	cFloat		display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"  "hexadecimal floating point number, with leading digits, optional dot, with exponent  syn match	cFloat		display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"endif " flag an octal number with wrong digitssyn match	cOctalError	display contained "0\o*[89]\d*"syn case match if exists("c_comment_strings")  " A comment can contain cString, cCharacter and cNumber.  " But a "*/" inside a cString in a cComment DOES end the comment!  So we  " need to use a special type of cString: cCommentString, which also ends on  " "*/", and sees a "*" at the start of the line as comment again.  " Unfortunately this doesn't very well work for // type of comments :-(  syntax match	cCommentSkip	contained "^\s*\*\($\|\s\+\)"  syntax region cCommentString	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=cSpecial,cCommentSkip  syntax region cComment2String	contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=cSpecial  syntax region  cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError,@Spell  if exists("c_no_comment_fold")    " Use "extend" here to have preprocessor lines not terminate halfway a    " comment.    syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell extend  else    syntax region cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell fold extend  endifelse  syn region	cCommentL	start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell  if exists("c_no_comment_fold")    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell  else    syn region	cComment	matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold  endifendif" keep a // comment separately, it terminates a preproc. conditionalsyntax match	cCommentError	display "\*/"syntax match	cCommentStartError display "/\*"me=e-1 contained syn keyword	cOperator	sizeofif exists("c_gnu")  syn keyword	cStatement	__asm__  syn keyword	cOperator	typeof __real__ __imag__endifsyn keyword	cType		int long short char voidsyn keyword	cType		signed unsigned float doubleif !exists("c_no_ansi") || exists("c_ansi_typedefs")  syn keyword   cType		size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t  syn keyword   cType		clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t  syn keyword   cType		mbstate_t wctrans_t wint_t wctype_tendifif !exists("c_no_c99") " ISO C99  syn keyword	cType		bool complex  syn keyword	cType		int8_t int16_t int32_t int64_t  syn keyword	cType		uint8_t uint16_t uint32_t uint64_t  syn keyword	cType		int_least8_t int_least16_t int_least32_t int_least64_t  syn keyword	cType		uint_least8_t uint_least16_t uint_least32_t uint_least64_t  syn keyword	cType		int_fast8_t int_fast16_t int_fast32_t int_fast64_t  syn keyword	cType		uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t  syn keyword	cType		intptr_t uintptr_t  syn keyword	cType		intmax_t uintmax_tendifif exists("c_gnu")  syn keyword	cType		__label__ __complex__ __volatile__endif syn keyword	cStructure	struct union enum typedefsyn keyword	cStorageClass	static register auto volatile extern constif exists("c_gnu")  syn keyword	cStorageClass	inline __attribute__endifif !exists("c_no_c99")  syn keyword	cStorageClass	inline restrictendif if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")  if exists("c_gnu")    syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ __func__  endif  syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__  syn keyword cConstant __STDC_VERSION__  syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX  syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX  syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN  syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX  syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN  syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX  if !exists("c_no_c99")    syn keyword cConstant __func__    syn keyword cConstant LLONG_MAX ULLONG_MAX    syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN    syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX    syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX    syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN    syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX    syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX    syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN    syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX    syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX    syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX    syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX    syn keyword cConstant PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX    syn keyword cConstant SIZE_MAX WCHAR_MIN WCHAR_MAX WINT_MIN WINT_MAX  endif  syn keyword cConstant FLT_RADIX FLT_ROUNDS  syn keyword cConstant FLT_DIG FLT_MANT_DIG FLT_EPSILON  syn keyword cConstant DBL_DIG DBL_MANT_DIG DBL_EPSILON  syn keyword cConstant LDBL_DIG LDBL_MANT_DIG LDBL_EPSILON  syn keyword cConstant FLT_MIN FLT_MAX FLT_MIN_EXP FLT_MAX_EXP  syn keyword cConstant FLT_MIN_10_EXP FLT_MAX_10_EXP  syn keyword cConstant DBL_MIN DBL_MAX DBL_MIN_EXP DBL_MAX_EXP  syn keyword cConstant DBL_MIN_10_EXP DBL_MAX_10_EXP  syn keyword cConstant LDBL_MIN LDBL_MAX LDBL_MIN_EXP LDBL_MAX_EXP  syn keyword cConstant LDBL_MIN_10_EXP LDBL_MAX_10_EXP  syn keyword cConstant HUGE_VAL CLOCKS_PER_SEC NULL  syn keyword cConstant LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY  syn keyword cConstant LC_NUMERIC LC_TIME  syn keyword cConstant SIG_DFL SIG_ERR SIG_IGN  syn keyword cConstant SIGABRT SIGFPE SIGILL SIGHUP SIGINT SIGSEGV SIGTERM  " Add POSIX signals as well...  syn keyword cConstant SIGABRT SIGALRM SIGCHLD SIGCONT SIGFPE SIGHUP  syn keyword cConstant SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV  syn keyword cConstant SIGSTOP SIGTERM SIGTRAP SIGTSTP SIGTTIN SIGTTOU  syn keyword cConstant SIGUSR1 SIGUSR2  syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF WEOF  syn keyword cConstant FOPEN_MAX FILENAME_MAX L_tmpnam  syn keyword cConstant SEEK_CUR SEEK_END SEEK_SET  syn keyword cConstant TMP_MAX stderr stdin stdout  syn keyword cConstant EXIT_FAILURE EXIT_SUCCESS RAND_MAX  " Add POSIX errors as well  syn keyword cConstant E2BIG EACCES EAGAIN EBADF EBADMSG EBUSY  syn keyword cConstant ECANCELED ECHILD EDEADLK EDOM EEXIST EFAULT  syn keyword cConstant EFBIG EILSEQ EINPROGRESS EINTR EINVAL EIO EISDIR  syn keyword cConstant EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENFILE ENODEV  syn keyword cConstant ENOENT ENOEXEC ENOLCK ENOMEM ENOSPC ENOSYS  syn keyword cConstant ENOTDIR ENOTEMPTY ENOTSUP ENOTTY ENXIO EPERM  syn keyword cConstant EPIPE ERANGE EROFS ESPIPE ESRCH ETIMEDOUT EXDEV  " math.h  syn keyword cConstant M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4  syn keyword cConstant M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2endifif !exists("c_no_c99") " ISO C99  syn keyword cConstant true falseendif " Accept %: for # (C99)syn region	cPreCondit	start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceErrorsyn match	cPreCondit	display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"if !exists("c_no_if0")  if !exists("c_no_if0_fold")    syn region	cCppOut		start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2 fold  else    syn region	cCppOut		start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2  endif  syn region	cCppOut2	contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cSpaceError,cCppSkip  syn region	cCppSkip	contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppSkipendifsyn region	cIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+syn match	cIncluded	display contained "<[^>]*>"syn match	cInclude	display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded"syn match cLineSkip	"\\$"syn cluster	cPreProcGroup	contains=cPreCondit,cIncluded,cInclude,cDefine,cErrInParen,cErrInBracket,cUserLabel,cSpecial,cOctalZero,cCppOut,cCppOut2,cCppSkip,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cString,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cParen,cBracket,cMultisyn region	cDefine		start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 keepend contains=ALLBUT,@cPreProcGroup,@Spellsyn region	cPreProc	start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell " Highlight User Labelssyn cluster	cMultiGroup	contains=cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,cCppOut,cCppOut2,cCppSkip,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cCppParen,cCppBracket,cCppStringsyn region	cMulti		transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'syn cluster	cLabelGroup	contains=cUserLabelsyn match	cUserCont	display "^\s*\I\i*\s*:$" contains=@cLabelGroupsyn match	cUserCont	display ";\s*\I\i*\s*:$" contains=@cLabelGroupsyn match	cUserCont	display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroupsyn match	cUserCont	display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup syn match	cUserLabel	display "\I\i*" contained " Avoid recognizing most bitfields as labelssyn match	cBitField	display "^\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cTypesyn match	cBitField	display ";\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType if exists("c_minlines")  let b:c_minlines = c_minlineselse  if !exists("c_no_if0")    let b:c_minlines = 50	" #if 0 constructs can be long  else    let b:c_minlines = 15	" mostly for () constructs  endifendifexec "syn sync ccomment cComment minlines=" . b:c_minlines " Define the default highlighting." Only used when an item doesn't have highlighting yethi def link cFormat		cSpecialhi def link cCppString		cStringhi def link cCommentL		cCommenthi def link cCommentStart	cCommenthi def link cLabel		Labelhi def link cUserLabel		Labelhi def link cConditional	Conditionalhi def link cRepeat		Repeathi def link cCharacter		Characterhi def link cSpecialCharacter	cSpecialhi def link cNumber		Numberhi def link cOctal		Numberhi def link cOctalZero		PreProc	 " link this to Error if you wanthi def link cFloat		Floathi def link cOctalError		cErrorhi def link cParenError		cErrorhi def link cErrInParen		cErrorhi def link cErrInBracket	cErrorhi def link cCommentError	cErrorhi def link cCommentStartError	cErrorhi def link cSpaceError		cErrorhi def link cSpecialError	cErrorhi def link cOperator		Operatorhi def link cStructure		Structurehi def link cStorageClass	StorageClasshi def link cInclude		Includehi def link cPreProc		PreProchi def link cDefine		Macrohi def link cIncluded		cStringhi def link cError		Errorhi def link cStatement		Statementhi def link cPreCondit		PreCondithi def link cType		Typehi def link cConstant		Constanthi def link cCommentString	cStringhi def link cComment2String	cStringhi def link cCommentSkip	cCommenthi def link cString		Stringhi def link cComment		Commenthi def link cSpecial		SpecialCharhi def link cTodo		Todohi def link cCppSkip		cCppOuthi def link cCppOut2		cCppOuthi def link cCppOut		Comment let b:current_syntax = "c" " vim: ts=8