1" Vim syntax file
2" Language:	KixTart 95, Kix2001 Windows script language http://kixtart.org/
3" Maintainer:	Richard Howarth <rhowarth@sgb.co.uk>
4" Last Change:	2003 May 11
5" URL:		http://www.howsoft.demon.co.uk/
6
7" KixTart files identified by *.kix extension.
8
9" Amendment History:
10" 26 April 2001: RMH
11"    Removed development comments from distro version
12"    Renamed "Kix*" to "kix*" for consistancy
13"    Changes made in preperation for VIM version 5.8/6.00
14
15" TODO:
16"	Handle arrays highlighting
17"	Handle object highlighting
18" The next two may not be possible:
19"	Work out how to error too many "(", i.e. (() should be an error.
20"	Similarly, "if" without "endif" and similar constructs should error.
21
22" Clear legacy syntax rules for version 5.x, exit if already processed for version 6+
23if version < 600
24	syn clear
25elseif exists("b:current_syntax")
26	finish
27endif
28
29syn case match
30syn keyword kixTODO		TODO FIX XXX contained
31
32" Case insensitive language.
33syn case ignore
34
35" Kix statements
36syn match   kixStatement	"?"
37syn keyword kixStatement	beep big break
38syn keyword kixStatement	call cd cls color cookie1 copy
39syn keyword kixStatement	del dim display
40syn keyword kixStatement	exit
41syn keyword kixStatement	flushkb
42syn keyword kixStatement	get gets global go gosub goto
43syn keyword kixStatement	md
44syn keyword kixStatement	password play
45syn keyword kixStatement	quit
46syn keyword kixStatement	rd return run
47syn keyword kixStatement	set setl setm settime shell sleep small
48syn keyword kixStatement	use
49
50" Kix2001
51syn keyword kixStatement	debug function endfunction redim
52
53" Simple variables
54syn match   kixNotVar		"\$\$\|@@\|%%" transparent contains=NONE
55syn match   kixLocalVar		"\$\w\+"
56syn match   kixMacro		"@\w\+"
57syn match   kixEnvVar		"%\w\+"
58
59" Destination labels
60syn match   kixLabel		":\w\+\>"
61
62" Identify strings, trap unterminated strings
63syn match   kixStringError      +".*\|'.*+
64syn region  kixDoubleString	oneline start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=kixLocalVar,kixMacro,kixEnvVar,kixNotVar
65syn region  kixSingleString	oneline start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=kixLocalVar,kixMacro,kixEnvVar,kixNotVar
66
67" Operators
68syn match   kixOperator		"+\|-\|\*\|/\|=\|&\||"
69syn keyword kixOperator		and or
70" Kix2001
71syn match   kixOperator		"=="
72syn keyword kixOperator		not
73
74" Numeric constants
75syn match   kixInteger		"-\=\<\d\+\>" contains=NONE
76syn match   kixFloat		"-\=\.\d\+\>\|-\=\<\d\+\.\d\+\>" contains=NONE
77
78" Hex numeric constants
79syn match   kixHex		"\&\x\+\>" contains=NONE
80
81" Other contants
82" Kix2001
83syn keyword kixConstant		on off
84
85" Comments
86syn match   kixComment		";.*$" contains=kixTODO
87
88" Trap unmatched parenthesis
89syn match   kixParenCloseError	")"
90syn region  kixParen		oneline transparent start="(" end=")" contains=ALLBUT,kixParenCloseError
91
92" Functions (Builtin + UDF)
93syn match   kixFunction		"\w\+("he=e-1,me=e-1 contains=ALL
94
95" Trap unmatched brackets
96syn match   kixBrackCloseError	"\]"
97syn region  kixBrack		transparent start="\[" end="\]" contains=ALLBUT,kixBrackCloseError
98
99" Clusters for ALLBUT shorthand
100syn cluster kixIfBut		contains=kixIfError,kixSelectOK,kixDoOK,kixWhileOK,kixForEachOK,kixForNextOK
101syn cluster kixSelectBut	contains=kixSelectError,kixIfOK,kixDoOK,kixWhileOK,kixForEachOK,kixForNextOK
102syn cluster kixDoBut		contains=kixDoError,kixSelectOK,kixIfOK,kixWhileOK,kixForEachOK,kixForNextOK
103syn cluster kixWhileBut		contains=kixWhileError,kixSelectOK,kixIfOK,kixDoOK,kixForEachOK,kixForNextOK
104syn cluster kixForEachBut	contains=kixForEachError,kixSelectOK,kixIfOK,kixDoOK,kixForNextOK,kixWhileOK
105syn cluster kixForNextBut	contains=kixForNextError,kixSelectOK,kixIfOK,kixDoOK,kixForEachOK,kixWhileOK
106" Condtional construct errors.
107syn match   kixIfError		"\<if\>\|\<else\>\|\<endif\>"
108syn match   kixIfOK		contained "\<if\>\|\<else\>\|\<endif\>"
109syn region  kixIf		transparent matchgroup=kixIfOK start="\<if\>" end="\<endif\>" contains=ALLBUT,@kixIfBut
110syn match   kixSelectError	"\<select\>\|\<case\>\|\<endselect\>"
111syn match   kixSelectOK		contained "\<select\>\|\<case\>\|\<endselect\>"
112syn region  kixSelect		transparent matchgroup=kixSelectOK start="\<select\>" end="\<endselect\>" contains=ALLBUT,@kixSelectBut
113
114" Program control constructs.
115syn match   kixDoError		"\<do\>\|\<until\>"
116syn match   kixDoOK		contained "\<do\>\|\<until\>"
117syn region  kixDo		transparent matchgroup=kixDoOK start="\<do\>" end="\<until\>" contains=ALLBUT,@kixDoBut
118syn match   kixWhileError	"\<while\>\|\<loop\>"
119syn match   kixWhileOK		contained "\<while\>\|\<loop\>"
120syn region  kixWhile		transparent matchgroup=kixWhileOK start="\<while\>" end="\<loop\>" contains=ALLBUT,@kixWhileBut
121syn match   kixForNextError	"\<for\>\|\<to\>\|\<step\>\|\<next\>"
122syn match   kixForNextOK	contained "\<for\>\|\<to\>\|\<step\>\|\<next\>"
123syn region  kixForNext		transparent matchgroup=kixForNextOK start="\<for\>" end="\<next\>" contains=ALLBUT,@kixForBut
124syn match   kixForEachError	"\<for each\>\|\<in\>\|\<next\>"
125syn match   kixForEachOK	contained "\<for each\>\|\<in\>\|\<next\>"
126syn region  kixForEach		transparent matchgroup=kixForEachOK start="\<for each\>" end="\<next\>" contains=ALLBUT,@kixForEachBut
127
128" Expressions
129syn match   kixExpression	"<\|>\|<=\|>=\|<>"
130
131
132" Default highlighting.
133" Version < 5.8 set default highlight if file not already processed.
134" Version >= 5.8 set default highlight only if it doesn't already have a value.
135if version > 508 || !exists("did_kix_syn_inits")
136	if version < 508
137		let did_kix_syn_inits=1
138		command -nargs=+ HiLink hi link <args>
139	else
140		command -nargs=+ HiLink hi def link <args>
141	endif
142
143	HiLink kixDoubleString		String
144	HiLink kixSingleString		String
145	HiLink kixStatement		Statement
146	HiLink kixRepeat		Repeat
147	HiLink kixComment		Comment
148	HiLink kixBuiltin		Function
149	HiLink kixLocalVar		Special
150	HiLink kixMacro			Special
151	HiLink kixEnvVar		Special
152	HiLink kixLabel			Type
153	HiLink kixFunction		Function
154	HiLink kixInteger		Number
155	HiLink kixHex			Number
156	HiLink kixFloat			Number
157	HiLink kixOperator		Operator
158	HiLink kixExpression		Operator
159
160	HiLink kixParenCloseError	Error
161	HiLink kixBrackCloseError	Error
162	HiLink kixStringError		Error
163
164	HiLink kixWhileError		Error
165	HiLink kixWhileOK		Conditional
166	HiLink kixDoError		Error
167	HiLink kixDoOK			Conditional
168	HiLink kixIfError		Error
169	HiLink kixIfOK			Conditional
170	HiLink kixSelectError		Error
171	HiLink kixSelectOK		Conditional
172	HiLink kixForNextError		Error
173	HiLink kixForNextOK		Conditional
174	HiLink kixForEachError		Error
175	HiLink kixForEachOK		Conditional
176
177	delcommand HiLink
178endif
179
180let b:current_syntax = "kix"
181
182" vim: ts=8 sw=2
183