1" Vim syntax file
2" Language:		Pike
3" Maintainer:		Stephen R. van den Berg <srb@cuci.nl>
4" Maintainer of previous implementation: Francesco Chemolli <kinkie@kame.usr.dsi.unimi.it>
5" Last Change:		2018 Jan 28
6" Version:		2.9
7" Remark: Derived from the C-syntax; fixed several bugs in the C-syntax
8" Remark: and extended it with the Pike syntax.
9" Remark: Includes a highlighter for all Pike types of parenthesis errors.
10" Remark: Includes a highlighter for SQL on multiline strings.
11" Remark: Includes a highlighter for any embedded Autodoc format.
12
13" Quit when a (custom) syntax file was already loaded
14if exists("b:current_syntax")
15  finish
16endif
17
18let s:cpo_save = &cpo
19set cpo&vim
20
21" For multiline strings, try formatting them as SQL
22syn include @pikeSQL <sfile>:p:h/sqloracle.vim
23unlet b:current_syntax
24
25" For embedded Autodoc documentation (WIP)
26syn include @pikeAutodoc <sfile>:p:h/autodoc.vim
27unlet b:current_syntax
28
29syn case match
30
31" Supports array, multiset, mapping multi-character delimiter matching
32" Supports rotating amongst several same-level preprocessor conditionals
33packadd! matchit
34let b:match_words = "({:}\\@1<=),(\\[:]\\@1<=),(<:>\\@1<=),^\s*#\s*\%(if\%(n\?def\)\|else\|el\%(se\)\?if\|endif\)\>"
35
36" A bunch of useful Pike keywords
37syn keyword	pikeDebug	gauge backtrace describe_backtrace werror _Static_assert static_assert
38syn keyword	pikeException	error catch throw
39syn keyword	pikeLabel	case default break return continue
40syn keyword	pikeConditional	if else switch
41syn keyword	pikeRepeat	while for foreach do
42
43syn keyword pikePredef RegGetKeyNames RegGetValue RegGetValues
44syn keyword pikePredef __automap__ __empty_program
45syn keyword pikePredef __handle_sprintf_format __parse_pike_type _disable_threads
46syn keyword pikePredef _do_call_outs _exit _gdb_breakpoint
47syn keyword pikePredef abs access acos acosh add_constant alarm all_constants
48syn keyword pikePredef array_sscanf asin asinh atan atan2 atanh atexit
49syn keyword pikePredef basetype call_function call_out call_out_info cd ceil
50syn keyword pikePredef combine_path combine_path_nt
51syn keyword pikePredef combine_path_unix compile copy_value cos cosh cpp crypt
52syn keyword pikePredef ctime decode_value delay encode_value encode_value_canonic
53syn keyword pikePredef enumerate errno exece exit exp file_stat file_truncate
54syn keyword pikePredef filesystem_stat find_call_out floor fork function_name
55syn keyword pikePredef function_object function_program gc
56syn keyword pikePredef get_active_compilation_handler get_active_error_handler
57syn keyword pikePredef get_all_groups get_all_users get_dir get_groups_for_user
58syn keyword pikePredef get_iterator get_profiling_info get_weak_flag getcwd
59syn keyword pikePredef getgrgid getgrnam gethrdtime gethrtime gethrvtime getpid
60syn keyword pikePredef getpwnam getpwuid getxattr glob gmtime has_index has_prefix
61syn keyword pikePredef has_suffix has_value hash hash_7_0 hash_7_4 hash_8_0
62syn keyword pikePredef hash_value kill limit listxattr load_module localtime
63syn keyword pikePredef log lower_case master max min mkdir mktime mv
64syn keyword pikePredef object_program pow query_num_arg random_seed
65syn keyword pikePredef remove_call_out removexattr replace_master rm round
66syn keyword pikePredef set_priority set_weak_flag setxattr sgn signal signame
67syn keyword pikePredef signum sin sinh sleep sort sprintf sqrt sscanf strerror
68syn keyword pikePredef string_filter_non_unicode string_to_unicode string_to_utf8
69syn keyword pikePredef tan tanh time trace types ualarm unicode_to_string
70syn keyword pikePredef upper_case utf8_to_string version
71
72syn keyword pikePredef write lock try_lock
73syn keyword pikePredef MutexKey Timestamp Date Time TimeTZ Interval Inet Range
74syn keyword pikePredef Null null inf nan
75
76syn keyword	pikeTodo		contained TODO FIXME XXX
77
78" Match parengroups: allows for highlighting indices of mappings and
79" highlighting semicolons that are out of place due to a paren imbalance
80syn cluster	pikePreShort	contains=pikeDefine,pikePreProc,pikeCppOutWrapper,pikeCppInWrapper,pikePreCondit,pikePreConditMatch
81syn cluster	pikeExprGroup	contains=pikeMappIndex,@pikeStmt,pikeNest,@pikeBadGroup,pikeSoftCast
82syn match	pikeWord	transparent contained /[^()'"[\]{},;:]\+/ contains=ALLBUT,@pikePreProcGroup,@pikeExprGroup
83syn match	pikeFirstWord	transparent display contained /^\s*#[^()'"[\]{},;:]\+/ contains=@pikePreShort
84syn cluster	pikeMappElm	contains=pikeMappIndex,@pikeStmt
85syn cluster	pikeStmt	contains=pikeFirstWord,pikeCharacter,pikeString,pikeMlString,pikeWord,pikeNest
86syn cluster     pikeBadGroup	contains=pikeBadPClose,pikeBadAClose,pikeBadBClose,pikeBadSPClose,pikeBadSAClose,pikeBadSBClose,pikeBadSClose,pikeBadSPAClose,pikeBadSBAClose
87syn match	pikeBadPClose	display contained "[}\]]"
88syn match	pikeBadAClose	display contained "[)\]]"
89syn match	pikeBadBClose	display contained "[)}]"
90syn match	pikeBadSPClose	display contained "[;}\]]"
91syn match	pikeBadSAClose	display contained "[;)\]]"
92syn match	pikeBadSPAClose	display contained "[;\]]"
93syn match	pikeBadSBAClose	display contained "[;}]"
94syn match	pikeBadSClose	display contained "[;)}\]]"
95syn region	pikeNest	transparent start="(\@1<!{" end="}" contains=@pikeStmt,pikeUserLabel,pikeBadAClose
96syn region	pikeNest	transparent start="\%(\<for\%(each\)\?\s\?\)\@8<!([[{<]\@!" end=")" contains=@pikeStmt,pikeBadSPClose
97syn region	pikeNest	transparent start="\%(\<for\%(each\)\?\s\?\)\@8<=(" end=")" contains=@pikeStmt,pikeBadPClose
98syn region	pikeNest	transparent start="(\@1<!\[" end="]" contains=@pikeStmt,pikeBadSBClose
99syn region	pikeNest	transparent start="(\zs\[" end="])" contains=@pikeMappElm,pikeBadSBAClose
100" For some reason specifying a matchgroup on the pikeNest below makes it
101" override the shorter variant; consider it a kludge, no idea why it works
102syn region	pikeNest	transparent matchgroup=pikeSoftCast start=%(\zs\[[ \t\v\r\n.a-zA-Z0-9_():,|]\+])\@!% end=")" contains=@pikeStmt
103syn region	pikeNest	transparent start="(\zs{" end="})" contains=@pikeStmt,pikeBadSPAClose
104syn region	pikeNest	transparent start="(\zs<" end=">)" contains=@pikeStmt,pikeBadSPClose keepend
105
106" It's easy to accidentally add a space after a backslash that was intended
107" for line continuation.  Some compilers allow it, which makes it
108" unpredictable and should be avoided.
109syn match	pikeBadContinuation contained "\\\s\+$"
110
111" pikeCommentGroup allows adding matches for special things in comments
112syn cluster	pikeCommentGroup	contains=pikeTodo,pikeBadContinuation
113
114" String and Character constants
115" Highlight special characters (those which have a backslash) differently
116syn match	pikeSpecial	display contained "\\\%(x\x*\|d\d*\|\o\+\|u\x\{4}\|U\x\{8}\|[abefnrtv]\|$\)"
117
118" ISO C11 or ISO C++ 11
119if !exists("c_no_cformat")
120  " Highlight % items in strings.
121  syn match	pikeFormat		display "%\%(\d\+\$\)\=[-+' #0*]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjzt]\|ll\|hh\)\=\%([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
122  syn match	pikeFormat		display "%%" contained
123  syn region 	pikeString		start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeDelimiterDQ,pikeFormat,@Spell keepend
124  syn region	pikeMlString	start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeFormat,pikeDelimiterDQ,@Spell,pikeEmbeddedString keepend
125else
126  syn region 	pikeString		start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=pikeSpecial,pikeDelimiterDQ,@Spell
127  syn region	pikeMlString	transparent start=+#"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeSpecial,pikeDelimiterDQ,@Spell,pikeEmbeddedString keepend
128endif
129
130" Use SQL-syntax highlighting in multiline string if it starts with
131" a standard SQL keyword
132syn case ignore
133" FIXME Use explicit newline match to cover up a bug in the regexp engine
134" If the kludge is not used, the match will only start unless at least a space
135" follows the initial doublequote on the first line (or the keyword is on
136" the first line).
137syn region	pikeEmbeddedString	contained start=+\%(#"\n\?\)\@2<=\_s*\%(SELECT\|INSERT\|UPDATE\|DELETE\|WITH\|CREATE\|DROP\|ALTER\)\>+ skip=+\\\\\|\\"+ end=+[\\#]\@1<!"+ contains=@pikeSQL,pikeBindings keepend
138syn case match
139
140syn match	pikeBindings	display contained ":\@1<!:\I\i*"
141
142syn match	pikeCharacter	"'[^\\']'" contains=pikeDelimiterSQ
143syn match	pikeCharacter	"'[^']*'" contains=pikeSpecial,pikeDelimiterSQ
144syn match	pikeSpecialError	"'\\[^'\"?\\abefnrtv]'"
145syn match	pikeDelimiterDQ	display +"+ contained
146syn match	pikeDelimiterSQ	display +'+ contained
147
148"when wanted, highlight trailing white space
149if exists("c_space_errors")
150  if !exists("c_no_trail_space_error")
151    syn match	pikeSpaceError	display excludenl "\s\+$"
152  endif
153  if !exists("c_no_tab_space_error")
154    syn match	pikeSpaceError	display " \+\ze\t"
155  endif
156endif
157
158"integer number, or floating point number without a dot and with "f".
159syn case ignore
160syn match	pikeNumbers	display transparent "\<\d\|\.\d" contains=pikeNumber,pikeFloat,pikeOctalError,pikeOctal
161" Same, but without octal error (for comments)
162syn match	pikeNumbersCom	display contained transparent "\<\d\|\.\d" contains=pikeNumber,pikeFloat,pikeOctal
163syn match	pikeNumber		display contained "\<\d\+\%(u\=l\{0,2}\|ll\=u\)\>"
164"hex number
165syn match	pikeNumber		display contained "\<0x\x\+\%(u\=l\{0,2}\|ll\=u\)\>"
166" Flag the first zero of an octal number as something special
167syn match	pikeOctal		display contained "\<0\o\+\%(u\=l\{0,2}\|ll\=u\)\>" contains=pikeOctalZero
168syn match	pikeOctalZero	display contained "\<0"
169"floating point number, with dot, optional exponent
170syn match	pikeFloat		display contained "\<\d\+\%(f\|\.[0-9.]\@!\d*\%(e[-+]\=\d\+\)\=[fl]\=\)"
171"floating point number, starting with a dot, optional exponent
172syn match	pikeFloat		display contained "[0-9.]\@1<!\.\d\+\%(e[-+]\=\d\+\)\=[fl]\=\>"
173"floating point number, without dot, with exponent
174syn match	pikeFloat		display contained "\<\d\+e[-+]\=\d\+[fl]\=\>"
175
176"hexadecimal floating point number, two variants, with exponent
177syn match	pikeFloat		display contained "\<0x\%(\x\+\.\?\|\x*\.\x\+\)p[-+]\=\d\+[fl]\=\>"
178
179" flag an octal number with wrong digits
180syn match	pikeOctalError	display contained "\<0\o*[89]\d*"
181syn case match
182
183if exists("c_comment_strings")
184  " A comment can contain pikeString, pikeCharacter and pikeNumber.
185  " But a "*/" inside a pikeString in a pikeComment DOES end the comment!  So we
186  " need to use a special type of pikeString: pikeCommentString, which also ends on
187  " "*/", and sees a "*" at the start of the line as comment again.
188  " Unfortunately this doesn't very well work for // type of comments :-(
189  syn match	pikeCommentSkip	contained "^\s*\*\%($\|\s\+\)"
190  syn region pikeCommentString	contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\ze\*/+ contains=pikeSpecial,pikeCommentSkip
191  syn region pikeComment2String	contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=pikeSpecial
192  syn region  pikeCommentL	start="//" skip="\\$" end="$" keepend contains=@pikeCommentGroup,pikeComment2String,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell containedin=pikeWord,pikeFirstWord
193  if exists("c_no_comment_fold")
194    " Use "extend" here to have preprocessor lines not terminate halfway a
195    " comment.
196    syn region pikeComment	matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeCommentString,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell extend containedin=pikeWord,pikeFirstWord
197  else
198    syn region pikeComment	matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeCommentString,pikeCharacter,pikeNumbersCom,pikeSpaceError,@Spell fold extend containedin=pikeWord,pikeFirstWord
199  endif
200else
201  syn region	pikeCommentL	start="//" skip="\\$" end="$" keepend contains=@pikeCommentGroup,pikeSpaceError,@Spell containedin=pikeWord,pikeFirstWord
202  if exists("c_no_comment_fold")
203    syn region	pikeComment	matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeSpaceError,@Spell extend containedin=pikeWord,pikeFirstWord
204  else
205    syn region	pikeComment	matchgroup=pikeCommentStart start="/\*" end="\*/" contains=@pikeCommentGroup,pikeCommentStartError,pikeSpaceError,@Spell fold extend containedin=pikeWord,pikeFirstWord
206  endif
207endif
208" keep a // comment separately, it terminates a preproc. conditional
209syn match	pikeCommentError	display "\*/"
210syn match	pikeCommentStartError display "/\ze\*" contained
211
212syn keyword	pikeOperator	sizeof
213syn keyword	pikeOperator	typeof _typeof _refs
214syn keyword	pikeOperator	zero_type intp stringp arrayp mappingp multisetp
215syn keyword	pikeOperator	objectp functionp programp callablep destructedp
216syn keyword	pikeOperator	object_variablep undefinedp
217syn keyword	pikeOperator	allocate equal
218syn keyword	pikeOperator	aggregate aggregate_mapping aggregate_multiset
219syn keyword	pikeOperator	map filter search replace reverse column rows
220syn keyword	pikeOperator	indices values mkmapping mkmultiset m_delete sort
221syn keyword	pikeOperator	m_delete destruct
222syn keyword	pikeOperator	create _destruct _sprintf cast _encode _decode
223syn keyword     pikeOperator    __hash _sizeof _values _indices __INIT _equal
224syn keyword     pikeOperator    _is_type _m_delete _get_iterator _search
225syn keyword     pikeOperator    _serialize _deserialize _sqrt _types _random
226syn keyword     pikeOperator    _size_object
227
228syn keyword	pikeType		int void
229syn keyword	pikeType		float
230syn keyword	pikeType		bool string array mapping multiset mixed
231syn keyword	pikeType		object function program auto
232
233syn keyword	pikeType		this this_object this_program
234syn keyword	pikeType		sprintf_args sprintf_format sprintf_result
235syn keyword	pikeType		strict_sprintf_format
236
237syn keyword	pikeStructure		class enum typedef inherit import
238syn keyword	pikeTypedef		typedef
239syn keyword	pikeStorageClass	private protected public constant final variant
240syn keyword	pikeStorageClass	optional inline extern static __deprecated__ lambda
241
242syn keyword pikeConstant __LINE__ __FILE__ __DIR__ __DATE__ __TIME__
243syn keyword pikeConstant __AUTO_BIGNUM__ __NT__
244syn keyword pikeConstant __BUILD__ __COUNTER__ _MAJOR__ __MINOR__ __VERSION__
245syn keyword pikeConstant __REAL_BUILD__ _REAL_MAJOR__ __REAL_MINOR__
246syn keyword pikeConstant __REAL_VERSION__ __PIKE__ UNDEFINED
247
248" These should actually only be parsed in preprocessor conditionals
249syn keyword pikeCppOperator contained defined constant efun _Pragma
250
251syn keyword pikeBoolean true false
252
253syn match       pikeCppPrefix	display "^\s*\zs#\s*[a-z]\+" contained
254syn region	pikePreCondit	start="^\s*#\s*\%(if\%(n\?def\)\?\|el\%(se\)\?if\)\>" skip="\\$" end="$" transparent keepend contains=pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError,pikeCppOperator,pikeCppPrefix
255syn match	pikePreConditMatch	display "^\s*\zs#\s*\%(else\|endif\)\>"
256if !exists("c_no_if0")
257  syn cluster	pikeCppOutInGroup	contains=pikeCppInIf,pikeCppInElse,pikeCppInElse2,pikeCppOutIf,pikeCppOutIf2,pikeCppOutElse,pikeCppInSkip,pikeCppOutSkip
258  syn region	pikeCppOutWrapper	start="^\s*\zs#\s*if\s\+0\+\s*\%($\|//\|/\*\|&\)" end=".\@=\|$" contains=pikeCppOutIf,pikeCppOutElse,@NoSpell fold
259  syn region	pikeCppOutIf	contained start="0\+" matchgroup=pikeCppOutWrapper end="^\s*#\s*endif\>" contains=pikeCppOutIf2,pikeCppOutElse
260  if !exists("c_no_if0_fold")
261    syn region	pikeCppOutIf2	contained matchgroup=pikeCppOutWrapper start="0\+" end="^\ze\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)" contains=pikeSpaceError,pikeCppOutSkip,@Spell fold
262  else
263    syn region	pikeCppOutIf2	contained matchgroup=pikeCppOutWrapper start="0\+" end="^\ze\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0\+\s*\%($\|//\|/\*\|&\)\)\@!\|endif\>\)" contains=pikeSpaceError,pikeCppOutSkip,@Spell
264  endif
265  syn region	pikeCppOutElse	contained matchgroup=pikeCppOutWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit
266  syn region	pikeCppInWrapper	start="^\s*\zs#\s*if\s\+0*[1-9]\d*\s*\%($\|//\|/\*\||\)" end=".\@=\|$" contains=pikeCppInIf,pikeCppInElse fold
267  syn region	pikeCppInIf	contained matchgroup=pikeCppInWrapper start="\d\+" end="^\s*#\s*endif\>" contains=TOP,pikePreCondit
268  if !exists("c_no_if0_fold")
269    syn region	pikeCppInElse	contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2 fold
270  else
271    syn region	pikeCppInElse	contained start="^\s*#\s*\%(else\>\|el\%(se\)\?if\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=pikeCppInIf contains=pikeCppInElse2
272  endif
273  syn region	pikeCppInElse2	contained matchgroup=pikeCppInWrapper start="^\s*#\s*\%(else\|el\%(se\)\?if\)\%([^/]\|/[^/*]\)*" end="^\ze\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip,@Spell
274  syn region	pikeCppOutSkip	contained start="^\s*#\s*if\%(n\?def\)\?\>" skip="\\$" end="^\s*#\s*endif\>" contains=pikeSpaceError,pikeCppOutSkip
275  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
276endif
277syn region	pikeIncluded	display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pikeDelimiterDQ keepend
278syn match	pikeIncluded	display contained "<[^>]*>"
279syn match	pikeInclude	display "^\s*\zs#\s*include\>\s*["<]" contains=pikeIncluded
280syn cluster	pikePreProcGroup	contains=pikeIncluded,pikeInclude,pikeEmbeddedString,pikeCppOutWrapper,pikeCppInWrapper,@pikeCppOutInGroup,pikeFormat,pikeMlString,pikeCommentStartError,@pikeBadGroup,pikeWord
281syn region	pikeDefine		start="^\s*\zs#\s*\%(define\|undef\)\>" skip="\\$" end="$" keepend contains=@pikeStmt,@pikeBadGroup
282syn region	pikePreProc	start="^\s*\zs#\s*\%(pragma\|charset\|pike\|require\|string\|line\|warning\|error\)\>" skip="\\$" end="$" transparent keepend contains=pikeString,pikeCharacter,pikeNumbers,pikeCommentError,pikeSpaceError,pikeCppOperator,pikeCppPrefix,@Spell,pikeConstant
283
284syn match	pikeAutodocReal	display contained "\%(//\|[/ \t\v]\*\|^\*\)\@2<=!.*" contains=@pikeAutodoc containedin=pikeComment,pikeCommentL
285syn cluster pikeCommentGroup add=pikeAutodocReal
286syn cluster pikePreProcGroup add=pikeAutodocReal
287
288" Highlight User Labels
289" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
290syn match	pikeUserLabel	display "\%(^\|[{};]\)\zs\I\i*\s*\ze:\%([^:]\|$\)" contained contains=NONE
291syn match	pikeUserLabel	display "\%(\<\%(break\|continue\)\_s\+\)\@10<=\I\i*" contained contains=NONE
292syn match	pikeUserLabel	display "\%(\<case\)\@5<=\s\+[^<()[\]{},;:]\+\ze::\@!" contained contains=pikeDelimiterDQ,pikeDelimiterSQ
293
294syn match	pikeMappIndex	display contained "[^<()[\]{},;:]\+\ze::\@!" contains=pikeDelimiterDQ,pikeDelimiterSQ
295syn match	pikeSoftCast	display contained "\[[ \t\v\r\n.a-zA-Z0-9_():,|\+]" contains=NONE
296
297if exists("c_minlines")
298  let b:c_minlines = c_minlines
299else
300  if !exists("c_no_if0")
301    let b:c_minlines = 400	" #if 0 constructs can be long
302  else
303    let b:c_minlines = 200	" mostly for multiline strings
304  endif
305endif
306exec "syn sync ccomment pikeComment minlines=" . b:c_minlines
307syn sync match pikeMlStringSync grouphere pikeMlString +^[^"#]\+#\"+
308syn sync match pikeAutodocSync grouphere pikeCommentL "^\s*//!"
309
310" Define the default highlighting.
311" Only used when an item doesn't have highlighting yet
312hi def link pikeFormat		SpecialChar
313hi def link pikeMlString	String
314hi def link pikeCommentL	Comment
315hi def link pikeCommentStart	Comment
316hi def link pikeLabel		Label
317hi def link pikeUserLabel	Identifier
318hi def link pikeConditional	Conditional
319hi def link pikeRepeat		Repeat
320hi def link pikeCharacter	Character
321hi def link pikeDelimiterDQ	Delimiter
322hi def link pikeDelimiterSQ	Delimiter
323hi def link pikeNumber		Number
324hi def link pikeOctal		Number
325hi def link pikeOctalZero	PreProc	 " link this to Error if you want
326hi def link pikeFloat		Float
327hi def link pikeOctalError	Error
328hi def link pikeCommentError	Error
329hi def link pikeCommentStartError	Error
330hi def link pikeSpaceError	Error
331hi def link pikeSpecialError	Error
332hi def link pikeOperator	Operator
333hi def link pikeCppOperator	Operator
334hi def link pikeStructure	Structure
335hi def link pikeTypedef		Typedef
336hi def link pikeStorageClass	StorageClass
337hi def link pikeInclude		Include
338hi def link pikeCppPrefix	PreCondit
339hi def link pikePreProc		PreProc
340hi def link pikeDefine		Macro
341hi def link pikeIncluded	String
342hi def link pikeError		Error
343hi def link pikeDebug		Debug
344hi def link pikeException	Exception
345hi def link pikeStatement	Statement
346hi def link pikeType		Type
347hi def link pikeConstant	Constant
348hi def link pikeBoolean		Boolean
349hi def link pikeCommentString	String
350hi def link pikeComment2String	String
351hi def link pikeCommentSkip	Comment
352hi def link pikeString		String
353hi def link pikeComment		Comment
354hi def link pikeSpecial		SpecialChar
355hi def link pikeTodo		Todo
356hi def link pikeBadContinuation	Error
357
358hi def link pikeCppInWrapper	PreCondit
359hi def link pikeCppOutWrapper	PreCondit
360hi def link pikePreConditMatch	PreCondit
361
362hi def link pikeCppOutSkip	Comment
363hi def link pikeCppInElse2	Comment
364hi def link pikeCppOutIf2	Comment
365hi def link pikeCppOut		Comment
366
367hi def link pikePredef		Statement
368hi def link pikeBindings	Identifier
369hi def link pikeMappIndex	Identifier
370hi def link pikeSoftCast	Type
371hi def link pikeBadGroup	Error
372hi def link pikeBadPClose	Error
373hi def link pikeBadAClose	Error
374hi def link pikeBadBClose	Error
375hi def link pikeBadSPClose	Error
376hi def link pikeBadSAClose	Error
377hi def link pikeBadSBClose	Error
378hi def link pikeBadSPAClose	Error
379hi def link pikeBadSBAClose	Error
380hi def link pikeBadSClose	Error
381
382let b:current_syntax = "pike"
383
384let &cpo = s:cpo_save
385unlet s:cpo_save
386" vim: ts=8
387