1{ 2 "information_for_contributors": [ 3 "This file has been converted from https://github.com/mmims/language-batchfile/blob/master/grammars/batchfile.cson", 4 "If you want to provide a fix or improvement, please create a pull request against the original repository.", 5 "Once accepted there, we are happy to receive an update request." 6 ], 7 "version": "https://github.com/mmims/language-batchfile/commit/6154ae25a24e01ac9329e7bcf958e093cd8733a9", 8 "name": "Batch File", 9 "scopeName": "source.batchfile", 10 "injections": { 11 "L:meta.block.repeat.batchfile": { 12 "patterns": [ 13 { 14 "include": "#repeatParameter" 15 } 16 ] 17 } 18 }, 19 "patterns": [ 20 { 21 "include": "#commands" 22 }, 23 { 24 "include": "#comments" 25 }, 26 { 27 "include": "#constants" 28 }, 29 { 30 "include": "#controls" 31 }, 32 { 33 "include": "#escaped_characters" 34 }, 35 { 36 "include": "#labels" 37 }, 38 { 39 "include": "#numbers" 40 }, 41 { 42 "include": "#operators" 43 }, 44 { 45 "include": "#parens" 46 }, 47 { 48 "include": "#strings" 49 }, 50 { 51 "include": "#variables" 52 } 53 ], 54 "repository": { 55 "commands": { 56 "patterns": [ 57 { 58 "match": "(?<=^|[\\s@])(?i:adprep|append|arp|assoc|at|atmadm|attrib|auditpol|autochk|autoconv|autofmt|bcdboot|bcdedit|bdehdcfg|bitsadmin|bootcfg|brea|cacls|cd|certreq|certutil|change|chcp|chdir|chglogon|chgport|chgusr|chkdsk|chkntfs|choice|cipher|clip|cls|clscluadmin|cluster|cmd|cmdkey|cmstp|color|comp|compact|convert|copy|cprofile|cscript|csvde|date|dcdiag|dcgpofix|dcpromo|defra|del|dfscmd|dfsdiag|dfsrmig|diantz|dir|dirquota|diskcomp|diskcopy|diskpart|diskperf|diskraid|diskshadow|dispdiag|doin|dnscmd|doskey|driverquery|dsacls|dsadd|dsamain|dsdbutil|dsget|dsmgmt|dsmod|dsmove|dsquery|dsrm|edit|endlocal|eraseesentutl|eventcreate|eventquery|eventtriggers|evntcmd|expand|extract|fc|filescrn|find|findstr|finger|flattemp|fonde|forfiles|format|freedisk|fsutil|ftp|ftype|fveupdate|getmac|gettype|gpfixup|gpresult|gpupdate|graftabl|hashgen|hep|helpctr|hostname|icacls|iisreset|inuse|ipconfig|ipxroute|irftp|ismserv|jetpack|klist|ksetup|ktmutil|ktpass|label|ldifd|ldp|lodctr|logman|logoff|lpq|lpr|macfile|makecab|manage-bde|mapadmin|md|mkdir|mklink|mmc|mode|more|mount|mountvol|move|mqbup|mqsvc|mqtgsvc|msdt|msg|msiexec|msinfo32|mstsc|nbtstat|net computer|net group|net localgroup|net print|net session|net share|net start|net stop|net use|net user|net view|net|netcfg|netdiag|netdom|netsh|netstat|nfsadmin|nfsshare|nfsstat|nlb|nlbmgr|nltest|nslookup|ntackup|ntcmdprompt|ntdsutil|ntfrsutl|openfiles|pagefileconfig|path|pathping|pause|pbadmin|pentnt|perfmon|ping|pnpunatten|pnputil|popd|powercfg|powershell|powershell_ise|print|prncnfg|prndrvr|prnjobs|prnmngr|prnport|prnqctl|prompt|pubprn|pushd|pushprinterconnections|pwlauncher|qappsrv|qprocess|query|quser|qwinsta|rasdial|rcp|rd|rdpsign|regentc|recover|redircmp|redirusr|reg|regini|regsvr32|relog|ren|rename|rendom|repadmin|repair-bde|replace|reset session|rxec|risetup|rmdir|robocopy|route|rpcinfo|rpcping|rsh|runas|rundll32|rwinsta|sc|schtasks|scp|scwcmd|secedit|serverceipoptin|servrmanagercmd|serverweroptin|setspn|setx|sfc|sftp|shadow|shift|showmount|shutdown|sort|ssh|ssh-add|ssh-agent|ssh-keygen|ssh-keyscan|start|storrept|subst|sxstrace|ysocmgr|systeminfo|takeown|tapicfg|taskkill|tasklist|tcmsetup|telnet|tftp|time|timeout|title|tlntadmn|tpmvscmgr|tpmvscmgr|tacerpt|tracert|tree|tscon|tsdiscon|tsecimp|tskill|tsprof|type|typeperf|tzutil|uddiconfig|umount|unlodctr|ver|verifier|verif|vol|vssadmin|w32tm|waitfor|wbadmin|wdsutil|wecutil|wevtutil|where|whoami|winnt|winnt32|winpop|winrm|winrs|winsat|wlbs|wmic|wscript|wsl|xcopy)(?=$|\\s)", 59 "name": "keyword.command.batchfile" 60 }, 61 { 62 "begin": "(?i)(?<=^|[\\s@])(echo)(?:(?=$|\\.|:)|\\s+(?:(on|off)(?=\\s*$))?)", 63 "beginCaptures": { 64 "1": { 65 "name": "keyword.command.batchfile" 66 }, 67 "2": { 68 "name": "keyword.other.special-method.batchfile" 69 } 70 }, 71 "end": "(?=$\\n|[&|><)])", 72 "patterns": [ 73 { 74 "include": "#escaped_characters" 75 }, 76 { 77 "include": "#variables" 78 }, 79 { 80 "include": "#numbers" 81 }, 82 { 83 "include": "#strings" 84 } 85 ] 86 }, 87 { 88 "match": "(?i)(?<=^|[\\s@])(setlocal)(?:\\s*$|\\s+(EnableExtensions|DisableExtensions|EnableDelayedExpansion|DisableDelayedExpansion)(?=\\s*$))", 89 "captures": { 90 "1": { 91 "name": "keyword.command.batchfile" 92 }, 93 "2": { 94 "name": "keyword.other.special-method.batchfile" 95 } 96 } 97 }, 98 { 99 "include": "#command_set" 100 } 101 ] 102 }, 103 "command_set": { 104 "patterns": [ 105 { 106 "begin": "(?<=^|[\\s@])(?i:SET)(?=$|\\s)", 107 "beginCaptures": { 108 "0": { 109 "name": "keyword.command.batchfile" 110 } 111 }, 112 "end": "(?=$\\n|[&|><)])", 113 "patterns": [ 114 { 115 "include": "#command_set_inside" 116 } 117 ] 118 } 119 ] 120 }, 121 "command_set_inside": { 122 "patterns": [ 123 { 124 "include": "#escaped_characters" 125 }, 126 { 127 "include": "#variables" 128 }, 129 { 130 "include": "#numbers" 131 }, 132 { 133 "include": "#parens" 134 }, 135 { 136 "include": "#command_set_strings" 137 }, 138 { 139 "include": "#strings" 140 }, 141 { 142 "begin": "([^ ][^=]*)(=)", 143 "beginCaptures": { 144 "1": { 145 "name": "variable.other.readwrite.batchfile" 146 }, 147 "2": { 148 "name": "keyword.operator.assignment.batchfile" 149 } 150 }, 151 "end": "(?=$\\n|[&|><)])", 152 "patterns": [ 153 { 154 "include": "#escaped_characters" 155 }, 156 { 157 "include": "#variables" 158 }, 159 { 160 "include": "#numbers" 161 }, 162 { 163 "include": "#parens" 164 }, 165 { 166 "include": "#strings" 167 } 168 ] 169 }, 170 { 171 "begin": "\\s+/[aA]\\s+", 172 "end": "(?=$\\n|[&|><)])", 173 "name": "meta.expression.set.batchfile", 174 "patterns": [ 175 { 176 "begin": "\"", 177 "beginCaptures": { 178 "0": { 179 "name": "punctuation.definition.string.begin.batchfile" 180 } 181 }, 182 "end": "\"", 183 "endCaptures": { 184 "0": { 185 "name": "punctuation.definition.string.end.batchfile" 186 } 187 }, 188 "name": "string.quoted.double.batchfile", 189 "patterns": [ 190 { 191 "include": "#command_set_inside_arithmetic" 192 }, 193 { 194 "include": "#command_set_group" 195 }, 196 { 197 "include": "#variables" 198 } 199 ] 200 }, 201 { 202 "include": "#command_set_inside_arithmetic" 203 }, 204 { 205 "include": "#command_set_group" 206 } 207 ] 208 }, 209 { 210 "begin": "\\s+/[pP]\\s+", 211 "end": "(?=$\\n|[&|><)])", 212 "patterns": [ 213 { 214 "include": "#command_set_strings" 215 }, 216 { 217 "begin": "([^ ][^=]*)(=)", 218 "beginCaptures": { 219 "1": { 220 "name": "variable.other.readwrite.batchfile" 221 }, 222 "2": { 223 "name": "keyword.operator.assignment.batchfile" 224 } 225 }, 226 "end": "(?=$\\n|[&|><)])", 227 "name": "meta.prompt.set.batchfile", 228 "patterns": [ 229 { 230 "include": "#strings" 231 } 232 ] 233 } 234 ] 235 } 236 ] 237 }, 238 "command_set_group": { 239 "patterns": [ 240 { 241 "begin": "\\(", 242 "beginCaptures": { 243 "0": { 244 "name": "punctuation.section.group.begin.batchfile" 245 } 246 }, 247 "end": "\\)", 248 "endCaptures": { 249 "0": { 250 "name": "punctuation.section.group.end.batchfile" 251 } 252 }, 253 "patterns": [ 254 { 255 "include": "#command_set_inside_arithmetic" 256 } 257 ] 258 } 259 ] 260 }, 261 "command_set_inside_arithmetic": { 262 "patterns": [ 263 { 264 "include": "#command_set_operators" 265 }, 266 { 267 "include": "#numbers" 268 }, 269 { 270 "match": ",", 271 "name": "punctuation.separator.batchfile" 272 } 273 ] 274 }, 275 "command_set_operators": { 276 "patterns": [ 277 { 278 "match": "([^ ]*)(\\+\\=|\\-\\=|\\*\\=|\\/\\=|%%\\=|&\\=|\\|\\=|\\^\\=|<<\\=|>>\\=)", 279 "captures": { 280 "1": { 281 "name": "variable.other.readwrite.batchfile" 282 }, 283 "2": { 284 "name": "keyword.operator.assignment.augmented.batchfile" 285 } 286 } 287 }, 288 { 289 "match": "\\+|\\-|/|\\*|%%|\\||&|\\^|<<|>>|~", 290 "name": "keyword.operator.arithmetic.batchfile" 291 }, 292 { 293 "match": "!", 294 "name": "keyword.operator.logical.batchfile" 295 }, 296 { 297 "match": "([^ =]*)(=)", 298 "captures": { 299 "1": { 300 "name": "variable.other.readwrite.batchfile" 301 }, 302 "2": { 303 "name": "keyword.operator.assignment.batchfile" 304 } 305 } 306 } 307 ] 308 }, 309 "command_set_strings": { 310 "patterns": [ 311 { 312 "begin": "(\")\\s*([^ ][^=]*)(=)", 313 "beginCaptures": { 314 "1": { 315 "name": "punctuation.definition.string.begin.batchfile" 316 }, 317 "2": { 318 "name": "variable.other.readwrite.batchfile" 319 }, 320 "3": { 321 "name": "keyword.operator.assignment.batchfile" 322 } 323 }, 324 "end": "\"", 325 "endCaptures": { 326 "0": { 327 "name": "punctuation.definition.string.end.batchfile" 328 } 329 }, 330 "name": "string.quoted.double.batchfile", 331 "patterns": [ 332 { 333 "include": "#variables" 334 }, 335 { 336 "include": "#numbers" 337 }, 338 { 339 "include": "#escaped_characters" 340 } 341 ] 342 } 343 ] 344 }, 345 "comments": { 346 "patterns": [ 347 { 348 "begin": "(?:^|(&))\\s*(?=((?::[+=,;: ])))", 349 "beginCaptures": { 350 "1": { 351 "name": "keyword.operator.conditional.batchfile" 352 } 353 }, 354 "end": "\\n", 355 "patterns": [ 356 { 357 "begin": "((?::[+=,;: ]))", 358 "beginCaptures": { 359 "1": { 360 "name": "punctuation.definition.comment.batchfile" 361 } 362 }, 363 "end": "(?=\\n)", 364 "name": "comment.line.colon.batchfile" 365 } 366 ] 367 }, 368 { 369 "begin": "(?<=^|[\\s@])(?i)(REM)(\\.)", 370 "beginCaptures": { 371 "1": { 372 "name": "keyword.command.rem.batchfile" 373 }, 374 "2": { 375 "name": "punctuation.separator.batchfile" 376 } 377 }, 378 "end": "(?=$\\n|[&|><)])", 379 "name": "comment.line.rem.batchfile" 380 }, 381 { 382 "begin": "(?<=^|[\\s@])(?i:rem)\\b", 383 "beginCaptures": { 384 "0": { 385 "name": "keyword.command.rem.batchfile" 386 } 387 }, 388 "end": "\\n", 389 "name": "comment.line.rem.batchfile", 390 "patterns": [ 391 { 392 "match": "[><|]", 393 "name": "invalid.illegal.unexpected-character.batchfile" 394 } 395 ] 396 } 397 ] 398 }, 399 "constants": { 400 "patterns": [ 401 { 402 "match": "\\b(?i:NUL)\\b", 403 "name": "constant.language.batchfile" 404 } 405 ] 406 }, 407 "controls": { 408 "patterns": [ 409 { 410 "match": "(?i)(?<=^|\\s)(?:call|exit(?=$|\\s)|goto(?=$|\\s|:))", 411 "name": "keyword.control.statement.batchfile" 412 }, 413 { 414 "match": "(?<=^|\\s)(?i)(if)\\s+(?:(not)\\s+)?(exist|defined|errorlevel|cmdextversion)(?=\\s)", 415 "captures": { 416 "1": { 417 "name": "keyword.control.conditional.batchfile" 418 }, 419 "2": { 420 "name": "keyword.operator.logical.batchfile" 421 }, 422 "3": { 423 "name": "keyword.other.special-method.batchfile" 424 } 425 } 426 }, 427 { 428 "match": "(?<=^|\\s)(?i)(?:if|else)(?=$|\\s)", 429 "name": "keyword.control.conditional.batchfile" 430 }, 431 { 432 "begin": "(?<=^|[\\s(&^])(?i)for(?=\\s)", 433 "beginCaptures": { 434 "0": { 435 "name": "keyword.control.repeat.batchfile" 436 } 437 }, 438 "name": "meta.block.repeat.batchfile", 439 "end": "\\n", 440 "patterns": [ 441 { 442 "begin": "(?<=[\\s^])(?i)in(?=\\s)", 443 "beginCaptures": { 444 "0": { 445 "name": "keyword.control.repeat.in.batchfile" 446 } 447 }, 448 "end": "(?<=[\\s)^])(?i)do(?=\\s)|\\n", 449 "endCaptures": { 450 "0": { 451 "name": "keyword.control.repeat.do.batchfile" 452 } 453 }, 454 "patterns": [ 455 { 456 "include": "$self" 457 } 458 ] 459 }, 460 { 461 "include": "$self" 462 } 463 ] 464 } 465 ] 466 }, 467 "escaped_characters": { 468 "patterns": [ 469 { 470 "match": "%%|\\^\\^!|\\^(?=.)|\\^\\n", 471 "name": "constant.character.escape.batchfile" 472 } 473 ] 474 }, 475 "labels": { 476 "patterns": [ 477 { 478 "match": "(?i)(?:^\\s*|(?<=call|goto)\\s*)(:)([^+=,;:\\s]\\S*)", 479 "captures": { 480 "1": { 481 "name": "punctuation.separator.batchfile" 482 }, 483 "2": { 484 "name": "keyword.other.special-method.batchfile" 485 } 486 } 487 } 488 ] 489 }, 490 "numbers": { 491 "patterns": [ 492 { 493 "match": "(?<=^|\\s|=)(0[xX][0-9A-Fa-f]*|[+-]?\\d+)(?=$|\\s|<|>)", 494 "name": "constant.numeric.batchfile" 495 } 496 ] 497 }, 498 "operators": { 499 "patterns": [ 500 { 501 "match": "@(?=\\S)", 502 "name": "keyword.operator.at.batchfile" 503 }, 504 { 505 "match": "(?<=\\s)(?i:EQU|NEQ|LSS|LEQ|GTR|GEQ)(?=\\s)|==", 506 "name": "keyword.operator.comparison.batchfile" 507 }, 508 { 509 "match": "(?<=\\s)(?i)(NOT)(?=\\s)", 510 "name": "keyword.operator.logical.batchfile" 511 }, 512 { 513 "match": "(?<!\\^)&&?|\\|\\|", 514 "name": "keyword.operator.conditional.batchfile" 515 }, 516 { 517 "match": "(?<!\\^)\\|", 518 "name": "keyword.operator.pipe.batchfile" 519 }, 520 { 521 "match": "<&?|>[&>]?", 522 "name": "keyword.operator.redirection.batchfile" 523 } 524 ] 525 }, 526 "parens": { 527 "patterns": [ 528 { 529 "begin": "\\(", 530 "beginCaptures": { 531 "0": { 532 "name": "punctuation.section.group.begin.batchfile" 533 } 534 }, 535 "end": "\\)", 536 "endCaptures": { 537 "0": { 538 "name": "punctuation.section.group.end.batchfile" 539 } 540 }, 541 "name": "meta.group.batchfile", 542 "patterns": [ 543 { 544 "match": ",|;", 545 "name": "punctuation.separator.batchfile" 546 }, 547 { 548 "include": "$self" 549 } 550 ] 551 } 552 ] 553 }, 554 "repeatParameter": { 555 "patterns": [ 556 { 557 "match": "(%%)(?:(?i:~[fdpnxsatz]*(?:\\$PATH:)?)?[a-zA-Z])", 558 "captures": { 559 "1": { 560 "name": "punctuation.definition.variable.batchfile" 561 } 562 }, 563 "name": "variable.parameter.repeat.batchfile" 564 } 565 ] 566 }, 567 "strings": { 568 "patterns": [ 569 { 570 "begin": "\"", 571 "beginCaptures": { 572 "0": { 573 "name": "punctuation.definition.string.begin.batchfile" 574 } 575 }, 576 "end": "(\")|(\\n)", 577 "endCaptures": { 578 "1": { 579 "name": "punctuation.definition.string.end.batchfile" 580 }, 581 "2": { 582 "name": "invalid.illegal.newline.batchfile" 583 } 584 }, 585 "name": "string.quoted.double.batchfile", 586 "patterns": [ 587 { 588 "match": "%%", 589 "name": "constant.character.escape.batchfile" 590 }, 591 { 592 "include": "#variables" 593 } 594 ] 595 } 596 ] 597 }, 598 "variables": { 599 "patterns": [ 600 { 601 "match": "(%)(?:(?i:~[fdpnxsatz]*(?:\\$PATH:)?)?\\d|\\*)", 602 "captures": { 603 "1": { 604 "name": "punctuation.definition.variable.batchfile" 605 } 606 }, 607 "name": "variable.parameter.batchfile" 608 }, 609 { 610 "include": "#variable" 611 }, 612 { 613 "include": "#variable_delayed_expansion" 614 } 615 ] 616 }, 617 "variable": { 618 "patterns": [ 619 { 620 "begin": "%(?=[^%]+%)", 621 "beginCaptures": { 622 "0": { 623 "name": "punctuation.definition.variable.begin.batchfile" 624 } 625 }, 626 "end": "(%)|\\n", 627 "endCaptures": { 628 "1": { 629 "name": "punctuation.definition.variable.end.batchfile" 630 } 631 }, 632 "name": "variable.other.readwrite.batchfile", 633 "patterns": [ 634 { 635 "begin": ":~", 636 "beginCaptures": { 637 "0": { 638 "name": "punctuation.separator.batchfile" 639 } 640 }, 641 "end": "(?=%|\\n)", 642 "name": "meta.variable.substring.batchfile", 643 "patterns": [ 644 { 645 "include": "#variable_substring" 646 } 647 ] 648 }, 649 { 650 "begin": ":", 651 "beginCaptures": { 652 "0": { 653 "name": "punctuation.separator.batchfile" 654 } 655 }, 656 "end": "(?=%|\\n)", 657 "name": "meta.variable.substitution.batchfile", 658 "patterns": [ 659 { 660 "include": "#variable_replace" 661 }, 662 { 663 "begin": "=", 664 "beginCaptures": { 665 "0": { 666 "name": "punctuation.separator.batchfile" 667 } 668 }, 669 "end": "(?=%|\\n)", 670 "patterns": [ 671 { 672 "include": "#variable_delayed_expansion" 673 }, 674 { 675 "match": "[^%]+", 676 "name": "string.unquoted.batchfile" 677 } 678 ] 679 } 680 ] 681 } 682 ] 683 } 684 ] 685 }, 686 "variable_delayed_expansion": { 687 "patterns": [ 688 { 689 "begin": "!(?=[^!]+!)", 690 "beginCaptures": { 691 "0": { 692 "name": "punctuation.definition.variable.begin.batchfile" 693 } 694 }, 695 "end": "(!)|\\n", 696 "endCaptures": { 697 "1": { 698 "name": "punctuation.definition.variable.end.batchfile" 699 } 700 }, 701 "name": "variable.other.readwrite.batchfile", 702 "patterns": [ 703 { 704 "begin": ":~", 705 "beginCaptures": { 706 "0": { 707 "name": "punctuation.separator.batchfile" 708 } 709 }, 710 "end": "(?=!|\\n)", 711 "name": "meta.variable.substring.batchfile", 712 "patterns": [ 713 { 714 "include": "#variable_substring" 715 } 716 ] 717 }, 718 { 719 "begin": ":", 720 "beginCaptures": { 721 "0": { 722 "name": "punctuation.separator.batchfile" 723 } 724 }, 725 "end": "(?=!|\\n)", 726 "name": "meta.variable.substitution.batchfile", 727 "patterns": [ 728 { 729 "include": "#escaped_characters" 730 }, 731 { 732 "include": "#variable_replace" 733 }, 734 { 735 "include": "#variable" 736 }, 737 { 738 "begin": "=", 739 "beginCaptures": { 740 "0": { 741 "name": "punctuation.separator.batchfile" 742 } 743 }, 744 "end": "(?=!|\\n)", 745 "patterns": [ 746 { 747 "include": "#variable" 748 }, 749 { 750 "match": "[^!]+", 751 "name": "string.unquoted.batchfile" 752 } 753 ] 754 } 755 ] 756 } 757 ] 758 } 759 ] 760 }, 761 "variable_replace": { 762 "patterns": [ 763 { 764 "match": "[^=%!\\n]+", 765 "name": "string.unquoted.batchfile" 766 } 767 ] 768 }, 769 "variable_substring": { 770 "patterns": [ 771 { 772 "match": "([+-]?\\d+)(?:(,)([+-]?\\d+))?", 773 "captures": { 774 "1": { 775 "name": "constant.numeric.batchfile" 776 }, 777 "2": { 778 "name": "punctuation.separator.batchfile" 779 }, 780 "3": { 781 "name": "constant.numeric.batchfile" 782 } 783 } 784 } 785 ] 786 } 787 } 788}