--- name: Shell Script (Bash) fileTypes: - sh - ss - bashrc - bash_profile - bash_login - profile - bash_logout firstLineMatch: ^#!.*(bash|zsh|sh|tcsh) scopeName: source.shell repository: interpolation: patterns: - name: string.interpolated.backtick.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: ` beginCaptures: "0": name: punctuation.definition.string.begin.shell end: ` patterns: - name: constant.character.escape.shell match: \\[`\\$] - name: string.interpolated.dollar.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: \$\( beginCaptures: "0": name: punctuation.definition.string.begin.shell end: \) patterns: - include: $self variable: patterns: - name: variable.other.special.shell captures: "1": name: punctuation.definition.variable.shell match: (\$)[-*@#?$!0_] - name: variable.other.positional.shell captures: "1": name: punctuation.definition.variable.shell match: (\$)[1-9] - name: variable.other.normal.shell captures: "1": name: punctuation.definition.variable.shell match: (\$)[a-zA-Z_][a-zA-Z0-9_]* - name: variable.other.bracket.shell captures: "0": name: punctuation.definition.variable.shell begin: \$\{ end: \} uuid: DDEEA3ED-6B1C-11D9-8B10-000D93589AF6 foldingStartMarker: \{ patterns: - name: support.function.shell match: \b(time)\b - name: keyword.operator.list.shell match: ;|&&|&|\|\| - name: keyword.operator.pipe.shell match: "[|!]" - name: meta.scope.logical-expression.shell captures: "1": name: punctuation.definition.logical-expression.shell begin: (\[{2}) end: (\]{2}) patterns: - name: keyword.operator.logical.shell match: ==|!=|&&|!|\|\| comment: do we want a special rule for ( expr )? - include: $self - name: meta.scope.expression.shell captures: "1": name: punctuation.definition.expression.shell begin: (\({2}) end: (\){2}) patterns: - include: $self - name: meta.scope.subshell.shell captures: "1": name: punctuation.definition.subshell.shell begin: (\() end: (\)) patterns: - include: $self - name: meta.scope.group.shell captures: "1": name: punctuation.definition.group.shell begin: (?<=\s|^)(\{)(?=\s|$) end: (?<=^|;)\s*(\}) patterns: - include: $self - name: constant.character.escape.shell match: \\. - name: string.quoted.single.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: "'" beginCaptures: "0": name: punctuation.definition.string.begin.shell end: "'" - name: string.quoted.double.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: \$?" beginCaptures: "0": name: punctuation.definition.string.begin.shell end: "\"" patterns: - name: constant.character.escape.shell match: \\[\$`"\\\n] - include: "#variable" - include: "#interpolation" - name: string.quoted.single.dollar.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: \$' beginCaptures: "0": name: punctuation.definition.string.begin.shell end: "'" patterns: - name: constant.character.escape.ansi-c.shell match: \\(a|b|e|f|n|r|t|v|\\|') - name: constant.character.escape.octal.shell match: \\[0-9]{3} - name: constant.character.escape.hex.shell match: \\x[0-9a-fA-F]{2} - name: constant.character.escape.control-char.shell match: \\c. - name: keyword.operator.tilde.shell match: (?<=\s|:|=|^)~ - include: "#variable" - include: "#interpolation" - name: string.other.math.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: \$\({2} beginCaptures: "0": name: punctuation.definition.string.begin.shell end: \){2} - name: string.interpolated.process-substitution.shell endCaptures: "0": name: punctuation.definition.string.end.shell begin: "[><]\\(" beginCaptures: "0": name: punctuation.definition.string.begin.shell end: \) - name: string.unquoted.heredoc.no-indent.ruby.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)-("|'|)(RUBY)\2 contentName: source.ruby.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^\t*(RUBY)$ patterns: - include: source.ruby - name: string.unquoted.heredoc.ruby.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)("|'|)(RUBY)\2 contentName: source.ruby.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^(RUBY)$ patterns: - include: source.ruby - name: string.unquoted.heredoc.no-indent.applescript.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)-("|'|)(APPLESCRIPT)\2 contentName: source.applescript.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^\t*(APPLESCRIPT)$ patterns: - include: source.applescript - name: string.unquoted.heredoc.applescript.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)("|'|)(APPLESCRIPT)\2 contentName: source.applescript.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^(APPLESCRIPT)$ patterns: - include: source.applescript - name: string.unquoted.heredoc.no-indent.html.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)-("|'|)(HTML)\2 contentName: text.html.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^\t*(HTML)$ patterns: - include: text.html.basic - name: string.unquoted.heredoc.html.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)("|'|)(HTML)\2 contentName: text.html.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^(HTML)$ patterns: - include: text.html.basic - name: string.unquoted.heredoc.no-indent.markdown.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)-("|'|)(MARKDOWN)\2 contentName: text.html.markdown.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^\t*(MARKDOWN)$ patterns: - include: text.html.markdown - name: string.unquoted.heredoc.markdown.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)("|'|)(MARKDOWN)\2 contentName: text.html.markdown.embedded.shell beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^(MARKDOWN)$ patterns: - include: text.html.markdown - name: string.unquoted.heredoc.no-indent.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)-("|'|)\\?(\w+)\2 beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^\t*(\3)$ - name: string.unquoted.heredoc.shell endCaptures: "1": name: keyword.control.heredoc-token.shell captures: "0": name: punctuation.definition.string.shell begin: (<<)("|'|)\\?(\w+)\2 beginCaptures: "1": name: keyword.operator.heredoc.shell "3": name: keyword.control.heredoc-token.shell end: ^(\3)$ - name: meta.herestring.shell captures: "1": name: keyword.operator.herestring.shell "2": name: string.quoted.single.herestring.shell "3": name: punctuation.definition.string.begin.shell "4": name: punctuation.definition.string.end.shell match: (<<<)((')[^']*(')) - name: meta.herestring.shell captures: "6": name: punctuation.definition.string.end.shell "1": name: keyword.operator.herestring.shell "2": name: string.quoted.double.herestring.shell "3": name: punctuation.definition.string.begin.shell match: (<<<)((")(\\("|\\)|[^"])*(")) - name: meta.herestring.shell captures: "1": name: keyword.operator.herestring.shell "2": name: string.unquoted.herestring.shell match: (<<<)(([^\s\\]|\\.)+) - name: keyword.operator.redirect.shell match: "&>|\\d*>&\\d*|\\d*(>>|>|<)|\\d*<&|\\d*<>" comment: "valid: &>word >&word >word [n]>&[n] [n]word [n]>>word [n]<&word (last one is duplicate)" - name: comment.line.number-sign.shell captures: "1": name: punctuation.definition.comment.shell match: (?