Created
June 1, 2016 23:53
-
-
Save fusion809/59cc66ea396c9148a9f8dc5431ea73fb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'scopeName': 'source.shell' | |
'name': 'Shell Script' | |
'fileTypes': [ | |
'sh' | |
'bash' | |
'ksh' | |
'zsh' | |
'zsh-theme' | |
'zshenv' | |
'zlogin' | |
'zlogout' | |
'zprofile' | |
'zshrc' | |
'bashrc' | |
'bash_profile' | |
'bash_login' | |
'profile' | |
'bash_logout' | |
'.textmate_init' | |
'npmrc' | |
'PKGBUILD' | |
'install' | |
'cygport' | |
'bats' | |
'ebuild' | |
] | |
'firstLineMatch': '^#!.*\\b(bash|zsh|sh|tcsh|ksh|dash|ash|csh|rc)|(?i:^\\s*#\\s*-\\*-[^*]*mode:\\s*shell-script[^*]*-\\*-)' | |
'patterns': [ | |
{ | |
'include': '#comment' | |
} | |
{ | |
'include': '#pipeline' | |
} | |
{ | |
'include': '#list' | |
} | |
{ | |
'include': '#compound-command' | |
} | |
{ | |
'include': '#loop' | |
} | |
{ | |
'include': '#function-definition' | |
} | |
{ | |
'include': '#string' | |
} | |
{ | |
'include': '#variable' | |
} | |
{ | |
'include': '#interpolation' | |
} | |
{ | |
'include': '#heredoc' | |
} | |
{ | |
'include': '#herestring' | |
} | |
{ | |
'include': '#redirection' | |
} | |
{ | |
'include': '#pathname' | |
} | |
{ | |
'include': '#keyword' | |
} | |
{ | |
'include': '#support' | |
} | |
] | |
'repository': | |
'case-clause': | |
'patterns': [ | |
{ | |
'begin': '(?=\\S)' | |
'end': ';;' | |
'endCaptures': | |
'0': | |
'name': 'punctuation.terminator.case-clause.shell' | |
'name': 'meta.scope.case-clause.shell' | |
'patterns': [ | |
{ | |
'begin': '(\\(|(?=\\S))' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.case-pattern.shell' | |
'end': '\\)' | |
'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': '$self' | |
} | |
] | |
} | |
] | |
} | |
] | |
'comment': | |
'begin': '(^\\s+)?(?<!\\S)(?=#)(?!#\\{)' | |
'beginCaptures': | |
'1': | |
'name': 'punctuation.whitespace.comment.leading.shell' | |
'end': '(?!\\G)' | |
'patterns': [ | |
{ | |
'begin': '#!' | |
'beginCaptures': | |
'0': | |
'name': 'punctuation.definition.comment.shebang.shell' | |
'end': '\\n' | |
'name': 'comment.line.number-sign.shebang.shell' | |
} | |
{ | |
'begin': '#' | |
'beginCaptures': | |
'0': | |
'name': 'punctuation.definition.comment.shell' | |
'end': '\\n' | |
'name': 'comment.line.number-sign.shell' | |
} | |
] | |
'compound-command': | |
'patterns': [ | |
{ | |
'begin': '(\\[{1,2})' | |
'captures': | |
'1': | |
'name': 'punctuation.definition.logical-expression.shell' | |
'end': '(\\]{1,2})' | |
'name': 'meta.scope.logical-expression.shell' | |
'patterns': [ | |
{ | |
'include': '#logical-expression' | |
} | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'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': '(\\()' | |
'captures': | |
'1': | |
'name': 'punctuation.definition.subshell.shell' | |
'end': '(\\))' | |
'name': 'meta.scope.subshell.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '(?<=\\s|^)(\\{)(?=\\s|$)' | |
'captures': | |
'1': | |
'name': 'punctuation.definition.group.shell' | |
'end': '(?<=^|;)\\s*(\\})' | |
'name': 'meta.scope.group.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
] | |
'function-definition': | |
'patterns': [ | |
{ | |
'begin': '\\b(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': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '\\b([^\\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': '$self' | |
} | |
] | |
} | |
] | |
'heredoc': | |
'patterns': [ | |
{ | |
'begin': '(<<)-("|\'|)(RUBY)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.ruby.embedded.shell' | |
'end': '^\\t*(RUBY)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.ruby.shell' | |
'patterns': [ | |
{ | |
'include': 'source.ruby' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(RUBY)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.ruby.embedded.shell' | |
'end': '^(RUBY)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.ruby.shell' | |
'patterns': [ | |
{ | |
'include': 'source.ruby' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)(PYTHON)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.python.embedded.shell' | |
'end': '^\\t*(PYTHON)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.python.shell' | |
'patterns': [ | |
{ | |
'include': 'source.python' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(PYTHON)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.python.embedded.shell' | |
'end': '^(PYTHON)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.python.shell' | |
'patterns': [ | |
{ | |
'include': 'source.python' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)(APPLESCRIPT)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.applescript.embedded.shell' | |
'end': '^\\t*(APPLESCRIPT)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.applescript.shell' | |
'patterns': [ | |
{ | |
'include': 'source.applescript' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(APPLESCRIPT)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.applescript.embedded.shell' | |
'end': '^(APPLESCRIPT)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.applescript.shell' | |
'patterns': [ | |
{ | |
'include': 'source.applescript' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)(HTML)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'text.html.embedded.shell' | |
'end': '^\\t*(HTML)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.html.shell' | |
'patterns': [ | |
{ | |
'include': 'text.html.basic' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(HTML)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'text.html.embedded.shell' | |
'end': '^(HTML)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.html.shell' | |
'patterns': [ | |
{ | |
'include': 'text.html.basic' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)(MARKDOWN)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'text.html.markdown.embedded.shell' | |
'end': '^\\t*(MARKDOWN)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.markdown.shell' | |
'patterns': [ | |
{ | |
'include': 'text.html.markdown' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(MARKDOWN)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'text.html.markdown.embedded.shell' | |
'end': '^(MARKDOWN)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.markdown.shell' | |
'patterns': [ | |
{ | |
'include': 'text.html.markdown' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)(TEXTILE)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'text.html.textile.embedded.shell' | |
'end': '^\\t*(TEXTILE)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.textile.shell' | |
'patterns': [ | |
{ | |
'include': 'text.html.textile' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(TEXTILE)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'text.html.textile.embedded.shell' | |
'end': '^(TEXTILE)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.textile.shell' | |
'patterns': [ | |
{ | |
'include': 'text.html.textile' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)(SHELL)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.shell.embedded.shell' | |
'end': '^\\t*(\\3)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.shell.shell' | |
'patterns': [ | |
{ | |
'include': 'source.shell' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)("|\'|)(SHELL)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'contentName': 'source.shell.embedded.shell' | |
'end': '^(\\3)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.shell.shell' | |
'patterns': [ | |
{ | |
'include': 'source.shell' | |
} | |
] | |
} | |
{ | |
'begin': '(<<)-("|\'|)\\\\?(\\w+)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'end': '^\\t*(\\3)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.no-indent.shell' | |
} | |
{ | |
'begin': '(<<)("|\'|)\\\\?(\\w+)\\2' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.operator.heredoc.shell' | |
'3': | |
'name': 'keyword.control.heredoc-token.shell' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.string.shell' | |
'end': '^(\\3)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.heredoc-token.shell' | |
'name': 'string.unquoted.heredoc.shell' | |
} | |
] | |
'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' | |
'match': '(<<<)(([^\\s\\\\]|\\\\.)+)' | |
'name': 'meta.herestring.shell' | |
} | |
] | |
'interpolation': | |
'patterns': [ | |
{ | |
'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.string.begin.shell' | |
'end': '`' | |
'endCaptures': | |
'0': | |
'name': 'punctuation.definition.string.end.shell' | |
'name': 'string.interpolated.backtick.shell' | |
'patterns': [ | |
{ | |
'match': '\\\\[`\\\\$]' | |
'name': 'constant.character.escape.shell' | |
} | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '\\$\\(' | |
'beginCaptures': | |
'0': | |
'name': 'punctuation.definition.string.begin.shell' | |
'end': '\\)' | |
'endCaptures': | |
'0': | |
'name': 'punctuation.definition.string.end.shell' | |
'name': 'string.interpolated.dollar.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
] | |
'keyword': | |
'patterns': [ | |
{ | |
'match': '(?<!-)\\b(then|else|elif|fi|for|in|do|done|select|case|continue|esac|while|until|return)\\b(?!-)' | |
'name': 'keyword.control.shell' | |
} | |
{ | |
'match': '(?<![-/])\\b(?:export|declare|typeset|local|readonly)\\b' | |
'name': 'storage.modifier.shell' | |
} | |
] | |
'list': | |
'patterns': [ | |
{ | |
'match': ';|&&|&|\\|\\|' | |
'name': 'keyword.operator.list.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])' | |
'name': 'keyword.operator.logical.shell' | |
} | |
] | |
'loop': | |
'patterns': [ | |
{ | |
'begin': '\\b(for)\\s+(?=\\({2})' | |
'captures': | |
'1': | |
'name': 'keyword.control.shell' | |
'end': '\\b(done)\\b' | |
'name': 'meta.scope.for-loop.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '\\b(for)\\b\\s+(.+)\\s+\\b(in)\\b' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.control.shell' | |
'2': | |
'name': 'variable.other.loop.shell' | |
'patterns': [ | |
{ | |
'include': '#string' | |
} | |
] | |
'3': | |
'name': 'keyword.control.shell' | |
'end': '(?<![-/])\\bdone\\b(?![-/])' | |
'endCaptures': | |
'0': | |
'name': 'keyword.control.shell' | |
'name': 'meta.scope.for-in-loop.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '\\b(while|until)\\b' | |
'captures': | |
'1': | |
'name': 'keyword.control.shell' | |
'end': '\\b(done)\\b' | |
'name': 'meta.scope.while-loop.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '\\b(select)\\s+((?:[^\\s\\\\]|\\\\.)+)\\b' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.control.shell' | |
'2': | |
'name': 'variable.other.loop.shell' | |
'end': '\\b(done)\\b' | |
'endCaptures': | |
'1': | |
'name': 'keyword.control.shell' | |
'name': 'meta.scope.select-block.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '(?<!-)\\b(case)\\b(?!-)' | |
'captures': | |
'1': | |
'name': 'keyword.control.shell' | |
'end': '\\b(esac)\\b' | |
'name': 'meta.scope.case-block.shell' | |
'patterns': [ | |
{ | |
'begin': '\\b(?:in)\\b' | |
'beginCaptures': | |
'1': | |
'name': 'keyword.control.shell' | |
'end': '(?=\\b(?:esac)\\b)' | |
'name': 'meta.scope.case-body.shell' | |
'patterns': [ | |
{ | |
'include': '#comment' | |
} | |
{ | |
'include': '#case-clause' | |
} | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
{ | |
'begin': '(?<!-)\\b(if)\\b(?!-|\\s*=)' | |
'captures': | |
'1': | |
'name': 'keyword.control.shell' | |
'end': '\\b(fi)\\b' | |
'name': 'meta.scope.if-block.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
] | |
'math': | |
'patterns': [ | |
{ | |
'include': '#variable' | |
} | |
{ | |
'match': '\\+{1,2}|-{1,2}|!|~|\\*{1,2}|/|%|<[<=]?|>[>=]?|==|!=|^|\\|{1,2}|&{1,2}|\\?|\\:|,|=|[*/%+\\-&^|]=|<<=|>>=' | |
'name': 'keyword.operator.arithmetic.shell' | |
} | |
{ | |
'match': '0[xX]\\h+' | |
'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' | |
} | |
] | |
'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': | |
'1': | |
'name': 'punctuation.definition.extglob.shell' | |
'name': 'meta.structure.extglob.shell' | |
'patterns': [ | |
{ | |
'include': '$self' | |
} | |
] | |
} | |
] | |
'pipeline': | |
'patterns': [ | |
{ | |
'match': '\\b(time)\\b' | |
'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': '$self' | |
} | |
] | |
} | |
{ | |
'comment': 'valid: &>word >&word >word [n]>&[n] [n]<word [n]>word [n]>>word [n]<&word (last one is duplicate)' | |
'match': '&>|\\d*>&\\d*|\\d*(>>|>|<)|\\d*<&|\\d*<>' | |
'name': 'keyword.operator.redirect.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' | |
} | |
] | |
} | |
] | |
'support': | |
'patterns': [ | |
{ | |
'match': '(?<=^|\\s)(?::|\\.)(?=\\s|;|&|$)' | |
'name': 'support.function.builtin.shell' | |
} | |
{ | |
'match': '(?<![-/./])\\b(?:alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|dirs|disown|echo|enable|eval|exec|exit|false|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|times|trap|true|type|ulimit|umask|unalias|unset|wait)\\b(?![-/=/])' | |
'name': 'support.function.builtin.shell' | |
} | |
{ | |
'match': '(?<![-/./])\\b(?:apm|apt|apt-get|apt-cache|apt-key|add-apt-repository|apt-add-repository|apt-config|apt-mark|bundle|dpkg|dpkg-architecture|dpkg-buildflags|dpkg-buildpackage|dpkg-checkbuilddeps|dpkg-deb|dpkg-distaddfile|dpkg-divert|dpkg-genchanges|dpkg-gencontrol|dpkg-gensymbols|dpkg-log-summary|dpkg-maintscript-helper|dpkg-mergechangelogs|dpkg-name|dpkg-parsechangelog|dpkg-query|dpkg-scanpackages|dpkg-scansources|dpkg-shlibdeps|dpkg-source|dpkg-split|dpkg-statoverride|dpkg-trigger|dpkg-vendor|dnf|ebuild|emerge|equo|gem|lein|makepkg|npm|pacman|pip|pip3|revdep-rebuild|rpmbuild|urpme|urpmi|yum|zypper)\\b(?![-/=/])' | |
'name': 'support.function.packages.shell' | |
} | |
{ | |
'match': '(?<![-/./])\\b(?:awk|ed|grep|nano|sed|sudo|vi|vim)\\b(?![-/=/])' | |
'name': 'support.function.extras.shell' | |
} | |
{ | |
'match': '(?<![-/./])\\b(?:base32|base64|basename|cat|chcon|chgrp|chmod|chown|chroot|cksum|comm|cp|csplit|cut|date|dd|df|dir|dircolors|dirname|du|echo|env|expand|expr|factor|false|fmt|fold|head|hostid|id|install|join|link|ln|logname|ls|md5sum|mkdir|mkfifo|mknod|mktemp|mv|nice|nl|nohup|nproc|numfmt|od|paste|pathchk|pinky|pr|printenv|printf|ptx|pwd|readlink|realpath|rm|rmdir|runcon|seq|sha1sum|sha224sum|sha256sum|sha384sum|sha512sum|shred|shuf|sleep|sort|split|stat|stdbuf|stty|sum|sync|tac|tail|tee|test|timeout|touch|tr|true|truncate|tsort|tty|uname|unexpand|uniq|unlink|users|vdir|wc|who|whoami|yes)\\b(?![-/=/])' | |
'name': 'support.function.coreutils.shell' | |
} | |
] | |
'variable': | |
'patterns': [ | |
{ | |
'captures': | |
'1': | |
'name': 'punctuation.definition.variable.shell' | |
'match': '(\\$)[a-zA-Z_][a-zA-Z0-9_]*' | |
'name': 'variable.other.normal.shell' | |
} | |
{ | |
'captures': | |
'1': | |
'name': 'punctuation.definition.variable.shell' | |
'match': '(\\$)[-*@#?$!0_]' | |
'name': 'variable.other.special.shell' | |
} | |
{ | |
'captures': | |
'1': | |
'name': 'punctuation.definition.variable.shell' | |
'match': '(\\$)[1-9]' | |
'name': 'variable.other.positional.shell' | |
} | |
{ | |
'begin': '\\$\\{' | |
'captures': | |
'0': | |
'name': 'punctuation.definition.variable.shell' | |
'end': '\\}' | |
'name': 'variable.other.bracket.shell' | |
'patterns': [ | |
{ | |
'match': '!|:[-=?]?|\\*|@|#{1,2}|%{1,2}|/' | |
'name': 'keyword.operator.expansion.shell' | |
} | |
{ | |
'captures': | |
'1': | |
'name': 'punctuation.section.array.shell' | |
'3': | |
'name': 'punctuation.section.array.shell' | |
'match': '(\\[)([^\\]]+)(\\])' | |
} | |
{ | |
'include': '#variable' | |
} | |
{ | |
'include': '#string' | |
} | |
] | |
} | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment