New pike.vim (Re: Newlines in strings)
"Stephen R. van den Berg" <[email protected]> Fri, 12 Jan 2018 12:17:59 +0100
| Newsgroups | gmane.comp.lang.pike.devel,gmane.comp.lang.pike.user |
|---|---|
| Message-ID | <[email protected]> |
Tobias S. Josefowitz wrote: >On Mon, Jan 8, 2018 at 4:17 PM, Stephen R. van den Berg <[email protected]> wrote: >> Vim syntax colouring goes berzerk, though ;-). >I have had some success with this one: >https://github.com/vim-scripts/pike.vim/blob/master/syntax/pike.vim Yes. And then I see a lot of things it could do better, like: - Highlighting the index values in declared mappings. - Highlighting the embedded binding parameters in SQL queries. - Using SQL-syntax highlighting in multiline strings. - Working missing parenthesis errors for *all* supported Pike paren types (which includes arrays, mappings, multisets, advisory casts, ranges, indexing, embedded lambdas). - Highlighting MutexKey operations. - Showing grayed out #if 0 or #if 1 #else sections. - Supporting cycling through all coherent preprocessor conditionals. So I took the current c.vim, and then repaired and transmogrified it into a pike.vim which does all of the above and more (it supports all pike 8.1 constructs I could find). File is attached for the vim users on this list; I've submitted it to Vim upstream as well. -- Stephen.
pike.vim
(text/plain, 20.4 KB)
" Vim syntax file " Language: Pike " Maintainer: Stephen R. van den Berg <[email protected]> " Last Change: 2018 Jan 12 " Version: 2.0 " Derived from the C-syntax; fixed several bugs in the C-syntax " and extended it with the Pike syntax. " Includes a highlighter for SQL on multiline strings. " Includes a highlighter for all types of parenthesis errors, Pike style. " Quit when a (custom) syntax file was already loaded if exists("b:current_syntax") finish endif let s:cpo_save = &cpo set cpo&vim " For multiline strings, try formatting them as SQL syn include @pikeSQL <sfile>:p:h/sqloracle.vim " For embedded Autodoc documentation (WIP) "syn include @pikeAutodoc <sfile>:p:h/autodoc.vim syn case match " Supports array, multiset, mapping multi-character delimiter matching " Supports rotating amongst several same-level preprocessor conditionals packadd! matchit let b:match_words = "({:}\\@1<=),(\\[:]\\@1<=),(<:>\\@1<=),^\s*#\s*\%(if\%(n\?def\)\|else\|el\%(se\)\?if\|endif\)\>" " A bunch of useful Pike keywords syn keyword pikeStatement break return continue syn keyword pikeDebug gauge backtrace describe_backtrace werror _Static_assert static_assert syn keyword pikeException error catch throw syn keyword pikeLabel case default syn keyword pikeConditional if else switch syn keyword pikeRepeat while for foreach do syn keyword pikePredef RegGetKeyNames RegGetValue RegGetValues syn keyword pikePredef __automap__ __empty_program syn keyword pikePredef __handle_sprintf_format __parse_pike_type _disable_threads syn keyword pikePredef _do_call_outs _exit _gdb_breakpoint syn keyword pikePredef abs access acos acosh add_constant alarm all_constants syn keyword pikePredef array_sscanf asin asinh atan atan2 atanh atexit syn keyword pikePredef basetype call_function call_out call_out_info cd ceil syn keyword pikePredef combine_path combine_path_amigaos combine_path_nt syn keyword pikePredef combine_path_unix compile copy_value cos cosh cpp crypt syn keyword pikePredef ctime decode_value delay encode_value encode_value_canonic syn keyword pikePredef enumerate errno exece exit exp file_stat file_truncate syn keyword pikePredef filesystem_stat find_call_out floor fork function_name syn keyword pikePredef function_object function_program gc syn keyword pikePredef get_active_compilation_handler get_active_error_handler syn keyword pikePredef get_all_groups get_all_users get_dir get_groups_for_user syn keyword pikePredef get_iterator get_profiling_info get_weak_flag getcwd syn keyword pikePredef getgrgid getgrnam gethrdtime gethrtime gethrvtime getpid syn keyword pikePredef getpwnam getpwuid getxattr glob gmtime has_index has_prefix syn keyword pikePredef has_suffix has_value hash hash_7_0 hash_7_4 hash_8_0 syn keyword pikePredef hash_value kill limit listxattr load_module localtime syn keyword pikePredef log lower_case master max min mkdir mktime mv syn keyword pikePredef object_program pow query_num_arg random_seed syn keyword pikePredef remove_call_out removexattr replace_master rm round syn keyword pikePredef set_priority set_weak_flag setxattr sgn signal signame syn keyword pikePredef signum sin sinh sleep sort sprintf sqrt sscanf strerror syn keyword pikePredef string_filter_non_unicode string_to_unicode string_to_utf8 syn keyword pikePredef tan tanh time trace types ualarm unicode_to_string syn keyword pikePredef upper_case utf8_to_string version syn keyword pikePredef write lock try_lock syn keyword pikePredef MutexKey Timestamp Date Time TimeTZ Interval Inet Range syn keyword pikePredef Null null inf nan syn keyword pikeTodo contained TODO FIXME XXX " Match parengroups: allows for highlighting indices of mappings and " highlighting semicolons that are out of place due to a paren imbalance syn cluster pikePreShort contains=pikeDefine,pikePreProc,pikeCppOutWrapper,pikeCppInWrapper syn cluster pikeExprGroup contains=@pikeMappElm,pikeMappIndex,@pikeStmt,pikeStmts,@pikeExpr,pikeColon,pikeDoublecolon,pikeSemicolon,pikeComma,pikeNest,pikeBadClose,pikeAdvCast syn match pikeWord transparent display contained /[^()'"[\]{},;:]\+/ contains=ALLBUT,@pikePreProcGroup,@pikeExprGroup syn match pikeFirstWord transparent display contained /^\s*#[^()'"[\]{},;:]\+/ contains=@pikePreShort syn cluster pikeMappElm contains=pikeMappIndex,@pikeStmt syn cluster pikeStmt contains=pikeFirstWord,pikeCharacter,pikeString,pikeMlString,pikeWord,pikeNest,pikeDoublecolon syn cluster pikeStmts contains=@pikeStmt,pikeColon,pikeSemicolon syn cluster pikeExpr contains=@pikeStmt,pikeComma syn match pikeColon contained ":\@1<!::\@!" syn match pikeDoublecolon transparent display contained "::" syn match pikeSemicolon transparent display contained ";" syn match pikeComma transparent display contained "," syn match pikeBadClose display contained ";" syn region pikeNest transparent start="(\@1<!{" end="}" contains=@pikeStmts syn region pikeNest transparent start="\%([^a-zA-Z0-9_]for\%(each\)\?\s*\)\@<!([[{<]\@!" end=")" contains=@pikeExpr,pikeBadClose syn region pikeNest transparent start="[^a-zA-Z0-9_]for\%(each\)\?\s*(" end=")" contains=@pikeStmts syn region pikeNest transparent start="(\@1<!\[" end="]" contains=@pikeExpr,pikeBadClose syn region pikeNest transparent start="(\[" end="])" contains=@pikeMappElm,pikeComma,pikeBadClose " FIXME Cannot use hs=s+1 on advisory cast parsing; if you try, pikeBadClose " does not fire anymore syn region pikeNest transparent matchgroup=pikeAdvCast start="(\[[^,;\]]\+]" end=")" contains=@pikeStmts syn region pikeNest transparent start="({" end="})" contains=@pikeExpr,pikeBadClose " FIXME Cannot use ms=e+1 on multiset-parsing; if you try, pikeBadClose " does not fire anymore syn region pikeNest transparent start="(<" end=">)" contains=@pikeExpr,pikeBadClose keepend " It's easy to accidentally add a space after a backslash that was intended " for line continuation. Some compilers allow it, which makes it " unpredictable and should be avoided. syn match pikeBadContinuation contained "\\\s\+$" " pikeCommentGroup allows adding matches for special things in comments syn cluster pikeCommentGroup contains=pikeTodo,pikeBadContinuation " String and Character constants " Highlight special characters (those which have a backslash) differently syn match pikeSpecial display contained "\\\%(x\x*\|d\d*\|\o+\|.\|$\)" syn match pikeSpecial display contained "\\\%(u\x\{4}\|U\x\{8}\)" " ISO C11 or ISO C++ 11 if !exists("c_no_cformat") " Highlight % items in strings. syn match pikeFormat display "%\%(\d\+\$\)\=[-+' #0*]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjzt]\|ll\|hh\)\=\%([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained syn match pikeFormat display "%%" contained syn region pikeString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeFormat,@Spell keepend syn region pikeMlString start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeFormat,@Spell,pikeEmbeddedString keepend else syn region pikeString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,@Spell syn region pikeMlString transparent start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,@Spell,pikeBindings,pikeEmbeddedString keepend endif " FIXME This is supposed to match full lines in the multiline pikeMlString " Assumes SQL-syntax highlighting in multiline strings syn region pikeEmbeddedString display contained start=+^.*+ end=++ contains=@pikeSQL,pikeBindings keepend syn match pikeBindings display contained ":\@1<!:[A-Za-z][_A-Za-z0-9]*" syn match pikeCharacter "'[^\\]'" syn match pikeCharacter "'[^']*'" contains=pikeSpecial syn match pikeSpecialError "'\\[^'\"?\\abefnrtv]'" syn match pikeSpecialCharacter "'\\['\"?\\abefnrtv]'" syn match pikeSpecialCharacter display "'\\\o\+'" syn match pikeSpecialCharacter display "'\\x\x*'" syn match pikeSpecialCharacter display "'\\d\d*'" "when wanted, highlight trailing white space if exists("c_space_errors") if !exists("c_no_trail_space_error") syn match pikeSpaceError display excludenl "\s\+$" endif if !exists("c_no_tab_space_error") syn match pikeSpaceError display " \+\t"me=e-1 endif endif "integer number, or floating point number without a dot and with "f". syn case ignore syn match pikeNumbers display transparent "\<\d\|\.\d" contains=pikeNumber,pikeFloat,pikeOctalError,pikeOctal " Same, but without octal error (for comments) syn match pikeNumbersCom display contained transparent "\<\d\|\.\d" contains=pikeNumber,pikeFloat,pikeOctal syn match pikeNumber display contained "\d\+\%(u\=l\{0,2}\|ll\=u\)\>" "hex number syn match pikeNumber display contained "0x\x\+\%(u\=l\{0,2}\|ll\=u\)\>" " Flag the first zero of an octal number as something special syn match pikeOctal display contained "0\o\+\%(u\=l\{0,2}\|ll\=u\)\>" contains=pikeOctalZero syn match pikeOctalZero display contained "\<0" syn match pikeFloat display contained "\d\+f" "floating point number, with dot, optional exponent syn match pikeFloat display contained "\d\+\.[0-9.]\@!\d*\%(e[-+]\=\d\+\)\=[fl]\=" "floating point number, starting with a dot, optional exponent syn match pikeFloat display contained "[0-9.]\@1<!\.\d\+\%(e[-+]\=\d\+\)\=[fl]\=\>" "floating point number, without dot, with exponent syn match pikeFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>" "hexadecimal floating point number, optional leading digits, with dot, with exponent syn match pikeFloat display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>" "hexadecimal floating point number, with leading digits, optional dot, with exponent syn match pikeFloat display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>" " flag an octal number with wrong digits syn match pikeOctalError display contained "0\o*[89]\d*" syn case match if exists("c_comment_strings") " A comment can contain pikeString, pikeCharacter and pikeNumber. " But a "*/" inside a pikeString in a pikeComment DOES end the comment! So we " need to use a special type of pikeString: pikeCommentString, 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 :-( syn match pikeCommentSkip contained "^\s*\*\%($\|\s\+\)" syn region pikeCommentString contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=pikeSpecial,pikeCommentSkip syn region pikeComment2String contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=pikeSpecial syn region pikeCommentL start="//" skip="\\$" end="$" keepend contains=@pikeCommentGroup,pikeComment2String,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell containedin=pikeWord,pikeFirstWord if exists("c_no_comment_fold") " Use "extend" here to have preprocessor lines not terminate halfway a " comment. syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeCommentString,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell extend containedin=pikeWord,pikeFirstWord else syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeCommentString,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell fold extend containedin=pikeWord,pikeFirstWord endif else syn region pikeCommentL start="//" skip="\\$" end="$" keepend contains=@pikeCommentGroup,pikeSpaceError,@Spell containedin=pikeWord,pikeFirstWord if exists("c_no_comment_fold") syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeSpaceError,@Spell extend containedin=pikeWord,pikeFirstWord else syn region pikeComment matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeSpaceError,@Spell fold extend containedin=pikeWord,pikeFirstWord endif endif " keep a // comment separately, it terminates a preproc. conditional syn match pikeCommentError display "\*/" syn match pikeCommentStartError display "/\*"me=e-1 contained syn keyword pikeOperator sizeof syn keyword pikeOperator typeof _typeof _refs syn keyword pikeOperator zero_type intp stringp arrayp mappingp multisetp syn keyword pikeOperator objectp functionp programp callablep destructedp syn keyword pikeOperator object_variablep undefinedp syn keyword pikeOperator allocate equal syn keyword pikeOperator aggregate aggregate_mapping aggregate_multiset syn keyword pikeOperator map filter search replace reverse column rows syn keyword pikeOperator indices values mkmapping mkmultiset m_delete sort syn keyword pikeOperator m_delete destruct syn keyword pikeOperator create _destruct _sprintf cast _encode _decode syn keyword pikeOperator __hash _sizeof _values _indices __INIT _equal syn keyword pikeOperator _is_type _m_delete _get_iterator _search syn keyword pikeType int void syn keyword pikeType float syn keyword pikeType bool string array mapping multiset mixed syn keyword pikeType object function program syn keyword pikeType this this_object this_program syn keyword pikeType sprintf_args sprintf_format sprintf_result syn keyword pikeType strict_sprintf_format syn keyword pikeStructure class enum typedef inherit syn keyword pikeTypedef typedef syn keyword pikeStorageClass nomask private protected public constant final variant syn keyword pikeStorageClass inline extern static __deprecated__ lambda syn keyword pikeConstant __LINE__ __FILE__ __DIR__ __DATE__ __TIME__ syn keyword pikeConstant __AUTO_BIGNUM__ __NT__ __OS2__ syn keyword pikeConstant __BUILD__ __COUNTER__ _MAJOR__ __MINOR__ __VERSION__ syn keyword pikeConstant __REAL_BUILD__ _REAL_MAJOR__ __REAL_MINOR__ syn keyword pikeConstant __REAL_VERSION__ __PIKE__ UNDEFINED " These should actually only be parsed in preprocessor conditionals syn keyword pikeOperator defined constant efun _Pragma syn keyword pikeBoolean true false syn region pikePreCondit start="^\s*\zs#\s*\%(if\%(n\?def\)\?\|el\%(se\)\?if\)\>" skip="\\$" end="$" keepend contains=pikeComment,pikeCommentL,pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError syn match pikePreConditMatch display "^\s*\zs#\s*\%(else\|endif\)\>" if !exists("c_no_if0") syn cluster pikeCppOutInGroup contains=pikeCppInIf,pikeCppInElse,pikeCppInElse2,pikeCppOutIf,pikeCppOutIf2,pikeCppOutElse,pikeCppInSkip,pikeCppOutSkip syn region pikeCppOutWrapper start="^\s*\zs#\s*if\s\+0\+\s*\%($\|//\|/\*\|&\)" end=".\@=\|$" contains=pikeCppOutIf,pikeCppOutElse,@NoSpell fold syn region pikeCppOutIf contained start="0\+" matchgroup=pikeCppOutWrapper end="^\s*#\s*endif\>" contains=pikeCppOutIf2,pikeCppOutElse if !exists("c_no_if0_fold") syn region pikeCppOutIf2 contained matchgroup=pikeCppOutWrapper start="0\+" end="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=pikeSpaceError,pikeCppOutSkip,@Spell fold else syn region pikeCppOutIf2 contained matchgroup=pikeCppOutWrapper start="0\+" end="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=pikeSpaceError,pikeCppOutSkip,@Spell endif syn region pikeCppOutElse contained matchgroup=pikeCppOutWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)" end="^\s*#\s*endif\>"me=s-1 contains=TOP,pikePreCondit syn region pikeCppInWrapper start="^\s*\zs#\s*if\s\+0*[1-9]\d*\s*\%($\|//\|/\*\||\)" end=".\@=\|$" contains=pikeCppInIf,pikeCppInElse fold syn region pikeCppInIf contained matchgroup=pikeCppInWrapper start="\d\+" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit if !exists("c_no_if0_fold") syn region pikeCppInElse contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2 fold else syn region pikeCppInElse contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2 endif syn region pikeCppInElse2 contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)\%([^/]\|/[^/*]\)*" end="^\s*#\s*endif\>"me=s-1 contains=pikeSpaceError,pikeCppOutSkip,@Spell syn region pikeCppOutSkip contained start="^\s*#\s*if\%(n\?def\)\?\>" skip="\\$" end="^\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip syn region pikeCppInSkip contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(if\s\+\%(\d\+\s*\%($\|//\|/\*\||\|&\)\)\@!\|ifn\?def\>\)" skip="\\$" end="^\s*#\s*endif\>" containedin=pikeCppOutElse,pikeCppInIf,pikeCppInSkip contains=TOP,pikePreProc endif syn region pikeIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ syn match pikeIncluded display contained "<[^>]*>" syn match pikeInclude display "^\s*\zs#\s*include\>\s*["<]" contains=pikeIncluded "syn match pikeLineSkip "\\$" syn cluster pikePreProcGroup contains=pikePreCondit,pikeIncluded,pikeInclude,pikeDefine,pikeUserLabel,pikeSpecial,pikeOctalZero,pikeCppOutWrapper,pikeCppInWrapper,@pikeCppOutInGroup,pikeFormat,pikeNumber,pikeFloat,pikeOctal,pikeOctalError,pikeNumbersCom,pikeString,pikeMlString,pikeCommentSkip,pikeCommentString,pikeComment2String,@pikeCommentGroup,pikeCommentStartError,pikeFirstWord,pikeWord,pikeMappIndex,pikeEmbeddedString,pikeCommentL,pikeBindings,pikeBadClose,pikeAdvCast syn region pikeDefine start="^\s*\zs#\s*\%(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@pikePreProcGroup,@Spell syn region pikePreProc start="^\s*\zs#\s*\%(pragma\|charset\|pike\|require\|string\|line\|warning\|error\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@pikePreProcGroup,@Spell syn match pikeAutodocReal display contained "^\s*\%(\*\|//\)!.*$" contains=@pikeAutodoc containedin=pikeComment,pikeCommentL keepend " Highlight User Labels " Avoid matching foo::bar() in C++ by requiring that the next char is not ':' syn cluster pikeLabelGroup contains=pikeUserLabel syn match pikeUserCont display "^\s*\zs\I\i*\s*:$" contains=@pikeLabelGroup syn match pikeUserCont display ";\s*\zs\I\i*\s*:$" contains=@pikeLabelGroup syn match pikeUserCont display "^\s*\zs\%(class\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@pikeLabelGroup syn match pikeUserCont display ";\s*\zs\%(class\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@pikeLabelGroup syn match pikeUserLabel display "\I\i*" contained syn match pikeMappIndex display contained "[^<()[\]{},;:]\+::\@!" contains=NONE syn match pikeAdvCast display contained "\[[^,;\]]\+]" contains=NONE if exists("c_minlines") let b:c_minlines = c_minlines else 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 endif endif exec "syn sync ccomment pikeComment minlines=" . b:c_minlines " Define the default highlighting. " Only used when an item doesn't have highlighting yet hi def link pikeFormat pikeSpecial hi def link pikeMlString pikeString hi def link pikeCommentL pikeComment hi def link pikeCommentStart pikeComment hi def link pikeLabel Label hi def link pikeUserLabel Label hi def link pikeConditional Conditional hi def link pikeRepeat Repeat hi def link pikeCharacter Character hi def link pikeSpecialCharacter pikeSpecial hi def link pikeNumber Number hi def link pikeOctal Number hi def link pikeOctalZero PreProc " link this to Error if you want hi def link pikeFloat Float hi def link pikeOctalError pikeError hi def link pikeCommentError pikeError hi def link pikeCommentStartError pikeError hi def link pikeSpaceError pikeError hi def link pikeSpecialError pikeError hi def link pikeOperator Operator hi def link pikeStructure Structure hi def link pikeTypedef Typedef hi def link pikeStorageClass StorageClass hi def link pikeInclude Include hi def link pikePreProc PreProc hi def link pikeDefine Macro hi def link pikeIncluded pikeString hi def link pikeError Error hi def link pikeDebug Debug hi def link pikeException Exception hi def link pikeStatement Statement hi def link pikeCppInWrapper pikeCppOutWrapper hi def link pikeCppOutWrapper pikePreCondit hi def link pikePreConditMatch pikePreCondit hi def link pikePreCondit PreCondit hi def link pikeType Type hi def link pikeConstant Constant hi def link pikeBoolean Boolean hi def link pikeCommentString pikeString hi def link pikeComment2String pikeString hi def link pikeCommentSkip pikeComment hi def link pikeString String hi def link pikeComment Comment hi def link pikeSpecial SpecialChar hi def link pikeTodo Todo hi def link pikeBadContinuation Error hi def link pikeCppOutSkip pikeCppOutIf2 hi def link pikeCppInElse2 pikeCppOutIf2 hi def link pikeCppOutIf2 pikeCppOut hi def link pikeCppOut Comment hi def link pikePredef Statement hi def link pikeBindings Identifier hi def link pikeMappIndex Identifier hi def link pikeAdvCast Type hi def link pikeBadClose Error let b:current_syntax = "pike" let &cpo = s:cpo_save unlet s:cpo_save " vim: ts=8