📄 c.vim
字号:
" Vim syntax file" Language: C" Maintainer: Bram Moolenaar <Bram@vim.org>" Last Change: 2001 May 17" For version 5.x: Clear all syntax items" For version 6.x: Quit when a syntax file was already loadedif version < 600 syntax clearelseif 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 dosyn 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 " cCppString: same as cString, but ends at end of line syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecialelse syn match cFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([diuoxXfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained syn match cFormat display "%%" contained syn region cString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat " cCppString: same as cString, but ends at end of line syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormatendifsyn 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"catch errors caused by wrong parenthesis and bracketssyn 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_bracket_error") syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cCppString " 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 syn match cParenError display ")" syn match cErrInParen display contained "[{}]"else syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,cCppString " 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 syn match cParenError display "[\])]" syn match cErrInParen display contained "[\]{}]" syn region cBracket transparent start='\[' end=']' contains=ALLBUT,@cParenGroup,cErrInParen,cCppParen,cCppBracket,cCppString " 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 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]\=\>"" flag an octal number with wrong digitssyn match cOctalError display contained "0\o*[89]\d*"syn case matchif 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 syntax region cComment matchgroup=cCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceErrorelse syn region cCommentL start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError syn region cComment matchgroup=cCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceErrorendif" keep a // comment separately, it terminates a preproc. conditionalsyntax match cCommentError display "\*/"syntax match cCommentStartError display "/\*"me=e-1 containedsyn keyword cOperator sizeofif exists("c_gnu") 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 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_tendifif exists("c_gnu") syn keyword cType __label__ __complex__endifsyn 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_ansi") || exists("c_ansi_constants") || exists("c_gnu") if exists("c_gnu") syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ 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 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 EDOM ERANGE 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 SIGQUIT SIGTRAP SIGKILL SIGUSR1 SIGUSR2 SIGPIPE syn keyword cConstant SIGALRM SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU syn keyword cConstant _IOFBF _IOLBF _IONBF BUFSIZ EOF 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 " 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_2endifsyn 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") syn region cCppOut start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=cCppOut2 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 contains=ALLBUT,@cPreProcGroupsyn region cPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup" 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" 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=@cLabelGroupsyn match cUserLabel display "\I\i*" contained" Avoid recognizing most bitfields as labelssyn match cBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1syn match cBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1if 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." For version 5.7 and earlier: only when not done already" For version 5.8 and later: only when an item doesn't have highlighting yetif version >= 508 || !exists("did_c_syn_inits") if version < 508 let did_c_syn_inits = 1 command -nargs=+ HiLink hi link <args> else command -nargs=+ HiLink hi def link <args> endif HiLink cFormat cSpecial HiLink cCppString cString HiLink cCommentL cComment HiLink cCommentStart cComment HiLink cLabel Label HiLink cUserLabel Label HiLink cConditional Conditional HiLink cRepeat Repeat HiLink cCharacter Character HiLink cSpecialCharacter cSpecial HiLink cNumber Number HiLink cOctal Number HiLink cOctalZero PreProc " link this to Error if you want HiLink cFloat Float HiLink cOctalError cError HiLink cParenError cError HiLink cErrInParen cError HiLink cErrInBracket cError HiLink cCommentError cError HiLink cCommentStartError cError HiLink cSpaceError cError HiLink cSpecialError cError HiLink cOperator Operator HiLink cStructure Structure HiLink cStorageClass StorageClass HiLink cInclude Include HiLink cPreProc PreProc HiLink cDefine Macro HiLink cIncluded cString HiLink cError Error HiLink cStatement Statement HiLink cPreCondit PreCondit HiLink cType Type HiLink cConstant Constant HiLink cCommentString cString HiLink cComment2String cString HiLink cCommentSkip cComment HiLink cString String HiLink cComment Comment HiLink cSpecial SpecialChar HiLink cTodo Todo HiLink cCppSkip cCppOut HiLink cCppOut2 cCppOut HiLink cCppOut Comment delcommand HiLinkendiflet b:current_syntax = "c"" vim: ts=8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -