blob: 55601996adb0eaa389953ec2765ba402762505b0 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaar938ae282023-02-20 20:44:55 +00002" Language: MS-DOS/Windows batch file (with NT command extensions)
3" Maintainer: Mike Williams <mrmrdubya@gmail.com>
Bram Moolenaar071d4272004-06-13 20:20:40 +00004" Filenames: *.bat
Christian Brabandtf7f33e32024-02-06 10:56:26 +01005" Last Change: 3rd February 2024
Bram Moolenaar071d4272004-06-13 20:20:40 +00006"
7" Options Flags:
8" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default]
Christian Brabandtf7f33e32024-02-06 10:56:26 +01009" dosbatch_colons_comment - any value to allow :: comments in code blocks
Bram Moolenaar071d4272004-06-13 20:20:40 +000010"
11
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020012" quit when a syntax file was already loaded
13if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000014 finish
15endif
16
17" Set default highlighting to Win2k
18if !exists("dosbatch_cmdextversion")
19 let dosbatch_cmdextversion = 2
20endif
21
22" DOS bat files are case insensitive but case preserving!
23syn case ignore
24
25syn keyword dosbatchTodo contained TODO
26
27" Dosbat keywords
28syn keyword dosbatchStatement goto call exit
29syn keyword dosbatchConditional if else
30syn keyword dosbatchRepeat for
31
32" Some operators - first lot are case sensitive!
33syn case match
34syn keyword dosbatchOperator EQU NEQ LSS LEQ GTR GEQ
35syn case ignore
Bram Moolenaar5c736222010-01-06 20:54:52 +010036syn match dosbatchOperator "\s[-+\*/%!~]\s"
Bram Moolenaar071d4272004-06-13 20:20:40 +000037syn match dosbatchOperator "="
38syn match dosbatchOperator "[-+\*/%]="
39syn match dosbatchOperator "\s\(&\||\|^\|<<\|>>\)=\=\s"
40syn match dosbatchIfOperator "if\s\+\(\(not\)\=\s\+\)\=\(exist\|defined\|errorlevel\|cmdextversion\)\="lc=2
41
42" String - using "'s is a convenience rather than a requirement outside of FOR
Bram Moolenaar864207d2008-06-24 22:14:38 +000043syn match dosbatchString "\"[^"]*\"" contains=dosbatchVariable,dosBatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
44syn match dosbatchString "\<echo\([^)>|]\|\^\@<=[)>|]\)*"lc=4 contains=dosbatchVariable,dosbatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +000045syn match dosbatchEchoOperator "\<echo\s\+\(on\|off\)\s*$"lc=4
46
47" For embedded commands
48syn match dosbatchCmd "(\s*'[^']*'"lc=1 contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator
49
50" Numbers - surround with ws to not include in dir and filenames
Bram Moolenaar5c736222010-01-06 20:54:52 +010051syn match dosbatchInteger "[[:space:]=(/:,!~-]\d\+"lc=1
52syn match dosbatchHex "[[:space:]=(/:,!~-]0x\x\+"lc=1
53syn match dosbatchBinary "[[:space:]=(/:,!~-]0b[01]\+"lc=1
54syn match dosbatchOctal "[[:space:]=(/:,!~-]0\o\+"lc=1
Bram Moolenaar071d4272004-06-13 20:20:40 +000055syn cluster dosbatchNumber contains=dosbatchInteger,dosbatchHex,dosbatchBinary,dosbatchOctal
56
57" Command line switches
58syn match dosbatchSwitch "/\(\a\+\|?\)"
59
60" Various special escaped char formats
61syn match dosbatchSpecialChar "\^[&|()<>^]"
62syn match dosbatchSpecialChar "\$[a-hl-npqstv_$+]"
63syn match dosbatchSpecialChar "%%"
64
65" Environment variables
66syn match dosbatchIdentifier contained "\s\h\w*\>"
67syn match dosbatchVariable "%\h\w*%"
68syn match dosbatchVariable "%\h\w*:\*\=[^=]*=[^%]*%"
Bram Moolenaar5c736222010-01-06 20:54:52 +010069syn match dosbatchVariable "%\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=%" contains=dosbatchInteger
Bram Moolenaar071d4272004-06-13 20:20:40 +000070syn match dosbatchVariable "!\h\w*!"
Bram Moolenaar5c736222010-01-06 20:54:52 +010071syn match dosbatchVariable "!\h\w*:\*\=[^=]*=[^!]*!"
72syn match dosbatchVariable "!\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=!" contains=dosbatchInteger
Bram Moolenaar071d4272004-06-13 20:20:40 +000073syn match dosbatchSet "\s\h\w*[+-]\==\{-1}" contains=dosbatchIdentifier,dosbatchOperator
74
75" Args to bat files and for loops, etc
76syn match dosbatchArgument "%\(\d\|\*\)"
Bram Moolenaar5c736222010-01-06 20:54:52 +010077syn match dosbatchArgument "%[a-z]\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000078if dosbatch_cmdextversion == 1
79 syn match dosbatchArgument "%\~[fdpnxs]\+\(\($PATH:\)\=[a-z]\|\d\)\>"
80else
81 syn match dosbatchArgument "%\~[fdpnxsatz]\+\(\($PATH:\)\=[a-z]\|\d\)\>"
82endif
83
84" Line labels
85syn match dosbatchLabel "^\s*:\s*\h\w*\>"
86syn match dosbatchLabel "\<\(goto\|call\)\s\+:\h\w*\>"lc=4
87syn match dosbatchLabel "\<goto\s\+\h\w*\>"lc=4
88syn match dosbatchLabel ":\h\w*\>"
89
90" Comments - usual rem but also two colons as first non-space is an idiom
Christian Brabandtf7f33e32024-02-06 10:56:26 +010091syn match dosbatchRemComment "^rem\($\|\s.*$\)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
92syn match dosbatchRemComment "^@rem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
93syn match dosbatchRemComment "\srem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
94syn match dosbatchRemComment "\s@rem\($\|\s.*$\)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
95syn match dosbatchColonComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +000096
Christian Brabandtf7f33e32024-02-06 10:56:26 +010097" Commands code blocks
98syn cluster dosbatchCodeBlockComment contains=dosbatchRemComment
99if exists("dosbatch_colons_comment")
100 syn cluster dosbatchCodeBlockComment add=dosbatchColonComment
101else
102 syn match dosbatchColonCommentErr contained "\s*:\s*:.*$"
103endif
104syn match dosbatchColonCommentErr contained "\s*:\s*:[^)]*\(\(\n\s*\)\?)\)\@="
105syn region dosbatchCodeBlock transparent start=+(+ end=+)+ contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator,@dosbatchCodeBlockComment,dosbatchColonCommentErr,dosbatchCodeBlock
106syn match dosbatchCodeBlockErr ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000107
108syn keyword dosbatchImplicit append assoc at attrib break cacls cd chcp chdir
109syn keyword dosbatchImplicit chkdsk chkntfs cls cmd color comp compact convert copy
110syn keyword dosbatchImplicit date del dir diskcomp diskcopy doskey echo endlocal
111syn keyword dosbatchImplicit erase fc find findstr format ftype
112syn keyword dosbatchImplicit graftabl help keyb label md mkdir mode more move
113syn keyword dosbatchImplicit path pause popd print prompt pushd rd recover rem
114syn keyword dosbatchImplicit ren rename replace restore rmdir set setlocal shift
115syn keyword dosbatchImplicit sort start subst time title tree type ver verify
116syn keyword dosbatchImplicit vol xcopy
117
118" Define the default highlighting.
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200119" Only when an item doesn't have highlighting yet
Bram Moolenaar071d4272004-06-13 20:20:40 +0000120
Bram Moolenaar938ae282023-02-20 20:44:55 +0000121hi def link dosbatchTodo Todo
122hi def link dosbatchError Error
Christian Brabandtf7f33e32024-02-06 10:56:26 +0100123hi def link dosbatchCodeBlockErr dosbatchError
124hi def link dosbatchColonCommentErr dosbatchError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200126hi def link dosbatchStatement Statement
127hi def link dosbatchCommands dosbatchStatement
Bram Moolenaar938ae282023-02-20 20:44:55 +0000128hi def link dosbatchLabel Label
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200129hi def link dosbatchConditional Conditional
Bram Moolenaar938ae282023-02-20 20:44:55 +0000130hi def link dosbatchRepeat Repeat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000131
Bram Moolenaar938ae282023-02-20 20:44:55 +0000132hi def link dosbatchOperator Operator
133hi def link dosbatchEchoOperator dosbatchOperator
134hi def link dosbatchIfOperator dosbatchOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200136hi def link dosbatchArgument Identifier
Bram Moolenaar938ae282023-02-20 20:44:55 +0000137hi def link dosbatchIdentifier Identifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200138hi def link dosbatchVariable dosbatchIdentifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200140hi def link dosbatchSpecialChar SpecialChar
Bram Moolenaar938ae282023-02-20 20:44:55 +0000141hi def link dosbatchString String
142hi def link dosbatchNumber Number
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200143hi def link dosbatchInteger dosbatchNumber
144hi def link dosbatchHex dosbatchNumber
Bram Moolenaar938ae282023-02-20 20:44:55 +0000145hi def link dosbatchBinary dosbatchNumber
146hi def link dosbatchOctal dosbatchNumber
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200148hi def link dosbatchComment Comment
Christian Brabandtf7f33e32024-02-06 10:56:26 +0100149hi def link dosbatchRemComment dosbatchComment
150hi def link dosbatchColonComment dosbatchComment
151
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200152hi def link dosbatchImplicit Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153
Bram Moolenaar938ae282023-02-20 20:44:55 +0000154hi def link dosbatchSwitch Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000155
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200156hi def link dosbatchCmd PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
159let b:current_syntax = "dosbatch"
160
161" vim: ts=8