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