" Vim syntax file
" Language:	4Dos batch file
" Maintainer:	John Leo Spetz <jls11@po.cwru.edu>
" Last Change:	2001 May 09

"//Issues to resolve:
"//- Boolean operators surrounded by period are recognized but the
"//  periods are not highlighted.  The only way to do that would
"//  be separate synmatches for each possibility otherwise a more
"//  general \.\i\+\. will highlight anything delimited by dots.
"//- After unary operators like "defined" can assume token type.
"//  Should there be more of these?

" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
  syntax clear
elseif exists("b:current_syntax")
  finish
endif

syn case ignore

syn keyword btmStatement	call off
syn keyword btmConditional	if iff endiff then else elseiff not errorlevel
syn keyword btmConditional	gt lt eq ne ge le
syn match btmConditional transparent    "\.\i\+\." contains=btmDotBoolOp
syn keyword btmDotBoolOp contained      and or xor
syn match btmConditional	"=="
syn match btmConditional	"!="
syn keyword btmConditional	defined errorlevel exist isalias
syn keyword btmConditional	isdir direxist isinternal islabel
syn keyword btmRepeat		for in do enddo

syn keyword btmTodo contained	TODO

" String
syn cluster btmVars contains=btmVariable,btmArgument,btmBIFMatch
syn region  btmString	start=+"+  end=+"+ contains=@btmVars
syn match btmNumber     "\<\d\+\>"

"syn match  btmIdentifier	"\<\h\w*\>"

" If you don't like tabs
"syn match btmShowTab "\t"
"syn match btmShowTabc "\t"
"syn match  btmComment		"^\ *rem.*$" contains=btmTodo,btmShowTabc

" Some people use this as a comment line
" In fact this is a Label
"syn match btmComment		"^\ *:\ \+.*$" contains=btmTodo

syn match btmComment		"^\ *rem.*$" contains=btmTodo
syn match btmComment		"^\ *::.*$" contains=btmTodo

syn match btmLabelMark		"^\ *:[0-9a-zA-Z_\-]\+\>"
syn match btmLabelMark		"goto [0-9a-zA-Z_\-]\+\>"lc=5
syn match btmLabelMark		"gosub [0-9a-zA-Z_\-]\+\>"lc=6

" syn match btmCmdDivider ">[>&][>&]\="
syn match btmCmdDivider ">[>&]*"
syn match btmCmdDivider ">>&>"
syn match btmCmdDivider "|&\="
syn match btmCmdDivider "%+"
syn match btmCmdDivider "\^"

syn region btmEcho start="echo" skip="echo" matchgroup=btmCmdDivider end="%+" end="$" end="|&\=" end="\^" end=">[>&]*" contains=@btmEchos oneline
syn cluster btmEchos contains=@btmVars,btmEchoCommand,btmEchoParam
syn keyword btmEchoCommand contained	echo echoerr echos echoserr
syn keyword btmEchoParam contained	on off

" this is also a valid Label. I don't use it.
"syn match btmLabelMark		"^\ *:\ \+[0-9a-zA-Z_\-]\+\>"

" //Environment variable can be expanded using notation %var in 4DOS
syn match btmVariable		"%[0-9a-z_\-]\+" contains=@btmSpecialVars
" //Environment variable can be expanded using notation %var%
syn match btmVariable		"%[0-9a-z_\-]*%" contains=@btmSpecialVars
" //The following are special variable in 4DOS
syn match btmVariable		"%[=#]" contains=@btmSpecialVars
syn match btmVariable		"%??\=" contains=@btmSpecialVars
" //Environment variable can be expanded using notation %[var] in 4DOS
syn match btmVariable		"%\[[0-9a-z_\-]*\]"
" //After some keywords next word should be an environment variable
syn match btmVariable		"defined\s\i\+"lc=8
syn match btmVariable		"set\s\i\+"lc=4
" //Parameters to batchfiles take the format %<digit>
syn match btmArgument		"%\d\>"
" //4DOS allows format %<digit>& meaning batchfile parameters digit and up
syn match btmArgument		"%\d\>&"
" //Variable used by FOR loops sometimes use %%<letter> in batchfiles
syn match btmArgument		"%%\a\>"

" //Show 4DOS built-in functions specially
syn match btmBIFMatch "%@\w\+\["he=e-1 contains=btmBuiltInFunc
syn keyword btmBuiltInFunc contained	alias ascii attrib cdrom
syn keyword btmBuiltInFunc contained	char clip comma convert
syn keyword btmBuiltInFunc contained	date day dec descript
syn keyword btmBuiltInFunc contained	device diskfree disktotal
syn keyword btmBuiltInFunc contained	diskused dosmem dow dowi
syn keyword btmBuiltInFunc contained	doy ems eval exec execstr
syn keyword btmBuiltInFunc contained	expand ext extended
syn keyword btmBuiltInFunc contained	fileage fileclose filedate
syn keyword btmBuiltInFunc contained	filename fileopen fileread
syn keyword btmBuiltInFunc contained	files fileseek fileseekl
syn keyword btmBuiltInFunc contained	filesize filetime filewrite
syn keyword btmBuiltInFunc contained	filewriteb findclose
syn keyword btmBuiltInFunc contained	findfirst findnext format
syn keyword btmBuiltInFunc contained	full if inc index insert
syn keyword btmBuiltInFunc contained	instr int label left len
syn keyword btmBuiltInFunc contained	lfn line lines lower lpt
syn keyword btmBuiltInFunc contained	makeage makedate maketime
syn keyword btmBuiltInFunc contained	master month name numeric
syn keyword btmBuiltInFunc contained	path random readscr ready
syn keyword btmBuiltInFunc contained	remote removable repeat
syn keyword btmBuiltInFunc contained	replace right search
syn keyword btmBuiltInFunc contained	select sfn strip substr
syn keyword btmBuiltInFunc contained	time timer trim truename
syn keyword btmBuiltInFunc contained	unique upper wild word
syn keyword btmBuiltInFunc contained	words xms year

