blob: 761fac0dc26d7b6caa903ed817e71d1e8f153c63 [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
Ken Takata11c92be2024-08-14 21:56:42 +02006" 2024 Aug 14 by Vim Project: improve syntax (#15453)
Bram Moolenaar071d4272004-06-13 20:20:40 +00007"
8" Options Flags:
9" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default]
Christian Brabandtf7f33e32024-02-06 10:56:26 +010010" dosbatch_colons_comment - any value to allow :: comments in code blocks
Bram Moolenaar071d4272004-06-13 20:20:40 +000011"
12
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020013" quit when a syntax file was already loaded
14if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000015 finish
16endif
17
18" Set default highlighting to Win2k
19if !exists("dosbatch_cmdextversion")
20 let dosbatch_cmdextversion = 2
21endif
22
23" DOS bat files are case insensitive but case preserving!
24syn case ignore
25
26syn keyword dosbatchTodo contained TODO
27
28" Dosbat keywords
29syn keyword dosbatchStatement goto call exit
30syn keyword dosbatchConditional if else
31syn keyword dosbatchRepeat for
32
33" Some operators - first lot are case sensitive!
34syn case match
35syn keyword dosbatchOperator EQU NEQ LSS LEQ GTR GEQ
36syn case ignore
Bram Moolenaar5c736222010-01-06 20:54:52 +010037syn match dosbatchOperator "\s[-+\*/%!~]\s"
Bram Moolenaar071d4272004-06-13 20:20:40 +000038syn match dosbatchOperator "="
39syn match dosbatchOperator "[-+\*/%]="
40syn match dosbatchOperator "\s\(&\||\|^\|<<\|>>\)=\=\s"
41syn match dosbatchIfOperator "if\s\+\(\(not\)\=\s\+\)\=\(exist\|defined\|errorlevel\|cmdextversion\)\="lc=2
42
43" String - using "'s is a convenience rather than a requirement outside of FOR
Bram Moolenaar864207d2008-06-24 22:14:38 +000044syn match dosbatchString "\"[^"]*\"" contains=dosbatchVariable,dosBatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
45syn match dosbatchString "\<echo\([^)>|]\|\^\@<=[)>|]\)*"lc=4 contains=dosbatchVariable,dosbatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +000046syn match dosbatchEchoOperator "\<echo\s\+\(on\|off\)\s*$"lc=4
47
48" For embedded commands
Ken Takata11c92be2024-08-14 21:56:42 +020049syn match dosbatchCmd "(\s*'[^']*'"lc=1 contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator,dosbatchIfOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +000050
51" Numbers - surround with ws to not include in dir and filenames
Bram Moolenaar5c736222010-01-06 20:54:52 +010052syn match dosbatchInteger "[[:space:]=(/:,!~-]\d\+"lc=1
53syn match dosbatchHex "[[:space:]=(/:,!~-]0x\x\+"lc=1
54syn match dosbatchBinary "[[:space:]=(/:,!~-]0b[01]\+"lc=1
55syn match dosbatchOctal "[[:space:]=(/:,!~-]0\o\+"lc=1
Bram Moolenaar071d4272004-06-13 20:20:40 +000056syn cluster dosbatchNumber contains=dosbatchInteger,dosbatchHex,dosbatchBinary,dosbatchOctal
57
58" Command line switches
59syn match dosbatchSwitch "/\(\a\+\|?\)"
60
61" Various special escaped char formats
62syn match dosbatchSpecialChar "\^[&|()<>^]"
63syn match dosbatchSpecialChar "\$[a-hl-npqstv_$+]"
64syn match dosbatchSpecialChar "%%"
65
66" Environment variables
67syn match dosbatchIdentifier contained "\s\h\w*\>"
68syn match dosbatchVariable "%\h\w*%"
69syn match dosbatchVariable "%\h\w*:\*\=[^=]*=[^%]*%"
Bram Moolenaar5c736222010-01-06 20:54:52 +010070syn match dosbatchVariable "%\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=%" contains=dosbatchInteger
Bram Moolenaar071d4272004-06-13 20:20:40 +000071syn match dosbatchVariable "!\h\w*!"
Bram Moolenaar5c736222010-01-06 20:54:52 +010072syn match dosbatchVariable "!\h\w*:\*\=[^=]*=[^!]*!"
73syn match dosbatchVariable "!\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=!" contains=dosbatchInteger
Bram Moolenaar071d4272004-06-13 20:20:40 +000074syn match dosbatchSet "\s\h\w*[+-]\==\{-1}" contains=dosbatchIdentifier,dosbatchOperator
75
76" Args to bat files and for loops, etc
77syn match dosbatchArgument "%\(\d\|\*\)"
Bram Moolenaar5c736222010-01-06 20:54:52 +010078syn match dosbatchArgument "%[a-z]\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000079if dosbatch_cmdextversion == 1
80 syn match dosbatchArgument "%\~[fdpnxs]\+\(\($PATH:\)\=[a-z]\|\d\)\>"
81else
82 syn match dosbatchArgument "%\~[fdpnxsatz]\+\(\($PATH:\)\=[a-z]\|\d\)\>"
83endif
84
85" Line labels
86syn match dosbatchLabel "^\s*:\s*\h\w*\>"
87syn match dosbatchLabel "\<\(goto\|call\)\s\+:\h\w*\>"lc=4
88syn match dosbatchLabel "\<goto\s\+\h\w*\>"lc=4
89syn match dosbatchLabel ":\h\w*\>"
90
91" Comments - usual rem but also two colons as first non-space is an idiom
Christian Brabandtf7f33e32024-02-06 10:56:26 +010092syn match dosbatchRemComment "^rem\($\|\s.*$\)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
93syn match dosbatchRemComment "^@rem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
94syn match dosbatchRemComment "\srem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
95syn match dosbatchRemComment "\s@rem\($\|\s.*$\)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
96syn match dosbatchColonComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +000097
Christian Brabandtf7f33e32024-02-06 10:56:26 +010098" Commands code blocks
99syn cluster dosbatchCodeBlockComment contains=dosbatchRemComment
100if exists("dosbatch_colons_comment")
101 syn cluster dosbatchCodeBlockComment add=dosbatchColonComment
102else
103 syn match dosbatchColonCommentErr contained "\s*:\s*:.*$"
104endif
105syn match dosbatchColonCommentErr contained "\s*:\s*:[^)]*\(\(\n\s*\)\?)\)\@="
Ken Takata11c92be2024-08-14 21:56:42 +0200106syn region dosbatchCodeBlock transparent start=+(+ end=+)+ contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator,dosbatchIfOperator,@dosbatchCodeBlockComment,dosbatchColonCommentErr,dosbatchCodeBlock
Christian Brabandtf7f33e32024-02-06 10:56:26 +0100107syn match dosbatchCodeBlockErr ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108
Ken Takata11c92be2024-08-14 21:56:42 +0200109syn sync match dosbatchSyncCodeBlock grouphere NONE "^)\s*$"
110
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111syn keyword dosbatchImplicit append assoc at attrib break cacls cd chcp chdir
112syn keyword dosbatchImplicit chkdsk chkntfs cls cmd color comp compact convert copy
113syn keyword dosbatchImplicit date del dir diskcomp diskcopy doskey echo endlocal
114syn keyword dosbatchImplicit erase fc find findstr format ftype
115syn keyword dosbatchImplicit graftabl help keyb label md mkdir mode more move
116syn keyword dosbatchImplicit path pause popd print prompt pushd rd recover rem
117syn keyword dosbatchImplicit ren rename replace restore rmdir set setlocal shift
118syn keyword dosbatchImplicit sort start subst time title tree type ver verify
119syn keyword dosbatchImplicit vol xcopy
120
121" Define the default highlighting.
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200122" Only when an item doesn't have highlighting yet
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123
Bram Moolenaar938ae282023-02-20 20:44:55 +0000124hi def link dosbatchTodo Todo
125hi def link dosbatchError Error
Christian Brabandtf7f33e32024-02-06 10:56:26 +0100126hi def link dosbatchCodeBlockErr dosbatchError
127hi def link dosbatchColonCommentErr dosbatchError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200129hi def link dosbatchStatement Statement
130hi def link dosbatchCommands dosbatchStatement
Bram Moolenaar938ae282023-02-20 20:44:55 +0000131hi def link dosbatchLabel Label
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200132hi def link dosbatchConditional Conditional
Bram Moolenaar938ae282023-02-20 20:44:55 +0000133hi def link dosbatchRepeat Repeat
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134
Bram Moolenaar938ae282023-02-20 20:44:55 +0000135hi def link dosbatchOperator Operator
136hi def link dosbatchEchoOperator dosbatchOperator
137hi def link dosbatchIfOperator dosbatchOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000138
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200139hi def link dosbatchArgument Identifier
Bram Moolenaar938ae282023-02-20 20:44:55 +0000140hi def link dosbatchIdentifier Identifier
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200141hi def link dosbatchVariable dosbatchIdentifier
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200143hi def link dosbatchSpecialChar SpecialChar
Bram Moolenaar938ae282023-02-20 20:44:55 +0000144hi def link dosbatchString String
145hi def link dosbatchNumber Number
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200146hi def link dosbatchInteger dosbatchNumber
147hi def link dosbatchHex dosbatchNumber
Bram Moolenaar938ae282023-02-20 20:44:55 +0000148hi def link dosbatchBinary dosbatchNumber
149hi def link dosbatchOctal dosbatchNumber
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200151hi def link dosbatchComment Comment
Christian Brabandtf7f33e32024-02-06 10:56:26 +0100152hi def link dosbatchRemComment dosbatchComment
153hi def link dosbatchColonComment dosbatchComment
154
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200155hi def link dosbatchImplicit Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156
Bram Moolenaar938ae282023-02-20 20:44:55 +0000157hi def link dosbatchSwitch Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200159hi def link dosbatchCmd PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161
162let b:current_syntax = "dosbatch"
163
164" vim: ts=8