# Encoding: UTF-8 {fileTypes: ["sh", "ss", "bashrc", "bash_profile", "bash_login", "profile", "bash_logout", ".textmate_init"], firstLineMatch: "^#!.*\\b(bash|zsh|sh|tcsh)", foldingStartMarker: /\b(if|case)\b|(\{|\b(do)\b)$/, foldingStopMarker: /^\s*(\}|(done|fi|esac)\b)/, keyEquivalent: "^~S", name: "Shell Script (Bash)", 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: {patterns: [{captures: {1 => {name: "punctuation.definition.comment.shell"}}, match: /(? {patterns: [{begin: /(\[{2})/, captures: {1 => {name: "punctuation.definition.logical-expression.shell"}}, end: "(\\]{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)$", 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)$", 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)$", 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)$", 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)$", 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)$", 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)$", 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)$", 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)$", 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)$", 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)$", 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)$", endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}}, name: "string.unquoted.heredoc.textile.shell", patterns: [{include: "text.html.textile"}]}, {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)$", 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)$", endCaptures: {1 => {name: "keyword.control.heredoc-token.shell"}}, name: "string.unquoted.heredoc.shell"}]}, herestring: {patterns: [{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: {1 => {name: "keyword.operator.herestring.shell"}, 2 => {name: "string.quoted.double.herestring.shell"}, 3 => {name: "punctuation.definition.string.begin.shell"}, 6 => {name: "punctuation.definition.string.end.shell"}}, match: /(<<<)((")(\\("|\\)|[^"])*("))/, name: "meta.herestring.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(?:if|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: /-(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)\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.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/, 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 (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|local|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"}]}, variable: {patterns: [{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"}, {captures: {1 => {name: "punctuation.definition.variable.shell"}}, match: /(\$)[a-zA-Z_][a-zA-Z0-9_]*/, name: "variable.other.normal.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: /(\[)([^\]]+)(\])/}]}]}}, scopeName: "source.shell", uuid: "DDEEA3ED-6B1C-11D9-8B10-000D93589AF6"}