{ "name": "Roff", "scopeName": "text.roff", "fileTypes": [ "1", "1b", "1c", "1has", "1in", "1m", "1s", "1x", "2", "3", "3avl", "3bsm", "3c", "3in", "3m", "3qt", "3x", "4", "5", "6", "7", "7d", "7fs", "7i", "7ipp", "7m", "7p", "8", "9", "9e", "9f", "9p", "9s", "groff", "man", "mandoc", "mdoc", "me", "mmn", "mmt", "ms", "mom", "n", "nroff", "roff", "t", "tmac", "tmac-u", "tr", "troff" ], "firstLineMatch": "(?x)\n\n# Manual page with .TH macro on first line\n^\\.TH[ \t]+(?:\\S+)\n|\n\n# Preprocessor line\n# See: https://www.gnu.org/software/groff/manual/html_node/Preprocessors-in-man-pages.html\n^'\\\\\"\\x20[tre]+(?=\\s|$)\n|\n\n# Emacs modeline\n(?i:-\\*-[^*]*(?:mode:\\s*)?\\b[gnt]?roff(?:\\s*;.*?)?\\s*-\\*-\n|\n\n# Vim modeline\n(?:vim?|ex):\\s*(?:set?.*\\s)?(?:syntax|filetype|ft)=[gnt]?roff\\s?(?:.*:)?)", "patterns": [ { "include": "#main" } ], "repository": { "main": { "patterns": [ { "include": "#preprocessors" }, { "include": "#escapes" }, { "include": "#requests" }, { "include": "#macros" } ] }, "params": { "patterns": [ { "include": "#escapes" }, { "include": "#string" }, { "include": "#number" }, { "include": "#generic-parameter" } ] }, "number": { "name": "constant.numeric.roff", "match": "(?!\\d+[cfimnPpsuvz]\\w)(\\|)?(?:(?]=?", "name": "keyword.operator.logical.roff" }, { "match": "\\|", "name": "keyword.operator.absolute.roff" } ] }, "definition": { "patterns": [ { "name": "meta.function.definition.request.$2.roff", "begin": "^([.'])[ \t]*((dei?1?)|(ami?1?))\\s+(\\S+?)?\\s*(\\\\[\"#].*)?$", "end": "^(?:[ \t]*\\x5C{2})?\\.[ \t]*\\.", "beginCaptures": { "1": { "name": "punctuation.definition.request.roff" }, "3": { "name": "storage.type.function.roff" }, "4": { "name": "entity.name.function.roff" }, "5": { "name": "variable.parameter.roff" }, "6": { "patterns": [ { "include": "#escapes" } ] }, "7": { "patterns": [ { "include": "#param-group" } ] } }, "endCaptures": { "0": { "name": "punctuation.definition.request.roff" } }, "patterns": [ { "include": "$self" } ] }, { "name": "meta.function.definition.request.with-terminator.$2.roff", "begin": "^([.'])[ \t]*((dei?1?)|(ami?1?))\\s+(\\S+)\\s*(\"[^\"]+\"?|\\S+?(?=\\s|\\\\[\"#]))?(.*)$", "end": "^(\\.)[ \t]*((\\6)(?=$|\\s|\\\\(?:$|\")))", "beginCaptures": { "1": { "name": "punctuation.definition.request.roff" }, "3": { "name": "storage.type.function.roff" }, "4": { "name": "entity.name.function.roff" }, "5": { "name": "variable.parameter.roff" }, "6": { "name": "keyword.control.terminator.roff", "patterns": [ { "include": "#string" } ] }, "7": { "patterns": [ { "include": "#param-group" } ] } }, "endCaptures": { "1": { "name": "punctuation.definition.request.roff" }, "2": { "name": "keyword.control.terminator.roff" }, "3": { "patterns": [ { "include": "#string" } ] } }, "patterns": [ { "include": "$self" } ] } ] }, "ignore": { "patterns": [ { "contentName": "comment.block.ignored-input.with-terminator.roff", "begin": "^([.'])[ \t]*(ig)[ \t]+(?!\\\\[\"#])((\"[^\"]+\")|\\S+?(?=\\s|\\\\[\"#]))(.*)$", "end": "^([.'])[ \t]*(\\3)(?=\\s|$|\\\\)", "patterns": [ { "include": "#register-expansion" } ], "beginCaptures": { "1": { "name": "punctuation.definition.request.roff" }, "2": { "name": "entity.function.name.roff" }, "3": { "name": "keyword.control.terminator.roff" }, "4": { "patterns": [ { "include": "#string" } ] }, "5": { "patterns": [ { "include": "#params" } ] } }, "endCaptures": { "1": { "name": "punctuation.definition.request.roff" }, "2": { "name": "keyword.control.terminator.roff", "patterns": [ { "include": "#string" } ] } } }, { "contentName": "comment.block.ignored-input.roff", "begin": "^([.'])[ \t]*(ig)(?=\\s|\\\\[\"#])(.*)$", "end": "^([.'])[ \t]*\\.(?=\\s|\\\\[\"#])", "patterns": [ { "include": "#register-expansion" } ], "beginCaptures": { "1": { "name": "punctuation.definition.request.roff" }, "2": { "name": "entity.function.name.roff" }, "3": { "patterns": [ { "include": "#params" } ] } }, "endCaptures": { "0": { "name": "punctuation.definition.request.roff" } } } ] }, "underlines": { "patterns": [ { "name": "meta.request.ul.roff", "match": "^([.'])[ \t]*(ul)\\s*(0+)(?:(?!\\\\\")[\\D])*(?=\\s|$)(.*)$", "captures": { "1": { "name": "punctuation.definition.function.request.roff" }, "2": { "name": "entity.function.name.roff" }, "3": { "name": "constant.numeric.roff" }, "4": { "patterns": [ { "include": "#params" } ] } } }, { "name": "meta.request.ul.roff", "begin": "^([.'])[ \t]*(ul)(.*?)$\\n", "end": "(?=<|!]=|->|<-|[+]-|\\*[A-IK-UW-Z*a-ik-uw-z])", "captures": { "1": { "name": "entity.name.roff" }, "2": { "name": "punctuation.definition.escape.roff" }, "3": { "name": "punctuation.definition.brace.roff" }, "4": { "name": "variable.parameter.roff" } } }, { "name": "constant.character.escape.function.named-char.gnu.roff", "begin": "(\\\\)(\\[)", "end": "(\\S*)(\\])|(?<=!]=|\\+-|->|<-|<<|>>|\\.{3}|,\\.,)\\b" }, { "name": "punctuation.definition.eqn.roff", "match": "[~,^{}]" }, { "name": "keyword.language.eqn.roff", "match": "(?x)\\b\n(above|back|bar|bold|ccol|col|cpile|define|delim|dot|dotdot|down|dyad|fat|font|from\n|fwd|gfont|gsize|hat|italic|lcol|left|lineup|lpile|mark|matrix|ndefine|over|pile\n|rcol|right|roman|rpile|size|sqrt|sub|sup|tdefine|tilde|to|under|up|vec)\\b" }, { "name": "keyword.language.eqn.gnu.roff", "match": "(?x)\\b\n(accent|big|chartype|smallover|type|vcenter|uaccent|split|nosplit\n|opprime|special|sdefine|include|ifdef|undef|g[rb]font|space)\\b" }, { "name": "constant.language.eqn.gnu.roff", "match": "(?x)\\b\n(Alpha|Beta|Chi|Delta|Epsilon|Eta|Gamma|Iota|Kappa|Lambda|Mu|Nu\n|Omega|Omicron|Phi|Pi|Psi|Rho|Sigma|Tau|Theta|Upsilon|Xi|Zeta\n|ldots|dollar)\\b" }, { "name": "meta.set-variable.eqn.gnu.roff", "match": "(?x)\\b(set)[ \t]+\n(accent_width|axis_height|baseline_sep|big_op_spacing[1-5]|body_depth|body_height|column_sep\n|default_rule_thickness|delimiter_factor|delimiter_shortfall|denom[12]|draw_lines|fat_offset\n|matrix_side_sep|medium_space|minimum_size|nroff|null_delimiter_space|num[12]|over_hang\n|script_space|shift_down|su[bp]_drop|sub[12]|sup[1-3]|thick_space|thin_space|x_height)\\b", "captures": { "1": { "name": "storage.type.var.eqn.roff" }, "2": { "name": "variable.other.mathml.eqn.roff" } } }, { "include": "#string" } ] }, "tbl": { "patterns": [ { "name": "meta.function-call.arguments.tbl.roff", "begin": "\\G|^((\\.)T&)[ \t]*$", "end": "(\\.)$\\n?|^(?=[.'][ \t]*TE(?=\\s))", "beginCaptures": { "1": { "name": "entity.function.name.roff" }, "2": { "name": "punctuation.definition.macro.roff" } }, "endCaptures": { "1": { "patterns": [ { "include": "#params" } ] }, "2": { "name": "punctuation.terminator.section.tbl.roff" } }, "patterns": [ { "begin": "^(?=\\.)", "end": "^(?=[.'][ \t]*TE(?=\\s|\\\\[\"#]))", "patterns": [ { "include": "$self" } ] }, { "match": "^(.+)(;)$", "captures": { "1": { "patterns": [ { "match": ",", "name": "punctuation.separator.comma.tbl.roff" }, { "match": "\\b(center|centre|expand|box|allbox|doublebox)\\b", "name": "constant.language.$1.tbl.roff" }, { "match": "\\b((tab|linesize|delim)(\\()([^\\)\\s]*)(\\)))", "captures": { "1": { "name": "constant.language.$2.tbl.roff" }, "3": { "name": "punctuation.definition.arguments.begin.tbl.roff" }, "4": { "patterns": [ { "include": "#params" } ] }, "5": { "name": "punctuation.definition.arguments.end.tbl.roff" } } } ] }, "2": { "name": "punctuation.terminator.line.tbl.roff" } } }, { "match": "[ABCEFILNPRSTUVWZabcefilnprstuvwz^]", "name": "constant.language.key-letter.tbl.roff" }, { "match": "[|_=]", "name": "punctuation.keyword.tbl.roff" }, { "match": "[-+]?\\d+", "name": "constant.numeric.tbl.roff" }, { "match": "\\.", "name": "punctuation.delimiter.period.full-stop.tbl.roff" }, { "match": ",", "name": "punctuation.separator.comma.tbl.roff" }, { "include": "#params" } ] }, { "name": "punctuation.keyword.tbl.roff", "match": "^\\s*([=_]|\\\\_)\\s*$" }, { "name": "constant.character.escape.repeat.tbl.roff", "match": "(?\\].*\\[~!&?:]" }, { "include": "#refer" } ] }, { "include": "#escapes" } ], "beginCaptures": { "1": { "name": "punctuation.definition.macro.mdoc.roff" }, "2": { "name": "punctuation.definition.percentage-sign.refer.roff" }, "3": { "name": "variable.other.readonly.key-letter.refer.roff" } } }, { "name": "string.quoted.single.refer.roff", "begin": "'", "end": "'", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.roff" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.roff" } } }, { "name": "variable.other.readonly.formatted.refer.roff", "match": "(%+)[\\daiA-Z]", "captures": { "1": { "name": "punctuation.definition.percentage-sign.refer.roff" } } }, { "name": "keyword.operator.label-expression.refer.roff", "match": "(?x)\n(?<=\\S)(?:\\*|[-+]\\d+|(\\.)(?:[-+]?y|[lucran]))(?=\\s|$) |\n(?<=\\S)[~!&?:](?=\\S)", "captures": { "1": { "name": "punctuation.separator.period.full-stop.refer.roff" } } }, { "begin": "<", "end": ">|^(?=\\.\\])", "beginCaptures": { "0": { "name": "punctuation.bracket.angle.refer.roff" } }, "endCaptures": { "0": { "name": "punctuation.bracket.angle.refer.roff" } }, "patterns": [ { "include": "#refer" } ] }, { "begin": "\\(", "end": "\\)|^(?=\\.\\])", "beginCaptures": { "0": { "name": "punctuation.bracket.round.refer.roff" } }, "endCaptures": { "0": { "name": "punctuation.bracket.round.refer.roff" } }, "patterns": [ { "include": "#refer" } ] }, { "name": "keyword.operator.negatable.refer.roff", "match": "(?x)\\b\n(?:no-)?\n(?:abbreviate|abbreviate-label-ranges|accumulate|annotate|compatible|date-as-label\n|default-database|discard|et-al|label-in-reference|label-in-text|move-punctuation\n|reverse|search-ignore|search-truncate|short-label|sort|sort-adjacent-labels)\\b", "captures": { "0": { "name": "entity.function.name.refer.roff" } } }, { "name": "keyword.operator.refer.roff", "match": "\\b(articles|bibliography|capitalize|join-authors|label|separate-label-second-parts)\\b", "captures": { "0": { "name": "entity.function.name.refer.roff" } } }, { "begin": "^\\s*\\b(database|include)\\b", "end": "(?