Files
vscode/extensions/shellscript/syntaxes/shell-unix-bash.tmLanguage.json
2022-12-14 12:52:31 +01:00

1993 lines
45 KiB
JSON

{
"information_for_contributors": [
"This file has been converted from https://github.com/jeff-hykin/better-shell-syntax/blob/master/autogenerated/shell.tmLanguage.json",
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
"Once accepted there, we are happy to receive an update request."
],
"version": "https://github.com/jeff-hykin/better-shell-syntax/commit/b05618771b35b4baa25661dff91170b4924fdac8",
"name": "Shell Script",
"scopeName": "source.shell",
"patterns": [
{
"include": "#initial_context"
}
],
"repository": {
"alias_statement": {
"begin": "(alias)(?:\\s)+\\s*+((?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w))(?:(\\[)((?:(?:(?:\\$)?(?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w)|@)|\\*))(\\]))?(?:(?:(\\=)|(\\+\\=))|(\\-\\=))",
"end": "(?:(?:(?:(?:(?:(;)|(&&))|(\\|\\|))|(&))|\\n)|(?= |$))",
"beginCaptures": {
"1": {
"name": "storage.type.alias.shell"
},
"2": {
"name": "variable.other.assignment.shell"
},
"3": {
"name": "punctuation.definition.array.access.shell"
},
"4": {
"name": "variable.other.assignment.shell"
},
"5": {
"name": "punctuation.definition.array.access.shell"
},
"6": {
"name": "keyword.operator.assignment.shell"
},
"7": {
"name": "keyword.operator.assignment.compound.shell"
},
"8": {
"name": "keyword.operator.assignment.compound.shell"
}
},
"endCaptures": {
"1": {
"name": "punctuation.terminator.statement.semicolon.shell"
},
"2": {
"name": "punctuation.separator.statement.and.shell"
},
"3": {
"name": "punctuation.separator.statement.or.shell"
},
"4": {
"name": "punctuation.separator.statement.background.shell"
}
},
"name": "meta.expression.assignment.shell",
"patterns": [
{
"include": "#statement_context"
}
]
},
"argument": {
"begin": "\\s++(?!(?:%|&|\\||\\(|\\[|#|\\n|$|;))",
"end": "(?=\\s|;|\\||&|$|\\n|\\)|\\`)",
"beginCaptures": {},
"endCaptures": {},
"name": "meta.argument.shell",
"patterns": [
{
"include": "#argument_context"
},
{
"include": "#line_continuation"
}
]
},
"argument_context": {
"patterns": [
{
"match": "[^ \n'&;<>\\(\\)\\$`\\\\\"\\|]+(?!>)",
"captures": {
"0": {
"patterns": [
{
"match": "\\*",
"name": "variable.language.special.wildcard.shell"
},
{
"include": "#variable"
},
{
"include": "#numeric_literal"
},
{
"match": "(?<!\\w)(\\b(?:true|false)\\b)(?!\\w)",
"captures": {
"1": {
"name": "constant.language.$1.shell"
}
}
}
]
}
},
"name": "string.unquoted.argument.shell"
},
{
"include": "#statement_context"
}
]
},
"assignment": {
"begin": "\\s*+((?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w))(?:(\\[)((?:(?:(?:\\$)?(?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w)|@)|\\*))(\\]))?(?:(?:(\\=)|(\\+\\=))|(\\-\\=))",
"end": "(?:(?:(?:(?:(?:(;)|(&&))|(\\|\\|))|(&))|\\n)|(?= |$))",
"beginCaptures": {
"1": {
"name": "variable.other.assignment.shell"
},
"2": {
"name": "punctuation.definition.array.access.shell"
},
"3": {
"name": "variable.other.assignment.shell"
},
"4": {
"name": "punctuation.definition.array.access.shell"
},
"5": {
"name": "keyword.operator.assignment.shell"
},
"6": {
"name": "keyword.operator.assignment.compound.shell"
},
"7": {
"name": "keyword.operator.assignment.compound.shell"
}
},
"endCaptures": {
"1": {
"name": "punctuation.terminator.statement.semicolon.shell"
},
"2": {
"name": "punctuation.separator.statement.and.shell"
},
"3": {
"name": "punctuation.separator.statement.or.shell"
},
"4": {
"name": "punctuation.separator.statement.background.shell"
}
},
"name": "meta.expression.assignment.shell",
"patterns": [
{
"include": "#argument_context"
}
]
},
"block_comment": {
"begin": "\\s*+(\\/\\*)",
"end": "\\*\\/",
"beginCaptures": {
"1": {
"name": "punctuation.definition.comment.begin.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.comment.end.shell"
}
},
"name": "comment.block.shell"
},
"boolean": {
"match": "\\b(?:true|false)\\b",
"name": "constant.language.$0.shell"
},
"case-clause": {
"patterns": [
{
"begin": "(?=\\S)",
"end": ";;",
"endCaptures": {
"0": {
"name": "punctuation.terminator.case-clause.shell"
}
},
"name": "meta.scope.case-clause.shell",
"patterns": [
{
"begin": "\\(|(?=\\S)",
"beginCaptures": {
"0": {
"name": "punctuation.definition.case-pattern.shell"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.case-pattern.shell"
}
},
"name": "meta.scope.case-pattern.shell",
"patterns": [
{
"match": "\\|",
"name": "punctuation.separator.pipe-sign.shell"
},
{
"include": "#string"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#pathname"
}
]
},
{
"begin": "(?<=\\))",
"end": "(?=;;)",
"name": "meta.scope.case-clause-body.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
}
]
},
"command_call": {
"begin": "(?!^ *+$)(?<=(?:^|;|\\||&|!|\\(|\\{|\\`))\\s*+(?!nocorrect\\W|nocorrect\\$|readonly\\W|readonly\\$|function\\W|function\\$|foreach\\W|foreach\\$|coproc\\W|coproc\\$|logout\\W|logout\\$|export\\W|export\\$|select\\W|select\\$|repeat\\W|repeat\\$|pushd\\W|pushd\\$|until\\W|until\\$|while\\W|while\\$|local\\W|local\\$|case\\W|case\\$|done\\W|done\\$|elif\\W|elif\\$|else\\W|else\\$|esac\\W|esac\\$|popd\\W|popd\\$|then\\W|then\\$|time\\W|time\\$|for\\W|for\\$|end\\W|end\\$|fi\\W|fi\\$|do\\W|do\\$|in\\W|in\\$|if\\W|if\\$)",
"end": "(?=;|\\||&|\\n|\\)|\\`|\\{|\\}|#|\\])(?<!\\\\)",
"beginCaptures": {},
"endCaptures": {},
"name": "meta.statement.shell",
"patterns": [
{
"begin": "\\s*+(?!(?:!|%|&|\\||\\(|\\)|\\{|\\[|<|>|#|\\n|$|;|\\s))(.+?)(?:(?=\\s)|(?=;|\\||&|\\n|\\)|\\`|\\{|\\}|#|\\])(?<!\\\\))",
"end": "(?=;|\\||&|\\n|\\)|\\`|\\{|\\}|#|\\])(?<!\\\\)",
"beginCaptures": {
"0": {
"name": "meta.command_name.shell"
},
"1": {
"name": "entity.name.command.shell",
"patterns": [
{
"match": "(?<!\\w)(?:return|break)(?!\\w)",
"name": "keyword.control.$0.shell"
},
{
"match": "(?<!\\w)(?:unfunction|unsetopt|autoload|unlimit|bindkey|builtin|command|getopts|history|declare|unalias|typeset|suspend|return|source|ulimit|unhash|disown|which|alias|break|false|print|shift|times|umask|umask|unset|read|type|exec|eval|wait|echo|dirs|hash|jobs|kill|stat|exit|test|trap|true|pwd|let|set|cd|fg|bg|fc|:|\\.)(?!\\w)",
"name": "support.function.builtin.shell"
},
{
"include": "#variable"
}
]
}
},
"endCaptures": {},
"name": "meta.command.shell",
"patterns": [
{
"include": "#line_continuation"
},
{
"include": "#option"
},
{
"include": "#argument"
},
{
"include": "#statement_context"
}
]
},
{
"include": "#line_continuation"
},
{
"include": "#statement_context"
}
]
},
"command_name": {
"match": "\\s*+(?!(?:!|%|&|\\||\\(|\\)|\\{|\\[|<|>|#|\\n|$|;|\\s))(.+?)(?:(?=\\s)|(?=;|\\||&|\\n|\\)|\\`|\\{|\\}|#|\\])(?<!\\\\))",
"captures": {
"1": {
"name": "entity.name.command.shell",
"patterns": [
{
"match": "(?<!\\w)(?:return|break)(?!\\w)",
"name": "keyword.control.$0.shell"
},
{
"match": "(?<!\\w)(?:unfunction|unsetopt|autoload|unlimit|bindkey|builtin|command|getopts|history|declare|unalias|typeset|suspend|return|source|ulimit|unhash|disown|which|alias|break|false|print|shift|times|umask|umask|unset|read|type|exec|eval|wait|echo|dirs|hash|jobs|kill|stat|exit|test|trap|true|pwd|let|set|cd|fg|bg|fc|:|\\.)(?!\\w)",
"name": "support.function.builtin.shell"
},
{
"include": "#variable"
}
]
}
},
"name": "meta.command_name.shell"
},
"comment": {
"match": "(?<=^|\\s)(?:((#!).*)|((#).*))",
"captures": {
"1": {
"name": "comment.line.number-sign.shell meta.shebang.shell"
},
"2": {
"name": "punctuation.definition.comment.shebang.shell"
},
"3": {
"name": "comment.line.number-sign.shell"
},
"4": {
"name": "punctuation.definition.comment.shell"
}
}
},
"comments": {
"patterns": [
{
"include": "#block_comment"
},
{
"include": "#line_comment"
}
]
},
"compound-command": {
"patterns": [
{
"begin": "\\[{1,2}",
"beginCaptures": {
"0": {
"name": "punctuation.definition.logical-expression.shell"
}
},
"end": "\\]{1,2}",
"endCaptures": {
"0": {
"name": "punctuation.definition.logical-expression.shell"
}
},
"name": "meta.scope.logical-expression.shell",
"patterns": [
{
"include": "#logical-expression"
},
{
"include": "#initial_context"
}
]
},
{
"begin": "\\({2}",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "\\){2}",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "string.other.math.shell",
"patterns": [
{
"include": "#math"
}
]
},
{
"begin": "\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.subshell.shell"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.subshell.shell"
}
},
"name": "meta.scope.subshell.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "(?<=\\s|^){(?=\\s|$)",
"beginCaptures": {
"0": {
"name": "punctuation.definition.group.shell"
}
},
"end": "(?<=^|;)\\s*(})",
"endCaptures": {
"1": {
"name": "punctuation.definition.group.shell"
}
},
"name": "meta.scope.group.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
},
"custom_command_names": {
"patterns": []
},
"custom_commands": {
"patterns": []
},
"double_quote_escape_char": {
"match": "\\\\[\\$`\"\\\\\\n]",
"name": "constant.character.escape.shell"
},
"function-definition": {
"patterns": [
{
"begin": "(?:^\\s*|(?<=^|;|&|\\s))(function)\\s+([^\\s\\\\]+)(?:\\s*(\\(\\)))?",
"beginCaptures": {
"1": {
"name": "storage.type.function.shell"
},
"2": {
"name": "entity.name.function.shell"
},
"3": {
"name": "punctuation.definition.arguments.shell"
}
},
"end": ";|&|$",
"endCaptures": {
"0": {
"name": "punctuation.definition.function.shell"
}
},
"name": "meta.function.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "(?:^\\s*|(?<=^|;|&|\\s))([^\\s\\\\=]+)\\s*(\\(\\))",
"beginCaptures": {
"1": {
"name": "entity.name.function.shell"
},
"2": {
"name": "punctuation.definition.arguments.shell"
}
},
"end": ";|&|$",
"endCaptures": {
"0": {
"name": "punctuation.definition.function.shell"
}
},
"name": "meta.function.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
},
"heredoc": {
"patterns": [
{
"begin": "(<<-)\\s*+(\"|')\\s*+((?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w))(?=\\s|;|&|<|\"|')\\2",
"end": "^\\t*\\3(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.operator.heredoc.shell"
},
"2": {},
"3": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"name": "string.quoted.heredoc.indent.shell",
"patterns": []
},
{
"begin": "(<<)\\s*+(\"|')\\s*+((?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w))(?=\\s|;|&|<|\"|')\\2",
"end": "^\\3(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.operator.heredoc.shell"
},
"2": {},
"3": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"name": "string.quoted.heredoc.no-indent.shell",
"patterns": []
},
{
"begin": "(<<-)\\s*+((?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w))(?=\\s|;|&|<|\"|')",
"end": "^\\t*\\2(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.operator.heredoc.shell"
},
"2": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"name": "string.unquoted.heredoc.indent.shell",
"patterns": [
{
"include": "#double_quote_escape_char"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
}
]
},
{
"begin": "(<<)\\s*+((?<!\\w)[a-zA-Z_][a-zA-Z_0-9]*(?!\\w))(?=\\s|;|&|<|\"|')",
"end": "^\\2(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.operator.heredoc.shell"
},
"2": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.string.heredoc.shell"
}
},
"name": "string.unquoted.heredoc.no-indent.shell",
"patterns": [
{
"include": "#double_quote_escape_char"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
}
]
}
]
},
"herestring": {
"patterns": [
{
"begin": "(<<<)\\s*(('))",
"beginCaptures": {
"1": {
"name": "keyword.operator.herestring.shell"
},
"2": {
"name": "string.quoted.single.shell"
},
"3": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "(')",
"endCaptures": {
"0": {
"name": "string.quoted.single.shell"
},
"1": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "meta.herestring.shell",
"contentName": "string.quoted.single.shell"
},
{
"begin": "(<<<)\\s*((\"))",
"beginCaptures": {
"1": {
"name": "keyword.operator.herestring.shell"
},
"2": {
"name": "string.quoted.double.shell"
},
"3": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "(\")",
"endCaptures": {
"0": {
"name": "string.quoted.double.shell"
},
"1": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "meta.herestring.shell",
"contentName": "string.quoted.double.shell"
},
{
"captures": {
"1": {
"name": "keyword.operator.herestring.shell"
},
"2": {
"name": "string.unquoted.herestring.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
},
"match": "(<<<)\\s*(([^\\s)\\\\]|\\\\.)+)",
"name": "meta.herestring.shell"
}
]
},
"initial_context": {
"patterns": [
{
"include": "#comment"
},
{
"include": "#boolean"
},
{
"include": "#numeric_literal"
},
{
"include": "#pipeline"
},
{
"include": "#statement_seperator"
},
{
"include": "#logical_expression_double"
},
{
"include": "#logical_expression_single"
},
{
"include": "#misc_ranges"
},
{
"include": "#loop"
},
{
"include": "#string"
},
{
"include": "#function-definition"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#heredoc"
},
{
"include": "#herestring"
},
{
"include": "#redirection"
},
{
"include": "#pathname"
},
{
"include": "#keyword"
},
{
"include": "#alias_statement"
},
{
"include": "#assignment"
},
{
"include": "#command_call"
},
{
"include": "#support"
}
]
},
"inline_comment": {
"match": "(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/))",
"captures": {
"1": {
"name": "comment.block.shell punctuation.definition.comment.begin.shell"
},
"2": {
"name": "comment.block.shell"
},
"3": {
"patterns": [
{
"match": "\\*\\/",
"name": "comment.block.shell punctuation.definition.comment.end.shell"
},
{
"match": "\\*",
"name": "comment.block.shell"
}
]
}
}
},
"interpolation": {
"patterns": [
{
"begin": "\\$\\({2}",
"beginCaptures": {
"0": {
"name": "punctuation.definition.evaluation.arithmetic.begin.shell"
}
},
"end": "\\)\\s*\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.evaluation.arithmetic.end.shell"
}
},
"name": "string.other.math.shell",
"patterns": [
{
"include": "#math"
}
]
},
{
"begin": "`",
"beginCaptures": {
"0": {
"name": "punctuation.definition.evaluation.backticks.shell"
}
},
"end": "`",
"endCaptures": {
"0": {
"name": "punctuation.definition.evaluation.backticks.shell"
}
},
"name": "string.interpolated.backtick.shell",
"patterns": [
{
"match": "\\\\[`\\\\$]",
"name": "constant.character.escape.shell"
},
{
"begin": "(?<=\\W)(?=#)(?!#{)",
"beginCaptures": {
"1": {
"name": "punctuation.whitespace.comment.leading.shell"
}
},
"end": "(?!\\G)",
"patterns": [
{
"begin": "#",
"beginCaptures": {
"0": {
"name": "punctuation.definition.comment.shell"
}
},
"end": "(?=`)",
"name": "comment.line.number-sign.shell"
}
]
},
{
"include": "#initial_context"
}
]
},
{
"begin": "\\$\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.evaluation.parens.begin.shell"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.evaluation.parens.end.shell"
}
},
"name": "string.interpolated.dollar.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
},
"keyword": {
"patterns": [
{
"match": "(?<=^|;|&|\\s)(?:then|else|elif|fi|for|in|do|done|select|case|continue|esac|while|until|return)(?=\\s|;|&|$)",
"name": "keyword.control.$0.shell"
},
{
"match": "(?<=^|;|&|\\s)(?:export|declare|typeset|local|readonly)(?=\\s|;|&|$)",
"name": "storage.modifier.$0.shell"
}
]
},
"line_comment": {
"begin": "\\s*+(\\/\\/)",
"end": "(?<=\\n)(?<!\\\\\\n)",
"beginCaptures": {
"1": {
"name": "punctuation.definition.comment.shell"
}
},
"endCaptures": {},
"name": "comment.line.double-slash.shell",
"patterns": [
{
"include": "#line_continuation_character"
}
]
},
"line_continuation": {
"match": "\\\\(?=\\n)",
"name": "constant.character.escape.line-continuation.shell"
},
"logical-expression": {
"patterns": [
{
"comment": "do we want a special rule for ( expr )?",
"match": "=[=~]?|!=?|<|>|&&|\\|\\|",
"name": "keyword.operator.logical.shell"
},
{
"match": "(?<!\\S)-(nt|ot|ef|eq|ne|l[te]|g[te]|[a-hknoprstuwxzOGLSN])\\b",
"name": "keyword.operator.logical.shell"
}
]
},
"logical_expression_context": {
"patterns": [
{
"include": "#regex_comparison"
},
{
"include": "#logical-expression"
},
{
"include": "#logical_expression_single"
},
{
"include": "#logical_expression_double"
},
{
"include": "#comment"
},
{
"include": "#boolean"
},
{
"include": "#numeric_literal"
},
{
"include": "#pipeline"
},
{
"include": "#statement_seperator"
},
{
"include": "#string"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#heredoc"
},
{
"include": "#herestring"
},
{
"include": "#pathname"
},
{
"include": "#keyword"
},
{
"include": "#support"
}
]
},
"logical_expression_double": {
"begin": "\\[\\[",
"end": "\\]\\]",
"beginCaptures": {
"0": {
"name": "punctuation.definition.logical-expression.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.logical-expression.shell"
}
},
"name": "meta.scope.logical-expression.shell",
"patterns": [
{
"include": "#regex_comparison"
},
{
"include": "#logical-expression"
},
{
"include": "#logical_expression_single"
},
{
"include": "#logical_expression_double"
},
{
"include": "#comment"
},
{
"include": "#boolean"
},
{
"include": "#numeric_literal"
},
{
"include": "#pipeline"
},
{
"include": "#statement_seperator"
},
{
"include": "#string"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#heredoc"
},
{
"include": "#herestring"
},
{
"include": "#pathname"
},
{
"include": "#keyword"
},
{
"include": "#support"
}
]
},
"logical_expression_single": {
"begin": "\\[",
"end": "\\]",
"beginCaptures": {
"0": {
"name": "punctuation.definition.logical-expression.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.logical-expression.shell"
}
},
"name": "meta.scope.logical-expression.shell",
"patterns": [
{
"include": "#regex_comparison"
},
{
"include": "#logical-expression"
},
{
"include": "#logical_expression_single"
},
{
"include": "#logical_expression_double"
},
{
"include": "#comment"
},
{
"include": "#boolean"
},
{
"include": "#numeric_literal"
},
{
"include": "#pipeline"
},
{
"include": "#statement_seperator"
},
{
"include": "#string"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#heredoc"
},
{
"include": "#herestring"
},
{
"include": "#pathname"
},
{
"include": "#keyword"
},
{
"include": "#support"
}
]
},
"loop": {
"patterns": [
{
"begin": "(?<=^|;|&|\\s)(for)\\s+(?=\\({2})",
"beginCaptures": {
"1": {
"name": "keyword.control.shell"
}
},
"end": "(?<=^|;|&|\\s)done(?=\\s|;|&|$|\\))",
"endCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"name": "meta.scope.for-loop.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "(?<=^|;|&|\\s)(for)\\s+(.+?)\\s+(in)(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.control.shell"
},
"2": {
"name": "variable.other.loop.shell",
"patterns": [
{
"include": "#string"
}
]
},
"3": {
"name": "keyword.control.shell"
}
},
"end": "(?<=^|;|&|\\s)done(?=\\s|;|&|$|\\))",
"endCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"name": "meta.scope.for-in-loop.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "(?<=^|;|&|\\s)(while|until)(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.control.shell"
}
},
"end": "(?<=^|;|&|\\s)done(?=\\s|;|&|$|\\))",
"endCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"name": "meta.scope.while-loop.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "(?<=^|;|&|\\s)(select)\\s+((?:[^\\s\\\\]|\\\\.)+)(?=\\s|;|&|$)",
"beginCaptures": {
"1": {
"name": "keyword.control.shell"
},
"2": {
"name": "variable.other.loop.shell"
}
},
"end": "(?<=^|;|&|\\s)(done)(?=\\s|;|&|$|\\))",
"endCaptures": {
"1": {
"name": "keyword.control.shell"
}
},
"name": "meta.scope.select-block.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "(?<=^|;|&|\\s)case(?=\\s|;|&|$)",
"beginCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"end": "(?<=^|;|&|\\s)esac(?=\\s|;|&|$)",
"endCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"name": "meta.scope.case-block.shell",
"patterns": [
{
"begin": "(?<=^|;|&|\\s)in(?=\\s|;|&|$)",
"beginCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"end": "(?<=^|;|&|\\s)(?=esac(\\s|;|&|$))",
"name": "meta.scope.case-body.shell",
"patterns": [
{
"include": "#comment"
},
{
"include": "#case-clause"
}
]
},
{
"include": "#initial_context"
}
]
},
{
"begin": "(?<=^|;|&|\\s)if(?=\\s|;|&|$)",
"beginCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"end": "(?<=^|;|&|\\s)fi(?=\\s|;|&|$)",
"endCaptures": {
"0": {
"name": "keyword.control.shell"
}
},
"name": "meta.scope.if-block.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
},
"math": {
"patterns": [
{
"include": "#variable"
},
{
"match": "\\+{1,2}|-{1,2}|!|~|\\*{1,2}|/|%|<[<=]?|>[>=]?|==|!=|^|\\|{1,2}|&{1,2}|\\?|\\:|,|=|[*/%+\\-&^|]=|<<=|>>=",
"name": "keyword.operator.arithmetic.shell"
},
{
"match": "0[xX][0-9A-Fa-f]+",
"name": "constant.numeric.hex.shell"
},
{
"match": "0\\d+",
"name": "constant.numeric.octal.shell"
},
{
"match": "\\d{1,2}#[0-9a-zA-Z@_]+",
"name": "constant.numeric.other.shell"
},
{
"match": "\\d+",
"name": "constant.numeric.integer.shell"
}
]
},
"misc_ranges": {
"patterns": [
{
"include": "#logical_expression_single"
},
{
"include": "#logical_expression_double"
},
{
"begin": "\\(\\(",
"end": "\\)\\)",
"beginCaptures": {
"0": {
"name": "punctuation.section.arithmetic.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.section.arithmetic.shell"
}
},
"name": "meta.arithmetic.shell",
"patterns": [
{
"include": "#math"
}
]
},
{
"begin": "(?<!=)\\(",
"end": "\\)",
"beginCaptures": {
"0": {
"name": "punctuation.definition.subshell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.subshell"
}
},
"name": "meta.scope.subshell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"begin": "{",
"end": "}",
"beginCaptures": {
"0": {
"name": "punctuation.definition.group.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.definition.group.shell"
}
},
"name": "meta.scope.group.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
},
"numeric_literal": {
"match": "(?<!\\w)((?<!\\w)\\.?\\d(?:(?:[0-9a-zA-Z_\\.]|')|(?<=[eEpP])[+-])*)(?!\\w)",
"captures": {
"1": {
"patterns": [
{
"begin": "(?=.)",
"end": "$",
"beginCaptures": {},
"endCaptures": {},
"patterns": [
{
"match": "(\\G0[xX])([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?((?:(?<=[0-9a-fA-F])\\.|\\.(?=[0-9a-fA-F])))([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?(?:(?<!')([pP])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?([lLfF](?!\\w))?$",
"captures": {
"1": {
"name": "keyword.other.unit.hexadecimal.shell"
},
"2": {
"name": "constant.numeric.hexadecimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"3": {
"name": "punctuation.separator.constant.numeric.shell"
},
"4": {
"name": "constant.numeric.hexadecimal.shell"
},
"5": {
"name": "constant.numeric.hexadecimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"6": {
"name": "punctuation.separator.constant.numeric.shell"
},
"7": {
"name": "keyword.other.unit.exponent.hexadecimal.shell"
},
"8": {
"name": "keyword.operator.plus.exponent.hexadecimal.shell"
},
"9": {
"name": "keyword.operator.minus.exponent.hexadecimal.shell"
},
"10": {
"name": "constant.numeric.exponent.hexadecimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"11": {
"name": "keyword.other.unit.suffix.floating-point.shell"
}
}
},
{
"match": "\\G(?=[0-9.])(?!0[xXbB])([0-9](?:[0-9]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?((?:(?<=[0-9])\\.|\\.(?=[0-9])))([0-9](?:[0-9]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)?(?:(?<!')([eE])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?([lLfF](?!\\w))?$",
"captures": {
"1": {
"name": "constant.numeric.decimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"2": {
"name": "punctuation.separator.constant.numeric.shell"
},
"3": {
"name": "constant.numeric.decimal.point.shell"
},
"4": {
"name": "constant.numeric.decimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"5": {
"name": "punctuation.separator.constant.numeric.shell"
},
"6": {
"name": "keyword.other.unit.exponent.decimal.shell"
},
"7": {
"name": "keyword.operator.plus.exponent.decimal.shell"
},
"8": {
"name": "keyword.operator.minus.exponent.decimal.shell"
},
"9": {
"name": "constant.numeric.exponent.decimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"10": {
"name": "keyword.other.unit.suffix.floating-point.shell"
}
}
},
{
"match": "(\\G0[bB])([01](?:[01]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?$",
"captures": {
"1": {
"name": "keyword.other.unit.binary.shell"
},
"2": {
"name": "constant.numeric.binary.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"3": {
"name": "punctuation.separator.constant.numeric.shell"
},
"4": {
"name": "keyword.other.unit.suffix.integer.shell"
}
}
},
{
"match": "(\\G0)((?:[0-7]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))+)((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?$",
"captures": {
"1": {
"name": "keyword.other.unit.octal.shell"
},
"2": {
"name": "constant.numeric.octal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"3": {
"name": "punctuation.separator.constant.numeric.shell"
},
"4": {
"name": "keyword.other.unit.suffix.integer.shell"
}
}
},
{
"match": "(\\G0[xX])([0-9a-fA-F](?:[0-9a-fA-F]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)(?:(?<!')([pP])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?$",
"captures": {
"1": {
"name": "keyword.other.unit.hexadecimal.shell"
},
"2": {
"name": "constant.numeric.hexadecimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"3": {
"name": "punctuation.separator.constant.numeric.shell"
},
"4": {
"name": "keyword.other.unit.exponent.hexadecimal.shell"
},
"5": {
"name": "keyword.operator.plus.exponent.hexadecimal.shell"
},
"6": {
"name": "keyword.operator.minus.exponent.hexadecimal.shell"
},
"7": {
"name": "constant.numeric.exponent.hexadecimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"8": {
"name": "keyword.other.unit.suffix.integer.shell"
}
}
},
{
"match": "\\G(?=[0-9.])(?!0[xXbB])([0-9](?:[0-9]|((?<=[0-9a-fA-F])'(?=[0-9a-fA-F])))*)(?:(?<!')([eE])((?:\\+)?)((?:\\-)?)([0-9](?:[0-9]|(?<=[0-9a-fA-F])'(?=[0-9a-fA-F]))*))?((?:[uU]|(?:[uU]ll?)|(?:[uU]LL?)|(?:ll?[uU]?)|(?:LL?[uU]?)|[fF])(?!\\w))?$",
"captures": {
"1": {
"name": "constant.numeric.decimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"2": {
"name": "punctuation.separator.constant.numeric.shell"
},
"3": {
"name": "keyword.other.unit.exponent.decimal.shell"
},
"4": {
"name": "keyword.operator.plus.exponent.decimal.shell"
},
"5": {
"name": "keyword.operator.minus.exponent.decimal.shell"
},
"6": {
"name": "constant.numeric.exponent.decimal.shell",
"patterns": [
{
"match": "(?<=[0-9a-fA-F])'(?=[0-9a-fA-F])",
"name": "punctuation.separator.constant.numeric.shell"
}
]
},
"7": {
"name": "keyword.other.unit.suffix.integer.shell"
}
}
}
]
}
]
}
}
},
"option": {
"begin": "\\s++(-)((?!(?:!|%|&|\\||\\(|\\)|\\{|\\[|<|>|#|\\n|$|;|\\s)))",
"end": "(?:(?=\\s)|(?=;|\\||&|\\n|\\)|\\`|\\{|\\}|#|\\])(?<!\\\\))",
"beginCaptures": {
"1": {
"name": "string.unquoted.argument.shell constant.other.option.dash.shell"
},
"2": {
"name": "string.unquoted.argument.shell constant.other.option.shell"
}
},
"endCaptures": {},
"contentName": "string.unquoted.argument constant.other.option",
"patterns": [
{
"include": "#option_context"
}
]
},
"option_context": {
"patterns": [
{
"include": "#misc_ranges"
},
{
"include": "#string"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#heredoc"
},
{
"include": "#herestring"
},
{
"include": "#redirection"
},
{
"include": "#pathname"
},
{
"include": "#keyword"
},
{
"include": "#support"
}
]
},
"pathname": {
"patterns": [
{
"match": "(?<=\\s|:|=|^)~",
"name": "keyword.operator.tilde.shell"
},
{
"match": "\\*|\\?",
"name": "keyword.operator.glob.shell"
},
{
"begin": "([?*+@!])(\\()",
"beginCaptures": {
"1": {
"name": "keyword.operator.extglob.shell"
},
"2": {
"name": "punctuation.definition.extglob.shell"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.extglob.shell"
}
},
"name": "meta.structure.extglob.shell",
"patterns": [
{
"include": "#initial_context"
}
]
}
]
},
"pipeline": {
"patterns": [
{
"match": "(?<=^|;|&|\\s)(time)(?=\\s|;|&|$)",
"name": "keyword.other.shell"
},
{
"match": "[|!]",
"name": "keyword.operator.pipe.shell"
}
]
},
"redirection": {
"patterns": [
{
"begin": "[><]\\(",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "string.interpolated.process-substitution.shell",
"patterns": [
{
"include": "#initial_context"
}
]
},
{
"match": "(?<![<>])(&>|\\d*>&\\d*|\\d*(>>|>|<)|\\d*<&|\\d*<>)(?![<>])",
"name": "keyword.operator.redirect.shell"
}
]
},
"regex_comparison": {
"match": "\\=~",
"name": "keyword.operator.logical.regex.shell"
},
"regexp": {
"patterns": [
{
"match": ".+"
}
]
},
"simple_options": {
"match": "(?:\\s++\\-\\w+)*",
"captures": {
"0": {
"patterns": [
{
"match": "\\s++(\\-)(\\w+)",
"captures": {
"1": {
"name": "string.unquoted.argument.shell constant.other.option.dash.shell"
},
"2": {
"name": "string.unquoted.argument.shell constant.other.option.shell"
}
}
}
]
}
}
},
"statement_context": {
"patterns": [
{
"include": "#comment"
},
{
"include": "#pipeline"
},
{
"include": "#statement_seperator"
},
{
"include": "#misc_ranges"
},
{
"include": "#string"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
},
{
"include": "#heredoc"
},
{
"include": "#herestring"
},
{
"include": "#redirection"
},
{
"include": "#pathname"
},
{
"include": "#keyword"
},
{
"include": "#support"
}
]
},
"statement_seperator": {
"match": "(?:(?:(?:(?:(;)|(&&))|(\\|\\|))|(&))|\\n)",
"captures": {
"1": {
"name": "punctuation.terminator.statement.semicolon.shell"
},
"2": {
"name": "punctuation.separator.statement.and.shell"
},
"3": {
"name": "punctuation.separator.statement.or.shell"
},
"4": {
"name": "punctuation.separator.statement.background.shell"
}
}
},
"string": {
"patterns": [
{
"match": "\\\\.",
"name": "constant.character.escape.shell"
},
{
"begin": "'",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "'",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "string.quoted.single.shell"
},
{
"begin": " *\\$?\"",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "\"",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "string.quoted.double.shell",
"patterns": [
{
"match": "\\\\[\\$`\"\\\\\\n]",
"name": "constant.character.escape.shell"
},
{
"include": "#variable"
},
{
"include": "#interpolation"
}
]
},
{
"begin": "\\$'",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.shell"
}
},
"end": "'",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.shell"
}
},
"name": "string.quoted.single.dollar.shell",
"patterns": [
{
"match": "\\\\(a|b|e|f|n|r|t|v|\\\\|')",
"name": "constant.character.escape.ansi-c.shell"
},
{
"match": "\\\\[0-9]{3}",
"name": "constant.character.escape.octal.shell"
},
{
"match": "\\\\x[0-9a-fA-F]{2}",
"name": "constant.character.escape.hex.shell"
},
{
"match": "\\\\c.",
"name": "constant.character.escape.control-char.shell"
}
]
}
]
},
"variable": {
"patterns": [
{
"match": "(\\$)(\\@(?!\\w))",
"captures": {
"1": {
"name": "punctuation.definition.variable.shell variable.parameter.positional.all.shell"
},
"2": {
"name": "variable.parameter.positional.all.shell"
}
}
},
{
"match": "(\\$)([0-9](?!\\w))",
"captures": {
"1": {
"name": "punctuation.definition.variable.shell variable.parameter.positional.shell"
},
"2": {
"name": "variable.parameter.positional.shell"
}
}
},
{
"match": "(\\$)(\\{[0-9]+\\}(?!\\w))",
"captures": {
"1": {
"name": "punctuation.definition.variable.shell variable.parameter.positional.shell"
},
"2": {
"name": "variable.parameter.positional.shell"
}
}
},
{
"match": "(\\$)([-*#?$!0_](?!\\w))",
"captures": {
"1": {
"name": "punctuation.definition.variable.shell variable.language.special.shell"
},
"2": {
"name": "variable.language.special.shell"
}
}
},
{
"begin": "(\\$)(\\{)",
"end": "\\}",
"beginCaptures": {
"1": {
"name": "punctuation.definition.variable.shell punctuation.section.bracket.curly.variable.begin.shell"
},
"2": {
"name": "punctuation.section.bracket.curly.variable.begin.shell"
}
},
"endCaptures": {
"0": {
"name": "punctuation.section.bracket.curly.variable.end.shell"
}
},
"patterns": [
{
"match": "!|:[-=?]?|\\*|@|##|#|%%|%|\\/",
"name": "keyword.operator.expansion.shell"
},
{
"match": "(\\[)[^\\]]+(\\])",
"captures": {
"1": {
"name": "punctuation.section.array.shell"
},
"2": {
"name": "punctuation.section.array.shell"
}
}
},
{
"include": "#variable"
},
{
"include": "#string"
}
]
},
{
"match": "(\\$)(\\w+(?!\\w))",
"captures": {
"1": {
"name": "punctuation.definition.variable.shell variable.other.normal.shell"
},
"2": {
"name": "variable.other.normal.shell"
}
}
}
]
}
}
}