# Encoding: UTF-8 {fileTypes: ["sh", "ss", "bashrc", "bash_profile", "bash_login", "profile", "bash_logout", ".textmate_init"], firstLineMatch: "^#!.*\\b(bash|zsh|sh|tcsh)", foldingStartMarker: /\b(?<_1>if|case)\b|(?<_2>\{|\b(?<_3>do)\b)$/, foldingStopMarker: /^\s*(?<_1>\}|(?<_2>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: /(?<_1>\(|(?=\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: /(?#)(?!\{).*$\n?/, name: "comment.line.number-sign.shell"}]}, :"compound-command" => {patterns: [{begin: /(?<_1>\[{2})/, captures: {1 => {name: "punctuation.definition.logical-expression.shell"}}, end: "(\\]{2})", name: "meta.scope.logical-expression.shell", patterns: [{include: "#logical-expression"}, {include: "$self"}]}, {begin: /(?<_1>\({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: /(?<_1>\()/, captures: {1 => {name: "punctuation.definition.subshell.shell"}}, end: "(\\))", name: "meta.scope.subshell.shell", patterns: [{include: "$self"}]}, {begin: /(?<=\s|^)(?<_1>\{)(?=\s|$)/, captures: {1 => {name: "punctuation.definition.group.shell"}}, end: "(?<=^|;)\\s*(\\})", name: "meta.scope.group.shell", patterns: [{include: "$self"}]}]}, :"function-definition" => {patterns: [{begin: /\b(?<_1>function)\s+(?<_2>[^\s\\]+)(?:\s*(?<_3>\(\)))?/, 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(?<_1>[^\s\\=]+)\s*(?<_2>\(\))/, 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: /(?<_1><<)-(?<_2>"|'|)(?<_3>RUBY)\k<_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: /(?<_1><<)(?<_2>"|'|)(?<_3>RUBY)\k<_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: /(?<_1><<)-(?<_2>"|'|)(?<_3>PYTHON)\k<_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: /(?<_1><<)(?<_2>"|'|)(?<_3>PYTHON)\k<_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: /(?<_1><<)-(?<_2>"|'|)(?<_3>APPLESCRIPT)\k<_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: /(?<_1><<)(?<_2>"|'|)(?<_3>APPLESCRIPT)\k<_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: /(?<_1><<)-(?<_2>"|'|)(?<_3>HTML)\k<_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: /(?<_1><<)(?<_2>"|'|)(?<_3>HTML)\k<_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: /(?<_1><<)-(?<_2>"|'|)(?<_3>MARKDOWN)\k<_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: /(?<_1><<)(?<_2>"|'|)(?<_3>MARKDOWN)\k<_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: /(?<_1><<)-(?<_2>"|'|)(?<_3>TEXTILE)\k<_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: /(?<_1><<)(?<_2>"|'|)(?<_3>TEXTILE)\k<_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: /(?<_1><<)-(?<_2>"|'|)\\?(?<_3>\w+)\k<_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: /(?<_1><<)(?<_2>"|'|)\\?(?<_3>\w+)\k<_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: /(?<_1><<<)(?<_2>(?<_3>')[^']*(?<_4>'))/, 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: /(?<_1><<<)(?<_2>(?<_3>")(?<_4>\\(?<_5>"|\\)|[^"])*(?<_6>"))/, name: "meta.herestring.shell"}, {captures: {1 => {name: "keyword.operator.herestring.shell"}, 2 => {name: "string.unquoted.herestring.shell"}}, match: /(?<_1><<<)(?<_2>(?<_3>[^\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: /-(?<_1>nt|ot|ef|eq|ne|l[te]|g[te]|[a-hknoprstuwxzOGLSN])/, name: "keyword.operator.logical.shell"}]}, loop: {patterns: [{begin: /\b(?<_1>for)\s+(?=\({2})/, captures: {1 => {name: "keyword.control.shell"}}, end: "\\b(done)\\b", name: "meta.scope.for-loop.shell", patterns: [{include: "$self"}]}, {begin: /\b(?<_1>for)\s+(?<_2>(?:[^\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(?<_1>while|until)\b/, captures: {1 => {name: "keyword.control.shell"}}, end: "\\b(done)\\b", name: "meta.scope.while-loop.shell", patterns: [{include: "$self"}]}, {begin: /\b(?<_1>select)\s+(?<_2>(?:[^\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(?<_1>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(?<_1>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: /(?<_1>[?*+@!])(?<_2>\()/, 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(?<_1>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*(?<_1>>>|>|<)|\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: /\\(?<_1>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: /(?<_1>\$)[-*@#?$!0_]/, name: "variable.other.special.shell"}, {captures: {1 => {name: "punctuation.definition.variable.shell"}}, match: /(?<_1>\$)[1-9]/, name: "variable.other.positional.shell"}, {captures: {1 => {name: "punctuation.definition.variable.shell"}}, match: /(?<_1>\$)[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: /(?<_1>\[)(?<_2>[^\]]+)(?<_3>\])/}]}]}}, scopeName: "source.shell", uuid: "DDEEA3ED-6B1C-11D9-8B10-000D93589AF6"}