@wooorm/starry-night
Version:
Syntax highlighting, like GitHub
1,301 lines (1,300 loc) • 151 kB
JavaScript
// This is a TextMate grammar distributed by `starry-night`.
// This grammar is developed at
// <https://github.com/Alhadis/language-roff>
// and licensed `isc`.
// See <https://github.com/wooorm/starry-night> for more info.
/**
* @import {Grammar} from '@wooorm/starry-night'
*/
/** @type {Grammar} */
const grammar = {
dependencies: [
'source.ditroff',
'source.gremlin',
'source.ideal',
'source.pic'
],
extensions: [
'.1',
'.1',
'.1in',
'.1in',
'.1m',
'.1m',
'.1x',
'.1x',
'.2',
'.2',
'.3',
'.3',
'.3in',
'.3in',
'.3m',
'.3m',
'.3p',
'.3p',
'.3pm',
'.3pm',
'.3qt',
'.3qt',
'.3x',
'.3x',
'.4',
'.4',
'.5',
'.5',
'.6',
'.6',
'.7',
'.7',
'.8',
'.8',
'.9',
'.9',
'.man',
'.man',
'.mdoc',
'.mdoc',
'.me',
'.roff',
'.tmac'
],
injections: {
'L:meta.device-control.roff, L:meta.function.request.transparent-output & source.embedded.ditroff':
{patterns: [{match: "[.']"}, {include: '#escapes-copymode'}]},
'L:meta.function.request.external-command.*.roff source.embedded.shell': {
patterns: [{include: '#escapes'}]
},
'L:text.roff': {patterns: [{include: '#c0'}]}
},
names: [
'groff',
'man',
'man-page',
'man-page',
'manpage',
'mdoc',
'nroff',
'roff',
'roff-manpage',
'troff'
],
patterns: [
{
begin: '\\A(?=x\\s*T\\s+(?:[a-z][-a-zA-Z0-9]*)\\s*$)',
end: '(?=A)B',
name: 'source.embedded.ditroff',
patterns: [{include: 'source.ditroff'}]
},
{
begin: '\\A(?=X\\s+(?:495|crt|hp|impr|ps)(?:\\s+\\d+){3}[ \\t]*$)',
end: '(?=A)B',
name: 'source.embedded.context',
patterns: [{include: 'source.context'}]
},
{include: '#main'}
],
repository: {
'2-part-string': {
captures: {
1: {
name: 'punctuation.definition.string.begin.roff',
patterns: [{include: '#c0'}]
},
2: {
name: 'meta.segment.1.left.roff',
patterns: [{include: '#escapes'}]
},
3: {
name: 'punctuation.definition.string.middle.roff',
patterns: [{include: '#c0'}]
},
4: {
name: 'meta.segment.2.right.roff',
patterns: [{include: '#escapes'}]
},
5: {
name: 'punctuation.definition.string.end.roff',
patterns: [{include: '#c0'}]
}
},
match: '\\G(.)((?:(?!\\1).)*)(\\1)((?:(?!\\1).)*)(\\1)',
name: 'string.quoted.other.arbitrary-delimiter.2-part.roff'
},
'3-part-title': {
captures: {
1: {
name: 'punctuation.definition.string.outer.begin.roff',
patterns: [{include: '#c0'}]
},
2: {
name: 'meta.segment.1.left.roff',
patterns: [{include: '#escapes'}]
},
3: {
name: 'punctuation.definition.string.inner.begin.roff',
patterns: [{include: '#c0'}]
},
4: {
name: 'meta.segment.2.centre.roff',
patterns: [{include: '#escapes'}]
},
5: {
name: 'punctuation.definition.string.inner.end.roff',
patterns: [{include: '#c0'}]
},
6: {
name: 'meta.segment.3.right.roff',
patterns: [{include: '#escapes'}]
},
7: {
name: 'punctuation.definition.string.outer.end.roff',
patterns: [{include: '#c0'}]
}
},
match:
'\\G[ \\t]*(.)((?:(?!\\1).)*)(\\1)((?:(?!\\1).)*)(\\1)((?:(?!\\1).)*)(\\1)',
name: 'string.quoted.other.arbitrary-delimiter.3-part.roff'
},
'alternating-fonts': {
patterns: [
{
begin: "(?:^|\\G)([.'])[ \\t]*(BI)(?=\\s)",
beginCaptures: {
0: {name: 'meta.function.man.macro.roff'},
1: {name: 'punctuation.definition.function.macro.roff'},
2: {name: 'entity.name.function.roff'}
},
end: '(?<![^\\\\]\\\\|^\\\\)(?=(?!R)\\R|$)|(?=\\\\")',
patterns: [
{include: '#odd-bold'},
{include: '#even-italic-after-bold'},
{include: '#even-italic'},
{include: '#bridge-escapes'}
]
},
{
begin: "(?:^|\\G)([.'])[ \\t]*(BR)(?=\\s)",
beginCaptures: {
0: {name: 'meta.function.man.macro.roff'},
1: {name: 'punctuation.definition.function.macro.roff'},
2: {name: 'entity.name.function.roff'}
},
end: '(?<![^\\\\]\\\\|^\\\\)(?=(?!R)\\R|$)|(?=\\\\")',
patterns: [
{include: '#odd-bold'},
{include: '#even-roman-after-bold'},
{include: '#even-roman'},
{include: '#bridge-escapes'}
]
},
{
begin: "(?:^|\\G)([.'])[ \\t]*(IB)(?=\\s)",
beginCaptures: {
0: {name: 'meta.function.man.macro.roff'},
1: {name: 'punctuation.definition.function.macro.roff'},
2: {name: 'entity.name.function.roff'}
},
end: '(?<![^\\\\]\\\\|^\\\\)(?=(?!R)\\R|$)|(?=\\\\")',
patterns: [
{include: '#odd-italic'},
{include: '#even-bold-after-italic'},
{include: '#even-bold'},
{include: '#bridge-escapes'}
]
},
{
begin: "(?:^|\\G)([.'])[ \\t]*(IR)(?=\\s)",
beginCaptures: {
0: {name: 'meta.function.man.macro.roff'},
1: {name: 'punctuation.definition.function.macro.roff'},
2: {name: 'entity.name.function.roff'}
},
end: '(?<![^\\\\]\\\\|^\\\\)(?=(?!R)\\R|$)|(?=\\\\")',
patterns: [
{include: '#odd-italic'},
{include: '#even-roman-after-italic'},
{include: '#even-roman'},
{include: '#bridge-escapes'}
]
},
{
begin: "(?:^|\\G)([.'])[ \\t]*(RB)(?=\\s)",
beginCaptures: {
0: {name: 'meta.function.man.macro.roff'},
1: {name: 'punctuation.definition.function.macro.roff'},
2: {name: 'entity.name.function.roff'}
},
end: '(?<![^\\\\]\\\\|^\\\\)(?=(?!R)\\R|$)|(?=\\\\")',
patterns: [
{include: '#odd-roman'},
{include: '#even-bold-after-roman'},
{include: '#even-bold'},
{include: '#bridge-escapes'}
]
},
{
begin: "(?:^|\\G)([.'])[ \\t]*(RI)(?=\\s)",
beginCaptures: {
0: {name: 'meta.function.man.macro.roff'},
1: {name: 'punctuation.definition.function.macro.roff'},
2: {name: 'entity.name.function.roff'}
},
end: '(?<![^\\\\]\\\\|^\\\\)(?=(?!R)\\R|$)|(?=\\\\")',
patterns: [
{include: '#odd-roman'},
{include: '#even-italic-after-roman'},
{include: '#even-italic'},
{include: '#bridge-escapes'}
]
}
]
},
arithmetic: {
patterns: [
{include: '#escapes'},
{
captures: {
1: {name: 'punctuation.arithmetic.begin.roff'},
2: {patterns: [{include: '#arithmetic'}]},
3: {name: 'punctuation.arithmetic.end.roff'}
},
match: '(\\()(.*?)(\\))',
name: 'meta.brackets.roff'
},
{include: '#number'},
{match: '<\\?', name: 'keyword.operator.minimum.gnu.roff'},
{match: '>\\?', name: 'keyword.operator.maximum.gnu.roff'},
{match: '[-/+*%]', name: 'keyword.operator.arithmetic.roff'},
{match: ':|&|[<=>]=?', name: 'keyword.operator.logical.roff'},
{match: '\\|', name: 'keyword.operator.absolute.roff'},
{
captures: {
1: {patterns: [{include: '#units'}]},
2: {name: 'punctuation.separator.semicolon.roff'}
},
match: '(?:\\G|(?<=^|\\())([CDMPTcimnpstuvz])(;)',
name: 'meta.scaling-indicator.gnu.roff'
}
]
},
'bold-first': {
patterns: [
{
begin: '\\G[ \\t]*(?!")(?=(?:[^\\s\\\\]|\\\\(?!E?").)+)',
end: '(?<![^\\\\]\\\\|^\\\\)(?=\\s|$)|(?=\\\\E?")',
name: 'markup.bold.roff',
patterns: [{include: '#escapes'}]
},
{
captures: {
0: {name: 'string.quoted.double.empty.roff'},
1: {name: 'punctuation.definition.string.begin.roff'},
2: {name: 'punctuation.definition.string.end.roff'}
},
match: '(")(")',
name: 'markup.bold.roff'
},
{
begin: '\\G[ \\t]*(")',
beginCaptures: {
0: {name: 'string.quoted.double.roff'},
1: {name: 'punctuation.definition.string.begin.roff'}
},
contentName: 'string.quoted.double.roff',
end: '((?:"")*)"(?!")|(?<!\\\\)(?:$|(?!R)\\R)|(?=\\\\E?")',
endCaptures: {
0: {name: 'punctuation.definition.string.end.roff'},
1: {
name: 'markup.bold.roff',
patterns: [{include: '#string-escapes'}]
}
},
name: 'markup.bold.roff',
patterns: [{include: '#string-escapes'}]
},
{include: '#escapes'},
{include: '#string'}
]
},
'bold-italic-first': {
patterns: [
{
begin: '\\G[ \\t]*(?!")(?=(?:[^\\s\\\\]|\\\\(?!E?").)+)',
end: '(?<![^\\\\]\\\\|^\\\\)(?=\\s|$)|(?=\\\\E?")',
name: 'markup.bold.italic.roff',
patterns: [{include: '#escapes'}]
},
{
captures: {
0: {name: 'string.quoted.double.empty.roff'},
1: {name: 'punctuation.definition.string.begin.roff'},
2: {name: 'punctuation.definition.string.end.roff'}
},
match: '(")(")',
name: 'markup.bold.italic.roff'
},
{
begin: '\\G[ \\t]*(")',
beginCaptures: {
0: {name: 'string.quoted.double.roff'},
1: {name: 'punctuation.definition.string.begin.roff'}
},
contentName: 'string.quoted.double.roff',
end: '((?:"")*)"(?!")|(?<!\\\\)(?:$|(?!R)\\R)|(?=\\\\E?")',
endCaptures: {
0: {name: 'punctuation.definition.string.end.roff'},
1: {
name: 'markup.bold.italic.roff',
patterns: [{include: '#string-escapes'}]
}
},
name: 'markup.bold.italic.roff',
patterns: [{include: '#string-escapes'}]
},
{include: '#escapes'},
{include: '#string'}
]
},
'bold-italic-word': {
match: '\\S+?(?=\\\\|$|\\s)',
name: 'markup.bold.italic.roff'
},
'bold-word': {match: '\\S+?(?=\\\\|$|\\s)', name: 'markup.bold.roff'},
'bridge-escapes': {
patterns: [
{
begin: '[ \\t]+(\\\\)$(?!R)\\R?',
beginCaptures: {1: {name: 'punctuation.definition.escape.roff'}},
end: '^',
name: 'constant.character.escape.newline.roff'
},
{
begin: '(\\\\)$(?!R)\\R?',
beginCaptures: {1: {name: 'punctuation.definition.escape.roff'}},
end: '^[ \\t]*',
name: 'constant.character.escape.newline.roff'
}
]
},
c0: {
patterns: [
{match: '\\x02', name: 'punctuation.c0.ctrl-char.start-of-text.roff'},
{match: '\\x03', name: 'punctuation.c0.ctrl-char.end-of-text.roff'},
{
match: '\\x04',
name: 'punctuation.c0.ctrl-char.end-of-transmission.roff'
},
{match: '\\x05', name: 'punctuation.c0.ctrl-char.enquiry.roff'},
{match: '\\x06', name: 'punctuation.c0.ctrl-char.acknowledge.roff'},
{match: '\\a', name: 'punctuation.c0.ctrl-char.alarm.bell.roff'},
{match: '\\f', name: 'punctuation.whitespace.form-feed.roff'},
{match: '\\x7F', name: 'punctuation.c0.ctrl-char.delete.roff'}
]
},
'continuous-newline': {
begin: '(\\\\)?(\\\\)$(?!R)\\R?',
beginCaptures: {
0: {name: 'constant.character.escape.newline.roff'},
1: {name: 'punctuation.definition.concealed.escape.backslash.roff'},
2: {name: 'punctuation.definition.escape.roff'}
},
end: "^(?:[.'])?"
},
definition: {
patterns: [
{
begin:
'(?:^|\\G)([.\'])[ \\t]*(?:(do)[ \\t]+)?((?:de|am)i?1?)\\s+(\\S+?)?\\s*(\\\\E?["#].*)?$',
beginCaptures: {
1: {name: 'punctuation.definition.request.roff'},
2: {name: 'entity.function.name.roff'},
3: {name: 'storage.type.function.roff'},
4: {
name: 'entity.name.function.roff',
patterns: [{include: '#escapes'}]
},
5: {patterns: [{include: '#escapes'}]}
},
end: '^(?:[ \\t]*\\x5C{2})?\\.[ \\t]*\\.',
endCaptures: {0: {name: 'punctuation.definition.request.roff'}},
name: 'meta.macro.definition.$3.roff',
patterns: [{include: '$self'}]
},
{
begin:
'(?:^|\\G)([.\'])[ \\t]*(?:(do)[ \\t]+)?((?:de|am)i?1?)\\s+(\\S+)\\s*("[^"]+"?|\\S+?(?=\\s|\\\\E?["#]))?(.*)$',
beginCaptures: {
1: {name: 'punctuation.definition.request.roff'},
2: {name: 'entity.function.name.roff'},
3: {name: 'storage.type.function.roff'},
4: {
name: 'entity.name.function.roff',
patterns: [{include: '#escapes'}]
},
5: {
name: 'keyword.control.terminator.roff',
patterns: [{include: '#string'}]
},
6: {patterns: [{include: '#param-group'}]}
},
end: '^(\\.)[ \\t]*((\\5)(?=$|\\s|\\\\(?:$|")))',
endCaptures: {
1: {name: 'punctuation.definition.request.roff'},
2: {name: 'keyword.control.terminator.roff'},
3: {patterns: [{include: '#string'}]}
},
name: 'meta.macro.definition.with-terminator.$3.roff',
patterns: [{include: '$self'}]
}
]
},
eqn: {
patterns: [
{
match:
'(?x)\\b\n(DELTA|GAMMA|LAMBDA|OMEGA|PHI|PI|PSI|SIGMA|THETA|UPSILON|XI|alpha|beta|chi\n|delta|epsilon|eta|gamma|iota|kappa|lambda|mu|nu|omega|omicron|phi|pi|psi\n|rho|sigma|tau|theta|upsilon|xi|zeta)\\b',
name: 'constant.language.greek-letter.eqn.roff'
},
{
match:
'\\b(and|arc|cos|cosh|det|exp|for|if|Im|lim|ln|log|max|min|Re|sin|sinh|tan|tanh)\\b',
name: 'constant.language.math-function.eqn.roff'
},
{
match:
'(?x)\n(?:[><=!]=|\\+-|->|<-|<<|>>|\\.{3}|,\\.+,|[-+=](?!\\d)|[*/<>])\n|\\b(?:approx|cdot|ceiling|del|grad|half|inf|inter|int|floor\n|nothing|partial|prime|prod|sum|times|union)\\b',
name: 'constant.character.math-symbol.eqn.roff'
},
{
begin: '{',
beginCaptures: {
0: {name: 'punctuation.section.bracket.curly.begin.eqn.roff'}
},
end: '}|(?=\\.EN)',
endCaptures: {
0: {name: 'punctuation.section.bracket.curly.end.eqn.roff'}
},
patterns: [{include: '#eqn'}]
},
{
captures: {
1: {name: 'keyword.operator.spacing.eqn.roff'},
2: {name: 'punctuation.separator.delimiter.comma.eqn.roff'}
},
match: '(~|\\^)|(,)'
},
{
begin: '\\b([nts]?define)\\s*(\\S+)\\s*(\\S)',
beginCaptures: {
1: {name: 'storage.type.function.definition.eqn.roff'},
2: {name: 'entity.name.function.eqn.roff'},
3: {name: 'punctuation.section.definition.begin.eqn.roff'}
},
end: '((?:(?!\\3).)*+)(\\3)|(?=\\.EN)',
endCaptures: {
1: {patterns: [{include: '#eqn'}]},
2: {name: 'punctuation.section.definition.end.eqn.roff'}
},
patterns: [
{
captures: {
1: {name: 'punctuation.section.bracket.curly.begin.eqn.roff'},
2: {patterns: [{include: '#eqn'}, {include: '#main'}]},
3: {name: 'punctuation.section.bracket.curly.end.eqn.roff'}
},
match: '(\\{)([^}]*)(\\})'
},
{include: '#eqn'},
{include: '#main'}
]
},
{
begin: '\\b(ifdef)\\s*(\\S+)\\s*(\\S)',
beginCaptures: {
1: {name: 'keyword.control.flow.if-defined.eqn.roff'},
2: {name: 'entity.name.function.eqn.roff'},
3: {name: 'punctuation.section.definition.begin.eqn.roff'}
},
end: '((?:(?!\\3).)*+)(\\3)|(?=\\.EN)',
endCaptures: {
1: {patterns: [{include: '#eqn'}]},
2: {name: 'punctuation.section.definition.end.eqn.roff'}
},
patterns: [
{
captures: {
1: {name: 'punctuation.section.bracket.curly.begin.eqn.roff'},
2: {patterns: [{include: '#eqn'}, {include: '#main'}]},
3: {name: 'punctuation.section.bracket.curly.end.eqn.roff'}
},
match: '(\\{)([^}]*)(\\})'
},
{include: '#eqn'},
{include: '#main'}
]
},
{
match:
'(?x)\\b\n(above|back|bar|bold|ccol|col|cpile|delim|dot|dotdot|down|dyad|fat|font|from\n|fwd|gfont|gsize|hat|italic|lcol|left|lineup|lpile|mark|matrix|over|pile\n|rcol|right|roman|rpile|size|sqrt|sub|sup|tilde|to|under|up|vec)\\b',
name: 'keyword.language.eqn.roff'
},
{
match:
'(?x)\\b\n(accent|big|chartype|smallover|type|vcenter|uaccent|split|nosplit\n|opprime|special|include|ifdef|undef|g[rb]font|space)\\b',
name: 'keyword.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: 'constant.language.eqn.gnu.roff'
},
{
captures: {
1: {name: 'storage.type.var.eqn.roff'},
2: {name: 'variable.other.mathml.eqn.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',
name: 'meta.set-variable.eqn.gnu.roff'
},
{
match: '(?![\\d\\\\"])[^-,!.{}\\[\\]*/^+<=>~\\s"]+',
name: 'string.unquoted.parameter.eqn.roff'
},
{
captures: {
1: {name: 'constant.language.boolean.logical.true.eqn.roff'},
2: {name: 'constant.language.boolean.logical.false.eqn.roff'}
},
match: '(?<=delim)\\s*(?:(on)|(off))\\b'
},
{include: '#escapes'},
{include: '#number'},
{include: '#string'}
]
},
escapes: {
patterns: [{include: '#escapes-copymode'}, {include: '#escapes-full'}]
},
'escapes-clipped': {
patterns: [
{
begin: '\\\\E?f(?:[I2]|\\(CI|\\[\\s*(?:[I2]|CI)\\s*\\])',
beginCaptures: {0: {patterns: [{include: '#escapes'}]}},
end: '$|(?=\\\\E?f[\\[A-Za-z0-9])',
patterns: [
{include: '#escaped-newline'},
{include: '$self'},
{include: '#italic-word'}
]
},
{
begin: '\\\\E?f(?:[B3]|\\(CB|\\[\\s*(?:[B3]|CB)\\s*\\])',
beginCaptures: {0: {patterns: [{include: '#escapes'}]}},
end: '$|(?=\\\\E?f[\\[A-Za-z0-9])',
patterns: [
{include: '#escaped-newline'},
{include: '$self'},
{include: '#bold-word'}
]
},
{
begin: '\\\\E?f(?:4|\\(BI|\\[\\s*BI\\s*\\])',
beginCaptures: {0: {patterns: [{include: '#escapes'}]}},
end: '$|(?=\\\\E?f[\\[A-Za-z0-9])',
patterns: [
{include: '#escaped-newline'},
{include: '$self'},
{include: '#bold-italic-word'}
]
},
{
begin: '\\\\E?f(?:\\(C[WR]|\\[\\s*C[WR]\\s*\\])',
beginCaptures: {0: {patterns: [{include: '#escapes'}]}},
end: '$|(?=\\\\E?f[\\[A-Za-z0-9])',
patterns: [
{include: '#escaped-newline'},
{include: '$self'},
{include: '#monospace-word'}
]
}
]
},
'escapes-copymode': {
patterns: [
{
match: '(\\\\+?)(?=\\1\\S)',
name: 'punctuation.definition.concealed.escape.backslash.roff'
},
{
begin: '(?:(?:(?<=\\n)\\G|^)(\\.|\'+)\\s*)?(\\\\E?")',
beginCaptures: {
1: {name: 'punctuation.definition.comment.roff'},
2: {name: 'punctuation.definition.comment.roff'}
},
end: '$',
name: 'comment.line.roff'
},
{
begin: "(?:(?:(?<=\\n)\\G|^)(\\.|'+)\\s*)?(\\\\E?#).*$(?!R)\\R?",
beginCaptures: {
1: {name: 'punctuation.definition.comment.roff'},
2: {name: 'punctuation.definition.comment.roff'}
},
end: '^',
name: 'comment.line.number-sign.gnu.roff'
},
{
captures: {1: {name: 'punctuation.definition.comment.roff'}},
match: "(?:(?<=\\n)\\G|^)(\\.|'+)[ \\t]*$",
name: 'comment.empty.roff'
},
{include: '#continuous-newline'},
{include: '#register-expansion'},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))\\\\',
name: 'constant.character.escape.backslash.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))t',
name: 'constant.character.escape.tab.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))a',
name: 'constant.character.escape.leader-char.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))\\.',
name: 'constant.character.escape.dot.roff'
},
{
begin: '((?:((\\\\)E)|(\\\\))\\*(\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.section.begin.bracket.square.roff'}
},
contentName: 'function-call.arguments.roff',
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.interpolate-string.gnu.roff',
patterns: [{include: '#long-name'}]
},
{
captures: {
1: {name: 'entity.name.roff'},
10: {name: 'punctuation.definition.escape.roff'},
11: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]},
7: {name: 'entity.name.roff'},
8: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
9: {name: 'punctuation.definition.escape.roff'}
},
match:
'((?:((\\\\)E)|(\\\\))\\*(\\())(\\S{2})|((?:((\\\\)E)|(\\\\))\\*)(\\S)',
name: 'constant.character.escape.function.interpolate-string.roff'
},
{
captures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'}
},
match: '((?:((\\\\)E)|(\\\\))\\$\\d)',
name: 'constant.character.escape.function.interpolate-argument.roff'
},
{
begin: '((?:((\\\\)E)|(\\\\))[Mm](\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.section.begin.bracket.square.roff'}
},
contentName: 'variable.parameter.roff',
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.set-colour.gnu.roff',
patterns: [{include: '#long-params'}]
},
{
captures: {
1: {name: 'entity.name.roff'},
10: {name: 'punctuation.definition.escape.roff'},
11: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]},
7: {name: 'entity.name.roff'},
8: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
9: {name: 'punctuation.definition.escape.roff'}
},
match:
'((?:((\\\\)E)|(\\\\))[Mm](\\())(\\S{2})|((?:((\\\\)E)|(\\\\))[Mm])(\\S)',
name: 'constant.character.escape.function.set-colour.gnu.roff'
},
{
begin: '((?:((\\\\)E)|(\\\\))s([-+])?(\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'keyword.operator.arithmetic.roff'},
6: {name: 'punctuation.section.begin.bracket.square.roff'}
},
contentName: 'variable.parameter.roff',
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.point-size.gnu.roff',
patterns: [{include: '#long-params'}]
},
{
begin: '((?:((\\\\)E)|(\\\\))s([-+])?)((.))',
beginCaptures: {
1: {name: 'entity.name.function.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'keyword.operator.arithmetic.roff'},
6: {name: 'string.other.roff'},
7: {name: 'punctuation.definition.begin.roff'}
},
contentName: 'variable.parameter.roff',
end: '(\\6)|(?<!\\\\)(?=$)',
endCaptures: {
0: {name: 'string.other.roff'},
1: {name: 'punctuation.definition.end.roff'}
},
name: 'constant.character.escape.function.point-size.gnu.roff',
patterns: [{include: '#escapes'}]
},
{
begin: '((?:((\\\\)E)|(\\\\))(?!s[-+]?\\(?[-+]?\\d)[ABRZ])((.))',
beginCaptures: {
1: {name: 'entity.name.function.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'string.other.roff'},
6: {name: 'punctuation.definition.begin.roff'}
},
contentName: 'string.other.roff',
end: '(\\6)|(?<!\\\\)(?=$)',
endCaptures: {
0: {name: 'string.other.roff'},
1: {name: 'punctuation.definition.end.roff'}
},
name: 'constant.character.escape.function.check-identifier.gnu.roff',
patterns: [{include: '#escapes'}]
},
{
captures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'constant.numeric.roff'}
},
match: '((?:((\\\\)E)|(\\\\))O([0-4]))',
name: 'constant.character.escape.internal.gnu.roff'
},
{
begin: '((?:((\\\\)E)|(\\\\))O(5)(\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'constant.numeric.roff'},
6: {name: 'punctuation.section.begin.bracket.square.roff'}
},
contentName: 'string.unquoted.filename.roff',
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.internal.stderr-write-file.gnu.roff',
patterns: [{include: '#escapes'}]
},
{
begin: '((?:((\\\\)E)|(\\\\))[VY](\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.section.begin.bracket.square.roff'}
},
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.interpolate-variable.gnu.roff',
patterns: [{include: '#long-name'}]
},
{
captures: {
1: {name: 'entity.name.roff'},
10: {name: 'punctuation.definition.escape.roff'},
11: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]},
7: {name: 'entity.name.roff'},
8: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
9: {name: 'punctuation.definition.escape.roff'}
},
match:
'((?:((\\\\)E)|(\\\\))[VY](\\())(\\S{2})|((?:((\\\\)E)|(\\\\))[VY])(\\S)',
name: 'constant.character.escape.function.interpolate-variable.gnu.roff'
},
{
captures: {
1: {
name: 'constant.character.escape.embed-diversion.start.gnu.roff'
},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.script.roff'},
6: {
name: 'string.interpolated.roff',
patterns: [{include: '$self'}]
},
7: {
name: 'constant.character.escape.embed-diversion.start.gnu.roff'
},
8: {name: 'punctuation.definition.escape.roff'},
9: {name: 'punctuation.definition.script.roff'}
},
match: '((?:((\\\\)E)|(\\\\))(\\?))(.*?)((\\\\)(\\?))'
},
{
captures: {
1: {name: 'variable.language.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'}
},
match: '((?:((\\\\)E)|(\\\\))\\$[*@^])',
name: 'constant.character.escape.function.concatenated-arguments.gnu.roff'
},
{
captures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'variable.parameter.roff'}
},
match: '((?:((\\\\)E)|(\\\\))\\$(\\())(\\S{2})',
name: 'constant.character.escape.function.interpolate-argument.gnu.roff'
},
{
begin: '((?:((\\\\)E)|(\\\\))\\$(\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.section.begin.bracket.square.roff'}
},
contentName: 'variable.parameter.roff',
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.interpolate-argument.gnu.roff',
patterns: [{include: '#long-name'}]
},
{include: '#c0'}
]
},
'escapes-full': {
patterns: [
{
captures: {1: {name: 'punctuation.definition.escape.roff'}},
match: '(\\\\)E?e',
name: 'constant.character.escape.current-escape-char.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))´',
name: 'constant.character.escape.acute-accent.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))`',
name: 'constant.character.escape.grave-accent.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))-',
name: 'constant.character.escape.minus.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\)) ',
name: 'constant.character.escape.space.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))0',
name: 'constant.character.escape.space.digit-width.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))\\|',
name: 'constant.character.escape.space.one-sixth-em.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))\\^',
name: 'constant.character.escape.space.one-twelfth-em.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))&',
name: 'constant.character.escape.zero-width-marker.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))%',
name: 'constant.character.escape.hyphenation-char.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))c',
name: 'constant.character.escape.connect.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))d',
name: 'constant.character.escape.downwards.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))p',
name: 'constant.character.escape.spread-line.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))r',
name: 'constant.character.escape.reverse.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))u',
name: 'constant.character.escape.upwards.roff'
},
{
captures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.brace.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'variable.parameter.roff', patterns: [{include: '#c0'}]}
},
match: '(?:((\\\\)E)|(\\\\))(\\()(\\S{2})',
name: 'constant.character.escape.function.named-char.roff'
},
{
begin: '(?:((\\\\)E)|(\\\\))(\\[)',
beginCaptures: {
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.section.begin.bracket.square.roff'}
},
end: '(\\S*?)(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {patterns: [{include: '#long-params'}]},
2: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.named-char.gnu.roff',
patterns: [
{include: '#long-params'},
{
match: '(?:[^\\s\\]\\\\]|\\\\(?!E?["#]).)+',
name: 'variable.parameter.roff'
}
]
},
{
captures: {
1: {name: 'punctuation.definition.request.roff'},
2: {name: 'constant.character.escape.conditional.block.roff'},
3: {name: 'punctuation.section.conditional.begin.roff'}
},
match: "(?:(?:^|\\G)(\\.|'+)[ \\t]*)?(\\\\\\{(?:\\\\(?=(?!R)\\R|$))?)"
},
{
captures: {
1: {name: 'punctuation.definition.request.roff'},
2: {name: 'constant.character.escape.conditional.block.roff'},
3: {name: 'punctuation.section.conditional.end.roff'}
},
match:
"(?:(?:^|\\G)(\\.|'+)[ \\t]*)?((\\\\\\}(?:\\\\(?=(?!R)\\R|$))?))"
},
{
begin: '((?:((\\\\)E)|(\\\\))X)(.)',
beginCaptures: {
1: {name: 'entity.name.function.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {
name: 'punctuation.section.embedded.begin.roff',
patterns: [{include: '#c0'}]
}
},
end: '(.*?)(?:(\\5)|(?<!\\\\)(?=$))',
endCaptures: {
1: {
name: 'source.embedded.ditroff',
patterns: [{include: 'source.ditroff#xCommands'}]
},
2: {
name: 'punctuation.section.embedded.end.roff',
patterns: [{include: '#c0'}]
}
},
name: 'meta.device-control.roff',
patterns: [
{
captures: {
0: {patterns: [{include: 'source.ditroff#xCommands'}]}
},
match: '.+',
name: 'source.embedded.ditroff'
},
{include: '#escapes'}
]
},
{
begin: '((?:((\\\\)E)|(\\\\))[bCDhHSlLovwxXN])((.))',
beginCaptures: {
1: {name: 'entity.name.function.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'string.other.roff'},
6: {
name: 'punctuation.definition.begin.roff',
patterns: [{include: '#c0'}]
}
},
contentName: 'string.other.roff',
end: '(\\6)|(?<!\\\\)(?=$)',
endCaptures: {
0: {name: 'string.other.roff'},
1: {
name: 'punctuation.definition.end.roff',
patterns: [{include: '#c0'}]
}
},
name: 'constant.character.escape.function.roff',
patterns: [{include: '#escapes'}]
},
{
begin: '(?:((\\\\)E)|(\\\\))!',
beginCaptures: {
0: {name: 'constant.character.escape.transparent-line.roff'},
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
end: '(?<!\\\\)$',
name: 'meta.throughput.roff',
patterns: [{include: '#escapes-copymode'}]
},
{
captures: {
0: {name: 'entity.name.roff'},
1: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
2: {name: 'punctuation.definition.escape.roff'},
3: {name: 'punctuation.definition.escape.roff'}
},
match: '(?:((\\\\)E)|(\\\\))f[RP1]',
name: 'constant.character.escape.font.roff'
},
{
begin:
'((?:((\\\\)E)|(\\\\))f(?:[I2]|(\\()CI|(\\[)\\s*(?:[I2]|CI)\\s*(\\])))',
beginCaptures: {
0: {name: 'constant.character.escape.font.roff'},
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.section.begin.bracket.square.roff'},
6: {name: 'punctuation.section.end.bracket.square.roff'}
},
end: "(?=\\\\E?f[\\[A-Za-z0-9])|^(?=[.']\\s*(?:(?:SH|SS|P|[HILPT]P|di)\\b)|\\.)",
patterns: [{include: '$self'}, {include: '#italic-word'}]
},
{
begin:
'((?:((\\\\)E)|(\\\\))f(?:[B3]|(\\()CB|(\\[)\\s*(?:[B3]|CB)\\s*(\\])))',
beginCaptures: {
0: {name: 'constant.character.escape.font.roff'},
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'punctuation.section.begin.bracket.square.roff'},
7: {name: 'punctuation.section.end.bracket.square.roff'}
},
end: "(?=\\\\E?f[\\[A-Za-z0-9])|^(?=[.']\\s*(?:(?:SH|SS|P|[HILPT]P|di)\\b)|\\.)",
patterns: [{include: '$self'}, {include: '#bold-word'}]
},
{
begin: '((?:((\\\\)E)|(\\\\))f(?:4|(\\()BI|(\\[)\\s*BI\\s*(\\])))',
beginCaptures: {
0: {name: 'constant.character.escape.font.roff'},
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'punctuation.section.begin.bracket.square.roff'},
7: {name: 'punctuation.section.end.bracket.square.roff'}
},
end: "(?=\\\\E?f[\\[A-Za-z0-9])|^(?=[.']\\s*(?:(?:SH|SS|P|[HILPT]P|di)\\b)|\\.)",
patterns: [{include: '$self'}, {include: '#bold-italic-word'}]
},
{
begin:
'((?:((\\\\)E)|(\\\\))f(?:(\\()C[WR]|(\\[)\\s*C[WR]\\s*(\\])))',
beginCaptures: {
0: {name: 'constant.character.escape.font.roff'},
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.definition.brace.roff'},
6: {name: 'punctuation.section.begin.bracket.square.roff'},
7: {name: 'punctuation.section.end.bracket.square.roff'}
},
end: "(?=\\\\E?f[\\[A-Za-z0-9])|^(?=[.']\\s*(?:(?:SH|SS|P|[HILPT]P|di)\\b)|\\.)",
patterns: [{include: '$self'}, {include: '#monospace-word'}]
},
{
begin: '((?:((\\\\)E)|(\\\\))[Ff](\\[))',
beginCaptures: {
1: {name: 'entity.name.roff'},
2: {name: 'constant.character.escape.current-escape-char.gnu.roff'},
3: {name: 'punctuation.definition.escape.roff'},
4: {name: 'punctuation.definition.escape.roff'},
5: {name: 'punctuation.section.begin.bracket.square.roff'}
},
contentName: 'variable.parameter.roff',
end: '(\\])|(?<!\\\\)(?=$)',
endCaptures: {
1: {name: 'punctuation.section.end.bracket.square.roff'}
},
name: 'constant.character.escape.function.font.gnu.roff',
patterns: [{include: '#escapes'}]
},
{
captures: {
1: {name