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