1" Vim syntax file 2" Language: MSDOS batch file (with NT command extensions) 3" Maintainer: Mike Williams <mrw@eandem.co.uk> 4" Filenames: *.bat 5" Last Change: 6th September 2009 6" Web Page: http://www.eandem.co.uk/mrw/vim 7" 8" Options Flags: 9" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default] 10" 11 12" For version 5.x: Clear all syntax items 13" For version 6.x: Quit when a syntax file was already loaded 14if version < 600 15 syntax clear 16elseif exists("b:current_syntax") 17 finish 18endif 19 20" Set default highlighting to Win2k 21if !exists("dosbatch_cmdextversion") 22 let dosbatch_cmdextversion = 2 23endif 24 25" DOS bat files are case insensitive but case preserving! 26syn case ignore 27 28syn keyword dosbatchTodo contained TODO 29 30" Dosbat keywords 31syn keyword dosbatchStatement goto call exit 32syn keyword dosbatchConditional if else 33syn keyword dosbatchRepeat for 34 35" Some operators - first lot are case sensitive! 36syn case match 37syn keyword dosbatchOperator EQU NEQ LSS LEQ GTR GEQ 38syn case ignore 39syn match dosbatchOperator "\s[-+\*/%!~]\s" 40syn match dosbatchOperator "=" 41syn match dosbatchOperator "[-+\*/%]=" 42syn match dosbatchOperator "\s\(&\||\|^\|<<\|>>\)=\=\s" 43syn match dosbatchIfOperator "if\s\+\(\(not\)\=\s\+\)\=\(exist\|defined\|errorlevel\|cmdextversion\)\="lc=2 44 45" String - using "'s is a convenience rather than a requirement outside of FOR 46syn match dosbatchString "\"[^"]*\"" contains=dosbatchVariable,dosBatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell 47syn match dosbatchString "\<echo\([^)>|]\|\^\@<=[)>|]\)*"lc=4 contains=dosbatchVariable,dosbatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell 48syn match dosbatchEchoOperator "\<echo\s\+\(on\|off\)\s*$"lc=4 49 50" For embedded commands 51syn match dosbatchCmd "(\s*'[^']*'"lc=1 contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator 52 53" Numbers - surround with ws to not include in dir and filenames 54syn match dosbatchInteger "[[:space:]=(/:,!~-]\d\+"lc=1 55syn match dosbatchHex "[[:space:]=(/:,!~-]0x\x\+"lc=1 56syn match dosbatchBinary "[[:space:]=(/:,!~-]0b[01]\+"lc=1 57syn match dosbatchOctal "[[:space:]=(/:,!~-]0\o\+"lc=1 58syn cluster dosbatchNumber contains=dosbatchInteger,dosbatchHex,dosbatchBinary,dosbatchOctal 59 60" Command line switches 61syn match dosbatchSwitch "/\(\a\+\|?\)" 62 63" Various special escaped char formats 64syn match dosbatchSpecialChar "\^[&|()<>^]" 65syn match dosbatchSpecialChar "\$[a-hl-npqstv_$+]" 66syn match dosbatchSpecialChar "%%" 67 68" Environment variables 69syn match dosbatchIdentifier contained "\s\h\w*\>" 70syn match dosbatchVariable "%\h\w*%" 71syn match dosbatchVariable "%\h\w*:\*\=[^=]*=[^%]*%" 72syn match dosbatchVariable "%\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=%" contains=dosbatchInteger 73syn match dosbatchVariable "!\h\w*!" 74syn match dosbatchVariable "!\h\w*:\*\=[^=]*=[^!]*!" 75syn match dosbatchVariable "!\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=!" contains=dosbatchInteger 76syn match dosbatchSet "\s\h\w*[+-]\==\{-1}" contains=dosbatchIdentifier,dosbatchOperator 77 78" Args to bat files and for loops, etc 79syn match dosbatchArgument "%\(\d\|\*\)" 80syn match dosbatchArgument "%[a-z]\>" 81if dosbatch_cmdextversion == 1 82 syn match dosbatchArgument "%\~[fdpnxs]\+\(\($PATH:\)\=[a-z]\|\d\)\>" 83else 84 syn match dosbatchArgument "%\~[fdpnxsatz]\+\(\($PATH:\)\=[a-z]\|\d\)\>" 85endif 86 87" Line labels 88syn match dosbatchLabel "^\s*:\s*\h\w*\>" 89syn match dosbatchLabel "\<\(goto\|call\)\s\+:\h\w*\>"lc=4 90syn match dosbatchLabel "\<goto\s\+\h\w*\>"lc=4 91syn match dosbatchLabel ":\h\w*\>" 92 93" Comments - usual rem but also two colons as first non-space is an idiom 94syn match dosbatchComment "^rem\($\|\s.*$\)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell 95syn match dosbatchComment "^@rem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell 96syn match dosbatchComment "\srem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell 97syn match dosbatchComment "\s@rem\($\|\s.*$\)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell 98syn match dosbatchComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell 99 100" Comments in ()'s - still to handle spaces before rem 101syn match dosbatchComment "(rem\([^)]\|\^\@<=)\)*"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell 102 103syn keyword dosbatchImplicit append assoc at attrib break cacls cd chcp chdir 104syn keyword dosbatchImplicit chkdsk chkntfs cls cmd color comp compact convert copy 105syn keyword dosbatchImplicit date del dir diskcomp diskcopy doskey echo endlocal 106syn keyword dosbatchImplicit erase fc find findstr format ftype 107syn keyword dosbatchImplicit graftabl help keyb label md mkdir mode more move 108syn keyword dosbatchImplicit path pause popd print prompt pushd rd recover rem 109syn keyword dosbatchImplicit ren rename replace restore rmdir set setlocal shift 110syn keyword dosbatchImplicit sort start subst time title tree type ver verify 111syn keyword dosbatchImplicit vol xcopy 112 113" Define the default highlighting. 114" For version 5.7 and earlier: only when not done already 115" For version 5.8 and later: only when an item doesn't have highlighting yet 116if version >= 508 || !exists("did_dosbatch_syntax_inits") 117 if version < 508 118 let did_dosbatch_syntax_inits = 1 119 command -nargs=+ HiLink hi link <args> 120 else 121 command -nargs=+ HiLink hi def link <args> 122 endif 123 124 HiLink dosbatchTodo Todo 125 126 HiLink dosbatchStatement Statement 127 HiLink dosbatchCommands dosbatchStatement 128 HiLink dosbatchLabel Label 129 HiLink dosbatchConditional Conditional 130 HiLink dosbatchRepeat Repeat 131 132 HiLink dosbatchOperator Operator 133 HiLink dosbatchEchoOperator dosbatchOperator 134 HiLink dosbatchIfOperator dosbatchOperator 135 136 HiLink dosbatchArgument Identifier 137 HiLink dosbatchIdentifier Identifier 138 HiLink dosbatchVariable dosbatchIdentifier 139 140 HiLink dosbatchSpecialChar SpecialChar 141 HiLink dosbatchString String 142 HiLink dosbatchNumber Number 143 HiLink dosbatchInteger dosbatchNumber 144 HiLink dosbatchHex dosbatchNumber 145 HiLink dosbatchBinary dosbatchNumber 146 HiLink dosbatchOctal dosbatchNumber 147 148 HiLink dosbatchComment Comment 149 HiLink dosbatchImplicit Function 150 151 HiLink dosbatchSwitch Special 152 153 HiLink dosbatchCmd PreProc 154 155 delcommand HiLink 156endif 157 158let b:current_syntax = "dosbatch" 159 160" vim: ts=8 161