syn cluster btmSpecialVars contains=btmBuiltInVar,btmSpecialVar

" //Show specialized variables specially
" syn match btmSpecialVar contained	"+"
syn match btmSpecialVar contained	"="
syn match btmSpecialVar contained	"#"
syn match btmSpecialVar contained	"??\="
syn keyword btmSpecialVar contained	cmdline colordir comspec
syn keyword btmSpecialVar contained	copycmd dircmd temp temp4dos
syn keyword btmSpecialVar contained	filecompletion path prompt

" //Show 4DOS built-in variables specially specially
syn keyword btmBuiltInVar contained	_4ver _alias _ansi
syn keyword btmBuiltInVar contained	_apbatt _aplife _apmac _batch
syn keyword btmBuiltInVar contained	_batchline _batchname _bg
syn keyword btmBuiltInVar contained	_boot _ci _cmdproc _co
syn keyword btmBuiltInVar contained	_codepage _column _columns
syn keyword btmBuiltInVar contained	_country _cpu _cwd _cwds _cwp
syn keyword btmBuiltInVar contained	_cwps _date _day _disk _dname
syn keyword btmBuiltInVar contained	_dos _dosver _dow _dowi _doy
syn keyword btmBuiltInVar contained	_dpmi _dv _env _fg _hlogfile
syn keyword btmBuiltInVar contained	_hour _kbhit _kstack _lastdisk
syn keyword btmBuiltInVar contained	_logfile _minute _monitor
syn keyword btmBuiltInVar contained	_month _mouse _ndp _row _rows
syn keyword btmBuiltInVar contained	_second _shell _swapping
syn keyword btmBuiltInVar contained	_syserr _time _transient
syn keyword btmBuiltInVar contained	_video _win _wintitle _year

" //Commands in 4DOS and/or DOS
syn match btmCommand	"\s?"
syn match btmCommand	"^?"
syn keyword btmCommand	alias append assign attrib
syn keyword btmCommand	backup beep break cancel case
syn keyword btmCommand	cd cdd cdpath chcp chdir
syn keyword btmCommand	chkdsk cls color comp copy
syn keyword btmCommand	ctty date debug default defrag
syn keyword btmCommand	del delay describe dir
syn keyword btmCommand	dirhistory dirs diskcomp
syn keyword btmCommand	diskcopy doskey dosshell
syn keyword btmCommand	drawbox drawhline drawvline
"syn keyword btmCommand	echo echoerr echos echoserr
syn keyword btmCommand	edit edlin emm386 endlocal
syn keyword btmCommand	endswitch erase eset except
syn keyword btmCommand	exe2bin exit expand fastopen
syn keyword btmCommand	fc fdisk ffind find format
syn keyword btmCommand	free global gosub goto
syn keyword btmCommand	graftabl graphics help history
syn keyword btmCommand	inkey input join keyb keybd
syn keyword btmCommand	keystack label lh list loadbtm
syn keyword btmCommand	loadhigh lock log md mem
syn keyword btmCommand	memory mirror mkdir mode more
syn keyword btmCommand	move nlsfunc on option path
syn keyword btmCommand	pause popd print prompt pushd
syn keyword btmCommand	quit rd reboot recover ren
syn keyword btmCommand	rename replace restore return
syn keyword btmCommand	rmdir scandisk screen scrput
syn keyword btmCommand	select set setdos setlocal
syn keyword btmCommand	setver share shift sort subst
syn keyword btmCommand	swapping switch sys tee text
syn keyword btmCommand	time timer touch tree truename
syn keyword btmCommand	type unalias undelete unformat
syn keyword btmCommand	unlock unset ver verify vol
syn keyword btmCommand	vscrput y

" 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 yet
if version >= 508 || !exists("did_btm_syntax_inits")
  if version < 508
    let did_btm_syntax_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

  HiLink btmLabel		Special
  HiLink btmLabelMark		Special
  HiLink btmCmdDivider		Special
  HiLink btmConditional		btmStatement
  HiLink btmDotBoolOp		btmStatement
  HiLink btmRepeat		btmStatement
  HiLink btmEchoCommand	btmStatement
  HiLink btmEchoParam		btmStatement
  HiLink btmStatement		Statement
  HiLink btmTodo		Todo
  HiLink btmString		String
  HiLink btmNumber		Number
  HiLink btmComment		Comment
  HiLink btmArgument		Identifier
  HiLink btmVariable		Identifier
  HiLink btmEcho		String
  HiLink btmBIFMatch		btmStatement
  HiLink btmBuiltInFunc		btmStatement
  HiLink btmBuiltInVar		btmStatement
  HiLink btmSpecialVar		btmStatement
  HiLink btmCommand		btmStatement

  "optional highlighting
  "HiLink btmShowTab		Error
  "HiLink btmShowTabc		Error
  "hiLink btmIdentifier		Identifier

  delcommand HiLink
endif

let b:current_syntax = "btm"

" vim: ts=8
