{ "name": "Pan Template", "scopeName": "source.pan", "patterns": [ { "include": "#comment" }, { "include": "#pipeline" }, { "include": "#list" }, { "include": "#compound-command" }, { "include": "#loop" }, { "include": "#function-definition" }, { "include": "#string" }, { "include": "#variable" }, { "include": "#heredoc" }, { "include": "#redirection" }, { "include": "#pathname" }, { "include": "#keyword" }, { "include": "#support" }, { "include": "#annotation" } ], "repository": { "annotation": { "patterns": [ { "name": "comment.block.documentation.annotation.pan", "begin": "@(\\w*){", "end": "(})", "captures": { "0": { "name": "punctuation.definition.comment.pan" } }, "beginCaptures": { "0": { "name": "keyword.operator.comment.annotation.token.pan" }, "1": { "name": "keyword.operator.comment.annotation.name.pan" } }, "endCaptures": { "1": { "name": "keyword.control.annotation-token.pan" } } } ] }, "case-clause": { "patterns": [ { "name": "meta.scope.case-clause.pan", "begin": "(?=\\S)", "end": ";;", "patterns": [ { "name": "meta.scope.case-pattern.pan", "begin": "(\\(|(?=\\S))", "end": "\\)", "patterns": [ { "name": "punctuation.separator.pipe-sign.pan", "match": "\\|" }, { "include": "#string" }, { "include": "#variable" }, { "include": "#pathname" } ], "captures": { "0": { "name": "punctuation.definition.case-pattern.pan" } } }, { "name": "meta.scope.case-clause-body.pan", "begin": "(?\u003c=\\))", "end": "(?=;;)", "patterns": [ { "include": "$self" } ] } ], "endCaptures": { "0": { "name": "punctuation.terminator.case-clause.pan" } } } ] }, "comment": { "begin": "(^\\s+)?(?\u003c!\\S)(?=#)(?!#\\{)", "end": "(?!\\G)", "patterns": [ { "name": "comment.line.number-sign.shebang.pan", "begin": "#!", "end": "\\n", "beginCaptures": { "0": { "name": "punctuation.definition.comment.shebang.pan" } } }, { "name": "comment.line.number-sign.pan", "begin": "#", "end": "\\n", "beginCaptures": { "0": { "name": "punctuation.definition.comment.pan" } } } ], "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.pan" } } }, "compound-command": { "patterns": [ { "name": "meta.scope.logical-expression.pan", "begin": "(\\[{1,2})", "end": "(\\]{1,2})", "patterns": [ { "include": "#logical-expression" }, { "include": "$self" } ], "captures": { "1": { "name": "punctuation.definition.logical-expression.pan" } } }, { "name": "string.other.math.pan", "begin": "(\\({2})", "end": "(\\){2})", "patterns": [ { "include": "#math" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.pan" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.pan" } } }, { "name": "meta.scope.subpan.pan", "begin": "(\\()", "end": "(\\))", "patterns": [ { "include": "$self" } ], "captures": { "1": { "name": "punctuation.definition.subpan.pan" } } }, { "name": "meta.scope.group.pan", "begin": "(?\u003c=\\s|^)(\\{)(?=\\s|$)", "end": "(?\u003c=^|;)\\s*(\\})", "patterns": [ { "include": "$self" } ], "captures": { "1": { "name": "punctuation.definition.group.pan" } } } ] }, "function-definition": { "patterns": [ { "name": "meta.function.pan", "begin": "\\b(function)\\s+([^\\s\\\\]+)(?:\\s*(\\(\\)))?", "end": ";|\u0026|$", "patterns": [ { "include": "$self" } ], "beginCaptures": { "1": { "name": "storage.type.function.pan" }, "2": { "name": "entity.name.function.pan" }, "3": { "name": "punctuation.definition.arguments.pan" } }, "endCaptures": { "0": { "name": "punctuation.definition.function.pan" } } } ] }, "heredoc": { "patterns": [ { "name": "string.unquoted.heredoc.pan", "begin": "(\u003c\u003c)(\"|'|)\\\\?(\\w+)\\2", "end": "^(\\3)\\b", "captures": { "0": { "name": "punctuation.definition.string.pan" } }, "beginCaptures": { "1": { "name": "keyword.operator.heredoc.pan" }, "3": { "name": "keyword.control.heredoc-token.pan" } }, "endCaptures": { "1": { "name": "keyword.control.heredoc-token.pan" } } } ] }, "keyword": { "patterns": [ { "name": "keyword.control.pan", "match": "(?\u003c!-)\\b(if|else|for|foreach|while|return)\\b(?!-)" }, { "name": "keyword.control.import.include.pan", "match": "\\b(include)\\b" }, { "name": "storage.modifier.final.pan", "match": "\\b(final)\\b" }, { "name": "storage.modifier.bind.pan", "match": "\\b(bind)\\b" } ] }, "list": { "patterns": [ { "name": "keyword.operator.list.pan", "match": ";|\u0026\u0026|\u0026|\\|\\|" } ] }, "logical-expression": { "patterns": [ { "name": "keyword.operator.logical.pan", "match": "\u0026\u0026|\\|\\||==|!=|\u003e|\u003e=|\u003c|\u003c=" }, { "name": "keyword.operator.bitwise.pan", "match": "\u0026|\\|^" } ] }, "loop": { "patterns": [ { "name": "meta.scope.for-loop.pan", "begin": "\\b(for)\\s+(?=\\({2})", "end": "\\b(done)\\b", "patterns": [ { "include": "$self" } ], "captures": { "1": { "name": "keyword.control.pan" } } }, { "name": "meta.scope.for-in-loop.pan", "begin": "\\b(for)\\b\\s+(.+)\\s+\\b(in)\\b", "end": "(?\u003c![-/])\\bdone\\b(?![-/])", "patterns": [ { "include": "$self" } ], "beginCaptures": { "1": { "name": "keyword.control.pan" }, "2": { "name": "variable.other.loop.pan", "patterns": [ { "include": "#string" } ] }, "3": { "name": "keyword.control.pan" } }, "endCaptures": { "0": { "name": "keyword.control.pan" } } }, { "name": "meta.scope.while-loop.pan", "begin": "\\b(while|until)\\b", "end": "\\b(done)\\b", "patterns": [ { "include": "$self" } ], "captures": { "1": { "name": "keyword.control.pan" } } }, { "name": "meta.scope.select-block.pan", "begin": "\\b(select)\\s+((?:[^\\s\\\\]|\\\\.)+)\\b", "end": "\\b(done)\\b", "patterns": [ { "include": "$self" } ], "beginCaptures": { "1": { "name": "keyword.control.pan" }, "2": { "name": "variable.other.loop.pan" } }, "endCaptures": { "1": { "name": "keyword.control.pan" } } }, { "name": "meta.scope.case-block.pan", "begin": "(?\u003c!-)\\b(case)\\b(?!-)", "end": "\\b(esac)\\b", "patterns": [ { "name": "meta.scope.case-body.pan", "begin": "\\b(?:in)\\b", "end": "(?=\\b(?:esac)\\b)", "patterns": [ { "include": "#comment" }, { "include": "#case-clause" }, { "include": "$self" } ], "beginCaptures": { "1": { "name": "keyword.control.pan" } } }, { "include": "$self" } ], "captures": { "1": { "name": "keyword.control.pan" } } }, { "name": "meta.scope.if-block.pan", "begin": "(?\u003c!-)\\b(if)\\b(?!-|\\s*=)", "end": "\\b(fi)\\b", "patterns": [ { "include": "$self" } ], "captures": { "1": { "name": "keyword.control.pan" } } } ] }, "math": { "patterns": [ { "include": "#variable" }, { "name": "keyword.operator.arithmetic.pan", "match": "[-+*/%]" }, { "name": "constant.numeric.hex.pan", "match": "0[xX][[:xdigit:]]+" }, { "name": "constant.numeric.octal.pan", "match": "0\\d+" }, { "name": "constant.numeric.other.pan", "match": "\\d{1,2}#[0-9a-zA-Z@_]+" }, { "name": "constant.numeric.integer.pan", "match": "\\d+" } ] }, "pathname": { "patterns": [ { "name": "keyword.operator.tilde.pan", "match": "(?\u003c=\\s|:|=|^)~" }, { "name": "keyword.operator.glob.pan", "match": "\\*|\\?" }, { "name": "meta.structure.extglob.pan", "begin": "([?*+@!])(\\()", "end": "(\\))", "patterns": [ { "include": "$self" } ], "beginCaptures": { "1": { "name": "keyword.operator.extglob.pan" }, "2": { "name": "punctuation.definition.extglob.pan" } }, "endCaptures": { "1": { "name": "punctuation.definition.extglob.pan" } } } ] }, "pipeline": { "patterns": [ { "name": "keyword.other.pan", "match": "\\b(time)\\b" }, { "name": "keyword.operator.pipe.pan", "match": "[|!]" } ] }, "redirection": { "patterns": [ { "name": "string.interpolated.process-substitution.pan", "begin": "[\u003e\u003c]\\(", "end": "\\)", "patterns": [ { "include": "$self" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.pan" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.pan" } } }, { "name": "keyword.operator.redirect.pan", "match": "\u0026\u003e|\\d*\u003e\u0026\\d*|\\d*(\u003e\u003e|\u003e|\u003c)|\\d*\u003c\u0026|\\d*\u003c\u003e" } ] }, "string": { "patterns": [ { "name": "constant.character.escape.pan", "match": "\\\\." }, { "name": "string.quoted.single.pan", "begin": "'", "end": "'", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.pan" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.pan" } } }, { "name": "string.quoted.double.pan", "begin": "\\$?\"", "end": "\"", "patterns": [ { "name": "constant.character.escape.pan", "match": "\\\\[\\$`\"\\\\\\n]" }, { "include": "#variable" }, { "include": "#interpolation" } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.pan" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.pan" } } }, { "name": "string.quoted.single.dollar.pan", "begin": "\\$'", "end": "'", "patterns": [ { "name": "constant.character.escape.ansi-c.pan", "match": "\\\\(a|b|e|f|n|r|t|v|\\\\|')" }, { "name": "constant.character.escape.octal.pan", "match": "\\\\[0-9]{3}" }, { "name": "constant.character.escape.hex.pan", "match": "\\\\x[0-9a-fA-F]{2}" }, { "name": "constant.character.escape.control-char.pan", "match": "\\\\c." } ], "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.pan" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.pan" } } } ] }, "support": { "patterns": [ { "name": "support.function.pan.string", "match": "\\b(file_contents|file_exists|format|index|length|match|matches|replace|splice|split|substitute|substr|to_lowercase|to_uppercase)\\b" }, { "name": "support.function.pan.debugging", "match": "\\b(debug|error|traceback|deprecated)\\b" }, { "name": "support.function.pan.codec", "match": "\\b(base64_decode|base64_encode|digest|escape|unescape)\\b" }, { "name": "support.function.pan.resource", "match": "\\b(append|create|first|dict|key|length|list|merge|next|prepend|splice)\\b" }, { "name": "support.function.pan.type.checking", "match": "\\b(is_boolean|is_defined|is_double|is_list|is_long|is_dict|is_null|is_number|is_property|is_resource|is_string)\\b" }, { "name": "support.function.pan.type.conversion", "match": "\\b(to_boolean|to_double|to_long|to_string|ip4_to_long|long_to_ip4)\\b" }, { "name": "support.function.pan.misc", "match": "\\b(clone|delete|exists|path_exists|if_exists|return|value)\\b" } ] }, "variable": { "patterns": [ { "name": "variable.other.pan", "match": "\\b(variable)\\s+(\\w+)\\b", "captures": { "1": { "name": "storage.type.var.pan" } } }, { "name": "storage.type.class.pan", "match": "\\b(type)\\s+(\\w+)\\b", "captures": { "2": { "name": "entity.name.type.pan" } } } ] } } }