{ "name": "Ruby", "scopeName": "source.ruby", "fileTypes": [ "Appfile", "Appraisals", "arb", "Berksfile", "Brewfile", "cap", "Capfile", "capfile", "cgi", "cr", "Dangerfile", "Deliverfile", "Fastfile", "fcgi", "gemspec", "Guardfile", "irbrc", "opal", "Podfile", "podspec", "prawn", "pryrc", "Puppetfile", "rabl", "rake", "Rakefile", "Rantfile", "rb", "rbx", "rjs", "ru", "ruby", "Schemafile", "Snapfile", "thor", "Thorfile", "Vagrantfile" ], "firstLineMatch": "(?x)\n# Hashbang\n^\\#!.*(?:\\s|\\/)\n (?:ruby|macruby|rake|jruby|rbx|ruby_executable_hooks)\n(?:$|\\s)\n|\n# Modeline\n(?i:\n # Emacs\n -\\*-(?:\\s*(?=[^:;\\s]+\\s*-\\*-)|(?:.*?[;\\s]|(?<=-\\*-))mode\\s*:\\s*)\n ruby\n (?=[\\s;]|(?]?\\d+|m)?|\\sex)(?=:(?=\\s*set?\\s[^\\n:]+:)|:(?!\\s*set?\\s))(?:(?:\\s|\\s*:\\s*)\\w*(?:\\s*=(?:[^\\n\\\\\\s]|\\\\.)*)?)*[\\s:](?:filetype|ft|syntax)\\s*=\n ruby\n (?=\\s|:|$)\n)", "patterns": [ { "captures": { "1": { "name": "keyword.control.class.ruby" }, "2": { "name": "entity.name.type.class.ruby" }, "4": { "name": "entity.other.inherited-class.ruby" }, "5": { "name": "punctuation.separator.inheritance.ruby" }, "6": { "name": "variable.other.object.ruby" }, "7": { "name": "punctuation.definition.variable.ruby" } }, "match": "(?x)\n^\\s*(class)\\s+\n(\n (\n [.a-zA-Z0-9_:]+\n (\\s*(<)\\s*[.a-zA-Z0-9_:]+)? # class A < B\n )\n |\n ((<<)\\s*[.a-zA-Z0-9_:]+) # class << C\n)", "name": "meta.class.ruby" }, { "captures": { "1": { "name": "keyword.control.module.ruby" }, "2": { "name": "entity.name.type.module.ruby" }, "3": { "name": "entity.other.inherited-class.module.first.ruby" }, "4": { "name": "punctuation.separator.inheritance.ruby" }, "5": { "name": "entity.other.inherited-class.module.second.ruby" }, "6": { "name": "punctuation.separator.inheritance.ruby" }, "7": { "name": "entity.other.inherited-class.module.third.ruby" }, "8": { "name": "punctuation.separator.inheritance.ruby" } }, "match": "(?x)\n^\\s*(module)\\s+\n(\n ([A-Z]\\w*(::))?\n ([A-Z]\\w*(::))?\n ([A-Z]\\w*(::))*\n [A-Z]\\w*\n)", "name": "meta.module.ruby" }, { "comment": "else if is a common mistake carried over from other languages. it works if you put in a second end, but it’s never what you want.", "match": "(?[a-zA-Z_]\\w*(?>[?!])?)(:)(?!:)", "name": "constant.other.symbol.hashkey.ruby" }, { "captures": { "1": { "name": "punctuation.definition.constant.ruby" } }, "comment": "symbols as hash key (1.8 syntax)", "match": "(?[a-zA-Z_]\\w*(?>[?!])?)(?=\\s*=>)", "name": "constant.other.symbol.hashkey.ruby" }, { "comment": "everything being a reserved word, not a value and needing a 'end' is a..", "match": "(?|_|\\*|\\$|\\?|:|\"|-[0adFiIlpv])", "name": "variable.other.readwrite.global.pre-defined.ruby" }, { "begin": "\\b(ENV)\\[", "beginCaptures": { "1": { "name": "variable.other.constant.ruby" } }, "end": "]", "name": "meta.environment-variable.ruby", "patterns": [ { "include": "$self" } ] }, { "match": "\\b[A-Z]\\w*(?=((\\.|::)[A-Za-z]|\\[))", "name": "support.class.ruby" }, { "match": "\\b((abort|at_exit|autoload|binding|callcc|caller|caller_locations|chomp|chop|eval|exec|exit|fork|format|gets|global_variables|gsub|lambda|load|local_variables|open|p|print|printf|proc|putc|puts|rand|readline|readlines|select|set_trace_func|sleep|spawn|sprintf|srand|sub|syscall|system|test|trace_var|trap|untrace_var|warn)\\b(?![?!])|autoload\\?|exit!)", "name": "support.function.kernel.ruby" }, { "match": "\\b[_A-Z]\\w*\\b", "name": "variable.other.constant.ruby" }, { "begin": "(?x)\n(?=def\\b) # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\s+\n(\n (?>[a-zA-Z_]\\w*(?>\\.|::))? # method prefix\n (?> # method name\n [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n |\n ===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n )\n)\n\\s*(\\()", "beginCaptures": { "1": { "name": "keyword.control.def.ruby" }, "2": { "name": "entity.name.function.ruby" }, "3": { "name": "punctuation.definition.parameters.ruby" } }, "comment": "The method pattern comes from the symbol pattern. See there for an explanation.", "end": "\\)", "endCaptures": { "0": { "name": "punctuation.definition.parameters.ruby" } }, "name": "meta.function.method.with-arguments.ruby", "patterns": [ { "begin": "(?![\\s,)])", "end": "(?=,|\\)\\s*$)", "patterns": [ { "captures": { "1": { "name": "storage.type.variable.ruby" }, "2": { "name": "constant.other.symbol.hashkey.parameter.function.ruby" }, "3": { "name": "punctuation.definition.constant.hashkey.ruby" }, "4": { "name": "variable.parameter.function.ruby" } }, "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))" }, { "include": "$self" } ] } ] }, { "begin": "(?x)\n(?=def\\b) # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\s+\n(\n (?>[a-zA-Z_]\\w*(?>\\.|::))? # method prefix\n (?> # method name\n [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n |\n ===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n )\n)\n[ \\t]\n(?=[ \\t]*[^\\s#;]) # make sure the following is not comment", "beginCaptures": { "1": { "name": "keyword.control.def.ruby" }, "2": { "name": "entity.name.function.ruby" } }, "comment": "same as the previous rule, but without parentheses around the arguments", "end": "$", "name": "meta.function.method.with-arguments.ruby", "patterns": [ { "begin": "(?![\\s,])", "end": "(?=,|$)", "patterns": [ { "captures": { "1": { "name": "storage.type.variable.ruby" }, "2": { "name": "constant.other.symbol.hashkey.parameter.function.ruby" }, "3": { "name": "punctuation.definition.constant.hashkey.ruby" }, "4": { "name": "variable.parameter.function.ruby" } }, "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))" }, { "include": "$self" } ] } ] }, { "captures": { "1": { "name": "keyword.control.def.ruby" }, "3": { "name": "entity.name.function.ruby" } }, "comment": " the optional name is just to catch the def also without a method-name", "match": "(?x)\n(?=def\\b) # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\b\n(\n \\s+\n (\n (?>[a-zA-Z_]\\w*(?>\\.|::))? # method prefix\n (?> # method name\n [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n |\n ===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n )\n )\n)?", "name": "meta.function.method.without-arguments.ruby" }, { "match": "(?x)\n\\b\n(\n [\\d](?>_?\\d)* # 100_000\n (\\.(?![^[:space:][:digit:]])(?>_?\\d)*)? # fractional part\n ([eE][-+]?\\d(?>_?\\d)*)? # 1.23e-4\n |\n 0\n (?:\n [xX]\\h(?>_?\\h)*|\n [oO]?[0-7](?>_?[0-7])*|\n [bB][01](?>_?[01])*|\n [dD]\\d(?>_?\\d)*\n ) # A base indicator can only be used with an integer\n)\\b", "name": "constant.numeric.ruby" }, { "begin": ":'", "beginCaptures": { "0": { "name": "punctuation.definition.symbol.begin.ruby" } }, "comment": "symbol literal with '' delimitor", "end": "'", "endCaptures": { "0": { "name": "punctuation.definition.symbol.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\['\\\\]", "name": "constant.character.escape.ruby" } ] }, { "begin": ":\"", "beginCaptures": { "0": { "name": "punctuation.section.symbol.begin.ruby" } }, "comment": "symbol literal with \"\" delimitor", "end": "\"", "endCaptures": { "0": { "name": "punctuation.section.symbol.end.ruby" } }, "name": "constant.other.symbol.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "comment": "Needs higher precidence than regular expressions.", "match": "(?|=>|==|=~|!~|!=|;|$|\n if|else|elsif|then|do|end|unless|while|until|or|and\n )\n |\n $\n)", "captures": { "1": { "name": "string.regexp.interpolated.ruby" }, "2": { "name": "punctuation.section.regexp.ruby" } }, "comment": "regular expression literal with interpolation", "contentName": "string.regexp.interpolated.ruby", "end": "((/[eimnosux]*))", "patterns": [ { "include": "#regex_sub" } ] }, { "begin": "%r{", "beginCaptures": { "0": { "name": "punctuation.section.regexp.begin.ruby" } }, "end": "}[eimnosux]*", "endCaptures": { "0": { "name": "punctuation.section.regexp.end.ruby" } }, "name": "string.regexp.interpolated.ruby", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_curly_r" } ] }, { "begin": "%r\\[", "beginCaptures": { "0": { "name": "punctuation.section.regexp.begin.ruby" } }, "end": "][eimnosux]*", "endCaptures": { "0": { "name": "punctuation.section.regexp.end.ruby" } }, "name": "string.regexp.interpolated.ruby", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_brackets_r" } ] }, { "begin": "%r\\(", "beginCaptures": { "0": { "name": "punctuation.section.regexp.begin.ruby" } }, "end": "\\)[eimnosux]*", "endCaptures": { "0": { "name": "punctuation.section.regexp.end.ruby" } }, "name": "string.regexp.interpolated.ruby", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_parens_r" } ] }, { "begin": "%r<", "beginCaptures": { "0": { "name": "punctuation.section.regexp.begin.ruby" } }, "end": ">[eimnosux]*", "endCaptures": { "0": { "name": "punctuation.section.regexp.end.ruby" } }, "name": "string.regexp.interpolated.ruby", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_ltgt_r" } ] }, { "begin": "%r([^\\w])", "beginCaptures": { "0": { "name": "punctuation.section.regexp.begin.ruby" } }, "end": "\\1[eimnosux]*", "endCaptures": { "0": { "name": "punctuation.section.regexp.end.ruby" } }, "name": "string.regexp.interpolated.ruby", "patterns": [ { "include": "#regex_sub" } ] }, { "begin": "%I\\[", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_brackets_i" } ] }, { "begin": "%I\\(", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_parens_i" } ] }, { "begin": "%I<", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_ltgt_i" } ] }, { "begin": "%I{", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_curly_i" } ] }, { "begin": "%I([^\\w])", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "begin": "%i\\[", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\]|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_brackets" } ] }, { "begin": "%i\\(", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\\\)|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_parens" } ] }, { "begin": "%i<", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\>|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_ltgt" } ] }, { "begin": "%i{", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\}|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_curly" } ] }, { "begin": "%i([^\\w])", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "comment": "Cant be named because its not neccesarily an escape.", "match": "\\\\." } ] }, { "begin": "%W\\[", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_brackets_i" } ] }, { "begin": "%W\\(", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_parens_i" } ] }, { "begin": "%W<", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_ltgt_i" } ] }, { "begin": "%W{", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_curly_i" } ] }, { "begin": "%W([^\\w])", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "begin": "%w\\[", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\]|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_brackets" } ] }, { "begin": "%w\\(", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\\\)|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_parens" } ] }, { "begin": "%w<", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\>|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_ltgt" } ] }, { "begin": "%w{", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\}|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_curly" } ] }, { "begin": "%w([^\\w])", "beginCaptures": { "0": { "name": "punctuation.section.array.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.section.array.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "comment": "Cant be named because its not neccesarily an escape.", "match": "\\\\." } ] }, { "begin": "%[Qx]?\\(", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_parens_i" } ] }, { "begin": "%[Qx]?\\[", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_brackets_i" } ] }, { "begin": "%[Qx]?{", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_curly_i" } ] }, { "begin": "%[Qx]?<", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_ltgt_i" } ] }, { "begin": "%[Qx]([^\\w])", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "begin": "%([^\\w\\s=])", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.interpolated.ruby", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "begin": "%q\\(", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\\\)|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_parens" } ] }, { "begin": "%q<", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\>|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_ltgt" } ] }, { "begin": "%q\\[", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\]|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_brackets" } ] }, { "begin": "%q{", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "match": "\\\\}|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_curly" } ] }, { "begin": "%q([^\\w])", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.quoted.other.ruby", "patterns": [ { "comment": "Cant be named because its not neccesarily an escape.", "match": "\\\\." } ] }, { "begin": "%s\\(", "beginCaptures": { "0": { "name": "punctuation.definition.symbol.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.definition.symbol.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\\\)|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_parens" } ] }, { "begin": "%s<", "beginCaptures": { "0": { "name": "punctuation.definition.symbol.begin.ruby" } }, "end": ">", "endCaptures": { "0": { "name": "punctuation.definition.symbol.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\>|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_ltgt" } ] }, { "begin": "%s\\[", "beginCaptures": { "0": { "name": "punctuation.definition.symbol.begin.ruby" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.definition.symbol.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\]|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_brackets" } ] }, { "begin": "%s{", "beginCaptures": { "0": { "name": "punctuation.definition.symbol.begin.ruby" } }, "end": "}", "endCaptures": { "0": { "name": "punctuation.definition.symbol.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "match": "\\\\}|\\\\\\\\", "name": "constant.character.escape.ruby" }, { "include": "#nest_curly" } ] }, { "begin": "%s([^\\w])", "beginCaptures": { "0": { "name": "punctuation.definition.symbol.begin.ruby" } }, "end": "\\1", "endCaptures": { "0": { "name": "punctuation.definition.symbol.end.ruby" } }, "name": "constant.other.symbol.ruby", "patterns": [ { "comment": "Cant be named because its not neccesarily an escape.", "match": "\\\\." } ] }, { "captures": { "1": { "name": "punctuation.definition.constant.ruby" } }, "comment": "symbols", "match": "(?x)\n(?\n [$a-zA-Z_]\\w*(?>[?!]|=(?![>=]))?\n |\n ===?|<=>|>[>=]?|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[]=?\n |\n @@?[a-zA-Z_]\\w*\n)", "name": "constant.other.symbol.ruby" }, { "begin": "^=begin", "captures": { "0": { "name": "punctuation.definition.comment.ruby" } }, "comment": "multiline comments", "end": "^=end", "name": "comment.block.documentation.ruby" }, { "begin": "(^[ \\t]+)?(?=#)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.ruby" } }, "end": "(?!\\G)", "patterns": [ { "begin": "#", "beginCaptures": { "0": { "name": "punctuation.definition.comment.ruby" } }, "end": "\\n", "name": "comment.line.number-sign.ruby", "patterns": [ { "include": "#yard" } ] } ] }, { "comment": "\n\t\t\tmatches questionmark-letters.\n\n\t\t\texamples (1st alternation = hex):\n\t\t\t?\\x1 ?\\x61\n\n\t\t\texamples (2nd alternation = octal):\n\t\t\t?\\0 ?\\07 ?\\017\n\n\t\t\texamples (3rd alternation = escaped):\n\t\t\t?\\n ?\\b\n\n\t\t\texamples (4th alternation = meta-ctrl):\n\t\t\t?\\C-a ?\\M-a ?\\C-\\M-\\C-\\M-a\n\n\t\t\texamples (4th alternation = normal):\n\t\t\t?a ?A ?0 \n\t\t\t?* ?\" ?( \n\t\t\t?. ?#\n\t\t\t\n\t\t\t\n\t\t\tthe negative lookbehind prevents against matching\n\t\t\tp(42.tainted?)\n\t\t\t", "match": "(?<<[-~](\"?)((?:[_\\w]+_|)HTML)\\b\\1))", "comment": "Heredoc with embedded html", "end": "(?!\\G)", "name": "meta.embedded.block.html", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)HTML)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "text.html", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "text.html.basic" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)XML)\\b\\1))", "comment": "Heredoc with embedded xml", "end": "(?!\\G)", "name": "meta.embedded.block.xml", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)XML)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "text.xml", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "text.xml" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)SQL)\\b\\1))", "comment": "Heredoc with embedded sql", "end": "(?!\\G)", "name": "meta.embedded.block.sql", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)SQL)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.sql", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.sql" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)GRAPHQL)\\b\\1))", "comment": "Heredoc with embedded GraphQL", "end": "(?!\\G)", "name": "meta.embedded.block.graphql", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)GRAPHQL)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.graphql", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.graphql" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)CSS)\\b\\1))", "comment": "Heredoc with embedded css", "end": "(?!\\G)", "name": "meta.embedded.block.css", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)CSS)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.css", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.css" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)CPP)\\b\\1))", "comment": "Heredoc with embedded c++", "end": "(?!\\G)", "name": "meta.embedded.block.cpp", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)CPP)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.cpp", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.cpp" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)C)\\b\\1))", "comment": "Heredoc with embedded c", "end": "(?!\\G)", "name": "meta.embedded.block.c", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)C)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.c", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.c" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1))", "comment": "Heredoc with embedded javascript", "end": "(?!\\G)", "name": "meta.embedded.block.js", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.js", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.js" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)JQUERY)\\b\\1))", "comment": "Heredoc with embedded jQuery javascript", "end": "(?!\\G)", "name": "meta.embedded.block.js.jquery", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)JQUERY)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.js.jquery", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.js.jquery" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1))", "comment": "Heredoc with embedded shell", "end": "(?!\\G)", "name": "meta.embedded.block.shell", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.shell", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.shell" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)LUA)\\b\\1))", "comment": "Heredoc with embedded lua", "end": "(?!\\G)", "name": "meta.embedded.block.lua", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)LUA)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.lua", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.lua" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)RUBY)\\b\\1))", "comment": "Heredoc with embedded ruby", "end": "(?!\\G)", "name": "meta.embedded.block.ruby", "patterns": [ { "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)RUBY)\\b\\1)", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "contentName": "source.ruby", "end": "^\\s*\\2$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "source.ruby" }, { "include": "#escaped_char" } ] } ] }, { "begin": "(?>=\\s*<<(\\w+))", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "end": "^\\1$", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "begin": "(?>((<<[-~](\\w+),\\s?)*<<[-~](\\w+)))", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.ruby" } }, "comment": "heredoc with multiple inputs and indented terminator", "end": "^\\s*\\4$", "endCaptures": { "0": { "name": "punctuation.definition.string.end.ruby" } }, "name": "string.unquoted.heredoc.ruby", "patterns": [ { "include": "#heredoc" }, { "include": "#interpolated_ruby" }, { "include": "#escaped_char" } ] }, { "begin": "(?<={|{\\s|[^A-Za-z0-9_]do|^do|[^A-Za-z0-9_]do\\s|^do\\s)(\\|)", "captures": { "1": { "name": "punctuation.separator.variable.ruby" } }, "end": "(?", "name": "punctuation.separator.key-value" }, { "match": "->", "name": "support.function.kernel.ruby" }, { "match": "<<=|%=|&{1,2}=|\\*=|\\*\\*=|\\+=|-=|\\^=|\\|{1,2}=|<<", "name": "keyword.operator.assignment.augmented.ruby" }, { "match": "<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \\t])\\?", "name": "keyword.operator.comparison.ruby" }, { "match": "(?>", "name": "keyword.operator.other.ruby" }, { "match": ";", "name": "punctuation.separator.statement.ruby" }, { "match": ",", "name": "punctuation.separator.object.ruby" }, { "comment": "Mark as namespace separator if double colons followed by capital letter", "match": "(::)\\s*(?=[A-Z])", "captures": { "1": { "name": "punctuation.separator.namespace.ruby" } } }, { "comment": "Mark as method separator if double colons not followed by capital letter", "match": "(\\.|::)\\s*(?![A-Z])", "captures": { "1": { "name": "punctuation.separator.method.ruby" } } }, { "comment": "Must come after method and constant separators to prefer double colons", "match": ":", "name": "punctuation.separator.other.ruby" }, { "match": "{", "name": "punctuation.section.scope.begin.ruby" }, { "match": "}", "name": "punctuation.section.scope.end.ruby" }, { "match": "\\[", "name": "punctuation.section.array.begin.ruby" }, { "match": "]", "name": "punctuation.section.array.end.ruby" }, { "match": "\\(|\\)", "name": "punctuation.section.function.ruby" } ], "repository": { "escaped_char": { "match": "\\\\(?:[0-7]{1,3}|x[\\da-fA-F]{1,2}|.)", "name": "constant.character.escape.ruby" }, "heredoc": { "begin": "^<<[-~]?\\w+", "end": "$", "patterns": [ { "include": "$self" } ] }, "interpolated_ruby": { "patterns": [ { "begin": "#{", "beginCaptures": { "0": { "name": "punctuation.section.embedded.begin.ruby" } }, "contentName": "source.ruby", "end": "}", "endCaptures": { "0": { "name": "punctuation.section.embedded.end.ruby" } }, "name": "meta.embedded.line.ruby", "patterns": [ { "include": "#nest_curly_and_self" }, { "include": "$self" } ] }, { "captures": { "1": { "name": "punctuation.definition.variable.ruby" } }, "match": "(#@)[a-zA-Z_]\\w*", "name": "variable.other.readwrite.instance.ruby" }, { "captures": { "1": { "name": "punctuation.definition.variable.ruby" } }, "match": "(#@@)[a-zA-Z_]\\w*", "name": "variable.other.readwrite.class.ruby" }, { "captures": { "1": { "name": "punctuation.definition.variable.ruby" } }, "match": "(#\\$)[a-zA-Z_]\\w*", "name": "variable.other.readwrite.global.ruby" } ] }, "nest_brackets": { "begin": "\\[", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "]", "patterns": [ { "include": "#nest_brackets" } ] }, "nest_brackets_i": { "begin": "\\[", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "]", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_brackets_i" } ] }, "nest_brackets_r": { "begin": "\\[", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "]", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_brackets_r" } ] }, "nest_curly": { "begin": "{", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "}", "patterns": [ { "include": "#nest_curly" } ] }, "nest_curly_and_self": { "patterns": [ { "begin": "{", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "}", "patterns": [ { "include": "#nest_curly_and_self" } ] }, { "include": "$self" } ] }, "nest_curly_i": { "begin": "{", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "}", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_curly_i" } ] }, "nest_curly_r": { "begin": "{", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "}", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_curly_r" } ] }, "nest_ltgt": { "begin": "<", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": ">", "patterns": [ { "include": "#nest_ltgt" } ] }, "nest_ltgt_i": { "begin": "<", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": ">", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_ltgt_i" } ] }, "nest_ltgt_r": { "begin": "<", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": ">", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_ltgt_r" } ] }, "nest_parens": { "begin": "\\(", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "\\)", "patterns": [ { "include": "#nest_parens" } ] }, "nest_parens_i": { "begin": "\\(", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "\\)", "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "include": "#nest_parens_i" } ] }, "nest_parens_r": { "begin": "\\(", "captures": { "0": { "name": "punctuation.section.scope.ruby" } }, "end": "\\)", "patterns": [ { "include": "#regex_sub" }, { "include": "#nest_parens_r" } ] }, "regex_sub": { "patterns": [ { "include": "#interpolated_ruby" }, { "include": "#escaped_char" }, { "captures": { "1": { "name": "punctuation.definition.arbitrary-repetition.ruby" }, "3": { "name": "punctuation.definition.arbitrary-repetition.ruby" } }, "match": "({)\\d+(,\\d+)?(})", "name": "string.regexp.arbitrary-repetition.ruby" }, { "begin": "\\[(?:\\^?])?", "captures": { "0": { "name": "punctuation.definition.character-class.ruby" } }, "end": "]", "name": "string.regexp.character-class.ruby", "patterns": [ { "include": "#escaped_char" } ] }, { "begin": "\\(\\?#", "beginCaptures": { "0": { "name": "punctuation.definition.comment.begin.ruby" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.definition.comment.end.ruby" } }, "name": "comment.line.number-sign.ruby", "patterns": [ { "include": "#escaped_char" } ] }, { "begin": "\\(", "captures": { "0": { "name": "punctuation.definition.group.ruby" } }, "end": "\\)", "name": "string.regexp.group.ruby", "patterns": [ { "include": "#regex_sub" } ] }, { "begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)", "beginCaptures": { "1": { "name": "punctuation.definition.comment.ruby" } }, "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.", "end": "$\\n?", "endCaptures": { "0": { "name": "punctuation.definition.comment.ruby" } }, "name": "comment.line.number-sign.ruby" } ] }, "yard": { "name": "comment.line.yard.ruby", "patterns": [ { "include": "#yard_comment" }, { "include": "#yard_name_types" }, { "include": "#yard_tag" }, { "include": "#yard_types" }, { "include": "#yard_directive" } ] }, "yard_comment": { "comment": "For YARD tags that follow the tag-comment pattern", "match": "(@)(abstract|api|author|deprecated|example|note|overload|since|todo|version)(?=\\s)(.*)$", "captures": { "1": { "name": "comment.line.keyword.punctuation.yard.ruby" }, "2": { "name": "comment.line.keyword.yard.ruby" }, "3": { "name": "comment.line.string.yard.ruby" } } }, "yard_name_types": { "comment": "For YARD tags that follow the tag-name-types-comment pattern", "match": "(@)(attr|attr_reader|attr_writer|option|param|see|yieldparam)(?=\\s)(\\s+([a-z_][a-zA-Z_]*))?(\\s+((\\[).+(])))?(.*)$", "captures": { "1": { "name": "comment.line.keyword.punctuation.yard.ruby" }, "2": { "name": "comment.line.keyword.yard.ruby" }, "3": { "name": "comment.line.yard.ruby" }, "4": { "name": "comment.line.parameter.yard.ruby" }, "5": { "name": "comment.line.yard.ruby" }, "6": { "name": "comment.line.type.yard.ruby" }, "7": { "name": "comment.line.punctuation.yard.ruby" }, "8": { "name": "comment.line.punctuation.yard.ruby" }, "9": { "name": "comment.line.string.yard.ruby" } } }, "yard_tag": { "comment": "For YARD tags that are just the tag", "match": "(@)(private)$", "captures": { "1": { "name": "comment.line.keyword.punctuation.yard.ruby" }, "2": { "name": "comment.line.keyword.yard.ruby" } } }, "yard_types": { "comment": "For YARD tags that follow the tag-types-comment pattern", "match": "(@)(raise|return|yield(?:return)?)(?=\\s)(\\s+((\\[).+(])))?(.*)$", "captures": { "1": { "name": "comment.line.keyword.punctuation.yard.ruby" }, "2": { "name": "comment.line.keyword.yard.ruby" }, "3": { "name": "comment.line.yard.ruby" }, "4": { "name": "comment.line.type.yard.ruby" }, "5": { "name": "comment.line.punctuation.yard.ruby" }, "6": { "name": "comment.line.punctuation.yard.ruby" }, "7": { "name": "comment.line.string.yard.ruby" } } }, "yard_directive": { "comment": "For YARD directives", "match": "(@!)(attribute|endgroup|group|macro|method|parse|scope|visibility)(\\s+((\\[).+(])))?(?=\\s)(.*)$", "captures": { "1": { "name": "comment.line.keyword.punctuation.yard.ruby" }, "2": { "name": "comment.line.keyword.yard.ruby" }, "3": { "name": "comment.line.yard.ruby" }, "4": { "name": "comment.line.type.yard.ruby" }, "5": { "name": "comment.line.punctuation.yard.ruby" }, "6": { "name": "comment.line.punctuation.yard.ruby" }, "7": { "name": "comment.line.string.yard.ruby" } } } } }