From bb25111ca9ccb08d9d383b2bd7f816b3c6a105e7 Mon Sep 17 00:00:00 2001 From: Keith Hall Date: Wed, 14 Oct 2020 22:20:14 +0300 Subject: [PATCH] Improve Manpage syntax --- .../syntaxes/02_Extra/Manpage.sublime-syntax | 137 ++++++++-- assets/syntaxes/02_Extra/syntax_test_man.man | 103 ++++++++ .../highlighted/Manpage/bat-0.16.man | 243 ++++++++++++++++++ .../syntax-tests/source/Manpage/bat-0.16.man | 243 ++++++++++++++++++ 4 files changed, 702 insertions(+), 24 deletions(-) create mode 100644 assets/syntaxes/02_Extra/syntax_test_man.man create mode 100644 tests/syntax-tests/highlighted/Manpage/bat-0.16.man create mode 100644 tests/syntax-tests/source/Manpage/bat-0.16.man diff --git a/assets/syntaxes/02_Extra/Manpage.sublime-syntax b/assets/syntaxes/02_Extra/Manpage.sublime-syntax index e99c2497..121f6ab0 100644 --- a/assets/syntaxes/02_Extra/Manpage.sublime-syntax +++ b/assets/syntaxes/02_Extra/Manpage.sublime-syntax @@ -7,47 +7,136 @@ file_extensions: scope: source.man variables: - section_heading: '^\S.*$' + section_heading: '^(?!#)\S.*$' + command_line_option: '(--?[A-Za-z0-9][_A-Za-z0-9-]*)' contexts: + prototype: + # ignore syntax test lines + - match: '^#' + push: + - meta_scope: comment.syntax-test.man + - match: $\n? + pop: true main: - match: ^ push: first_line first_line: - - match: '([A-Z0-9_\-]+)(\()([^)]+)(\))' + - match: '([A-Z0-9_\-]+)(\()([^)]+)(\))\s*' captures: - 1: meta.preprocessor - 2: keyword.operator - 3: string.quoted.other - 4: keyword.operator + 1: meta.preprocessor.man + 2: keyword.operator.man + 3: string.quoted.other.man + 4: keyword.operator.man + push: + - match: (?:[\w'-]+|\s(?!\s)) + scope: markup.heading.title.man + - match: \s\s + pop: true + - match: '(?=\S)' + pop: true - match: '$' push: body body: - - match: '^(SYNOPSIS|SYNTAX|SINTASSI|SKŁADNIA|СИНТАКСИС|書式)' - push: Packages/C/C.sublime-syntax - scope: markup.heading - with_prototype: - - match: '(?={{section_heading}})' - pop: true + # English, ..., ..., ..., Russian, ... - - match: '^\S.*$' - scope: markup.heading + - match: '^(?:SYNOPSIS|SYNTAX|SINTASSI|SKŁADNIA|СИНТАКСИС|書式)' + scope: markup.heading.synopsis.man + embed: synopsis + escape: '(?={{section_heading}})' + + - match: '{{section_heading}}' + scope: markup.heading.other.man + embed: options # some man pages put command line options under the description heading + escape: '(?={{section_heading}})' + + - include: function-call + + function-call: - match: '\b([A-Za-z0-9_\-]+)(\()([^)]*)(\))' captures: - 1: entity.name.function - 2: keyword.operator - 3: constant.numeric - 4: keyword.operator + 1: entity.name.function.man + 2: keyword.operator.man + 3: constant.numeric.man + 4: keyword.operator.man + options: # command-line options like --option=value, --some-flag, or -x - - match: '(?:[^a-zA-Z0-9_-]|^|\s)(--?[A-Za-z0-9][A-Za-z0-9-]*)(?:(=)?("?)([A-Za-z0-9]+)("?))?' + - match: '^[ ]{7}(?=-)' + push: expect-command-line-option + - match: '(?:[^a-zA-Z0-9_-]|^|\s){{command_line_option}}' captures: - 1: entity.name - 2: keyword.operator - 3: punctuation.definition.string.begin - 4: variable.parameter - 3: punctuation.definition.string.end + 1: entity.name.command-line-option + push: + - match: '=' + scope: keyword.operator.man + set: + - match: '[^],.() ]+' + scope: variable.parameter.man + pop: true + - match: $ + pop: true + - match: '' + pop: true + - include: function-call + + expect-command-line-option: + - match: '[A-Za-z0-9-]+' + scope: entity.name.command-line-option.man + - match: '(\[)(=)' + captures: + 2: keyword.operator.man + push: expect-parameter + - match: '\[' + push: + - meta_scope: entity.name.command-line-option.man + - match: '\]' + pop: true + - match: '=' + scope: keyword.operator.man + push: expect-parameter + - match: (?=.*\.) + pop: true + - match: '\s' + push: expect-parameter + - match: '(,)\s*' + captures: + 1: punctuation.separator.man + - match: $|(?=\]) + pop: true + + expect-parameter: + - match: '[A-Za-z0-9-]+' + scope: variable.parameter.man + - match: \| + scope: keyword.operator.logical.man + - match: '$|(?=[],]|{{command_line_option}})' + pop: true + + synopsis: + #- include: scope:source.c + - match: \[ + scope: punctuation.section.brackets.begin.man + push: command-line-option-or-pipe + - include: options + + command-line-option-or-pipe: + - match: (\|)\s* + captures: + 1: keyword.operator.logical.man + #- match: (?={{command_line_option}}) + - match: (?=-) + push: + - match: (?=\s*\|) + pop: true + - include: expect-command-line-option + - match: \] + scope: punctuation.section.brackets.end.man + pop: true + - match: \[ + scope: punctuation.section.brackets.begin.man + push: command-line-option-or-pipe diff --git a/assets/syntaxes/02_Extra/syntax_test_man.man b/assets/syntaxes/02_Extra/syntax_test_man.man new file mode 100644 index 00000000..54c052a5 --- /dev/null +++ b/assets/syntaxes/02_Extra/syntax_test_man.man @@ -0,0 +1,103 @@ +# SYNTAX TEST "Manpage.sublime-syntax" +SOMETHING(8) System Manager's Manual SOMETHING(8) +# ^^^^^ meta.preprocessor +# ^^^^^^^^^^^^^^^^^^^^^^^ markup.heading.title +# ^^^^^^^ meta.preprocessor + +NAME +#^^^ markup.heading.title + example - do something useful + +SYNOPSIS + example [options] [--home DIR] [--shell SHELL] [--no-create-home] +# ^ punctuation.section.brackets.begin +# ^^^^^^ entity.name.command-line-option +# ^^^ variable.parameter +# ^ punctuation.section.brackets.end +# ^ punctuation.section.brackets.begin +# ^^^^^^^ entity.name.command-line-option +# ^^^^^ variable.parameter +# ^ punctuation.section.brackets.end +# ^ punctuation.section.brackets.begin +# ^^^^^^^^^^^^^^^^ entity.name.command-line-option +# ^ punctuation.section.brackets.end + + example --system [options] +# ^^^^^^^^ entity.name + + COMMON OPTIONS + [--quiet] [--debug] [--help|-h] [--version] [--conf FILE] + +DESCRIPTION + example does something useful in relation to the command line options + and configuration information in /etc/example.conf. + +OPTIONS + --conf FILE +# ^^^^^^ entity.name.command-line-option +#^^^^^^ - variable - entity - markup +# ^^^^ variable.parameter + Use FILE instead of /etc/example.conf. +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable - entity + + --disabled-login + Do not run passwd to set the password. The user won't be able + to use her account until the password is set. + + --disabled-password + Like --disabled-login, but logins are still possible (for exam- +# ^^^^^^^^^^^^^^^^ entity.name +#^^^^^^^^^^^^^^^^^^ - entity - variable - markup +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - entity - variable - markup + ple using SSH RSA keys) but not using password authentication. + + --help Display brief instructions. +# ^^^^^^ entity.name.command-line-option +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - variable.parameter + + --home DIR +# ^^^^^^ entity.name.command-line-option +# ^^^ variable.parameter +# ^ - variable - entity - markup + Use DIR as the user's home directory, rather than the default + specified by the configuration file. If the directory does not + exist, it is created and skeleton files are copied. + + --[no-]signed, --signed=(true|false|if-asked) +# ^^^^^^^^^^^^^ entity.name.command-line-option +# ^ punctuation.separator +# ^^^^^^^^ entity.name.command-line-option +# ^ keyword.operator +# ^ - variable +# ^^^^ variable.parameter +# ^ keyword.operator.logical +# ^^^^^ variable.parameter +# ^ keyword.operator.logical +# ^^^^^^^^ variable.parameter +# ^ - variable + --no-recurse-submodules, --recurse-submodules=check|on-demand|only|no +# ^^^^^^^^^^^^^^^^^^^^^^^ entity.name.command-line-option +# ^ punctuation.separator +# ^^^^^^^^^^^^^^^^^^^^ entity.name.command-line-option +# ^ keyword.operator +# ^^^^^ variable.parameter +# ^ keyword.operator.logical +# ^^^^^^^^^ variable.parameter +# ^ keyword.operator.logical +# ^^^^ variable.parameter +# ^ keyword.operator.logical +# ^^ variable.parameter + May be used to make sure all submodule commits used by the + + -c, -C NUM, --context[=NUM] +# ^^ entity.name.command-line-option +# ^ punctuation.separator +# ^^ entity.name.command-line-option +# ^^^ variable.parameter +# ^ punctuation.separator +# ^^^^^^^^^ entity.name.command-line-option +# ^^^^^^^ - entity.name +# ^ keyword.operator +# ^^^ variable.parameter +# ^^ - variable + output NUM (default 3) lines of copied context diff --git a/tests/syntax-tests/highlighted/Manpage/bat-0.16.man b/tests/syntax-tests/highlighted/Manpage/bat-0.16.man new file mode 100644 index 00000000..921fe261 --- /dev/null +++ b/tests/syntax-tests/highlighted/Manpage/bat-0.16.man @@ -0,0 +1,243 @@ +BAT(1) General Commands Manual BAT(1) + +NAME + bat - a cat(1) clone with syntax highlighting and Git integration. + +USAGE + bat [OPTIONS] [FILE]... + + bat cache [CACHE-OPTIONS] [--build|--clear] + +DESCRIPTION + bat prints the syntax-highlighted content of a collection of FILEs to + the terminal. If no FILE is specified, or when FILE is '-', it reads + from standard input. + + bat supports a large number of programming and markup languages. It + also communicates with git(1) to show modifications with respect to the + git index. bat automatically pipes its output through a pager (by de‐ + fault: less). + + Whenever the output of bat goes to a non-interactive terminal, i.e. + when the output is piped into another process or into a file, bat will + act as a drop-in replacement for cat(1) and fall back to printing the + plain file contents. + +OPTIONS + General remarks: Command-line options like '-l'/'--language' that take + values can be specified as either '--language value', '--lan‐ + guage=value', '-l value' or '-lvalue'. + + -A, --show-all + + Show non-printable characters like space, tab or newline. Use + '--tabs' to control the width of the tab-placeholders. + + -p, --plain + + Only show plain style, no decorations. This is an alias for + '--style=plain'. When '-p' is used twice ('-pp'), it also dis‐ + ables automatic paging (alias for '--style=plain + --pager=never'). + + -l, --language <language> + + Explicitly set the language for syntax highlighting. The lan‐ + guage can be specified as a name (like 'C++' or 'LaTeX') or pos‐ + sible file extension (like 'cpp', 'hpp' or 'md'). Use + '--list-languages' to show all supported language names and file + extensions. + + -H, --highlight-line ... + + Highlight the specified line ranges with a different background + color For example: + + --highlight-line 40 + highlights line 40 + + --highlight-line 30:40 + highlights lines 30 to 40 + + --highlight-line :40 + highlights lines 1 to 40 + + --highlight-line 40: + highlights lines 40 to the end of the file + + --tabs <T> + + Set the tab width to T spaces. Use a width of 0 to pass tabs + through directly + + --wrap <mode> + + Specify the text-wrapping mode (*auto*, never, character). The + '--terminal-width' option can be used in addition to control the + output width. + + --terminal-width <width> + + Explicitly set the width of the terminal instead of determining + it automatically. If prefixed with '+' or '-', the value will be + treated as an offset to the actual terminal width. See also: + '--wrap'. + + -n, --number + + Only show line numbers, no other decorations. This is an alias + for '--style=numbers' + + --color <when> + + Specify when to use colored output. The automatic mode only en‐ + ables colors if an interactive terminal is detected. Possible + values: *auto*, never, always. + + --italic-text <when> + + Specify when to use ANSI sequences for italic text in the out‐ + put. Possible values: always, *never*. + + --decorations <when> + + Specify when to use the decorations that have been specified via + '--style'. The automatic mode only enables decorations if an in‐ + teractive terminal is detected. Possible values: *auto*, never, + always. + + -f, --force-colorization + + Alias for '--decorations=always --color=always'. This is useful + if the output of bat is piped to another program, but you want + to keep the colorization/decorations. + + --paging <when> + + Specify when to use the pager. To disable the pager, use '--pag‐ + ing=never' or its alias, -P. To disable the pager permanently, + set BAT_PAGER to an empty string. To control which pager is + used, see the '--pager' option. Possible values: *auto*, never, + always. + + --pager <command> + + Determine which pager is used. This option will override the + PAGER and BAT_PAGER environment variables. The default pager is + 'less'. To control when the pager is used, see the '--paging' + option. Example: '--pager "less -RF"'. + + -m, --map-syntax ... + + Map a glob pattern to an existing syntax name. The glob pattern + is matched on the full path and the filename. For example, to + highlight *.build files with the Python syntax, use -m + '*.build:Python'. To highlight files named '.myignore' with the + Git Ignore syntax, use -m '.myignore:Git Ignore'. + + --theme <theme> + + Set the theme for syntax highlighting. Use '--list-themes' to + see all available themes. To set a default theme, add the + '--theme="..."' option to the configuration file or export the + BAT_THEME environment variable (e.g.: export BAT_THEME="..."). + + --list-themes + + Display a list of supported themes for syntax highlighting. + + --style <style-components> + + Configure which elements (line numbers, file headers, grid bor‐ + ders, Git modifications, ..) to display in addition to the file + contents. The argument is a comma-separated list of components + to display (e.g. 'numbers,changes,grid') or a pre-defined style + ('full'). To set a default style, add the '--style=".."' option + to the configuration file or export the BAT_STYLE environment + variable (e.g.: export BAT_STYLE=".."). Possible values: *auto*, + full, plain, changes, header, grid, numbers, snip. + + -r, --line-range ... + + Only print the specified range of lines for each file. For exam‐ + ple: + + --line-range 30:40 + prints lines 30 to 40 + + --line-range :40 + prints lines 1 to 40 + + --line-range 40: + prints lines 40 to the end of the file + + -L, --list-languages + + Display a list of supported languages for syntax highlighting. + + -u, --unbuffered + + This option exists for POSIX-compliance reasons ('u' is for 'un‐ + buffered'). The output is always unbuffered - this option is + simply ignored. + + -h, --help + + Print this help message. + + -V, --version + + Show version information. + +POSITIONAL ARGUMENTS + ... + + Files to print and concatenate. Use a dash ('-') or no argument + at all to read from standard input. + +SUBCOMMANDS + cache - Modify the syntax-definition and theme cache. + +FILES + bat can also be customized with a configuration file. The location of + the file is dependent on your operating system. To get the default path + for your system, call: + + bat --config-file + + Alternatively, you can use the BAT_CONFIG_PATH environment variable to + point bat to a non-default location of the configuration file. + +ADDING CUSTOM LANGUAGES + bat supports Sublime Text .sublime-syntax language files, and can be + customized to add additional languages to your local installation. To + do this, add the .sublime-snytax language files to `$(bat --config- + dir)/syntaxes` and run `bat cache --build`. + + Example: + + mkdir -p "$(bat --config-dir)/syntaxes" + cd "$(bat --config-dir)/syntaxes" + + # Put new '.sublime-syntax' language definition files + # in this folder (or its subdirectories), for example: + git clone https://github.com/tellnobody1/sublime-purescript-syntax + + # And then build the cache. + bat cache --build + + Once the cache is built, the new language will be visible in `bat + --list-languages`. + If you ever want to remove the custom languages, you can clear the + cache with `bat cache --clear`. + +ADDING CUSTOM THEMES + Similarly to custom languages, bat supports Sublime Text .tmTheme + themes. These can be installed to `$(bat --config-dir)/themes`, and + are added to the cache with `bat cache --build`. + +MORE INFORMATION + For more information and up-to-date documentation, visit the bat repo: + https://github.com/sharkdp/bat + + BAT(1) diff --git a/tests/syntax-tests/source/Manpage/bat-0.16.man b/tests/syntax-tests/source/Manpage/bat-0.16.man new file mode 100644 index 00000000..05281dde --- /dev/null +++ b/tests/syntax-tests/source/Manpage/bat-0.16.man @@ -0,0 +1,243 @@ +BAT(1) General Commands Manual BAT(1) + +NAME + bat - a cat(1) clone with syntax highlighting and Git integration. + +USAGE + bat [OPTIONS] [FILE]... + + bat cache [CACHE-OPTIONS] [--build|--clear] + +DESCRIPTION + bat prints the syntax-highlighted content of a collection of FILEs to + the terminal. If no FILE is specified, or when FILE is '-', it reads + from standard input. + + bat supports a large number of programming and markup languages. It + also communicates with git(1) to show modifications with respect to the + git index. bat automatically pipes its output through a pager (by de‐ + fault: less). + + Whenever the output of bat goes to a non-interactive terminal, i.e. + when the output is piped into another process or into a file, bat will + act as a drop-in replacement for cat(1) and fall back to printing the + plain file contents. + +OPTIONS + General remarks: Command-line options like '-l'/'--language' that take + values can be specified as either '--language value', '--lan‐ + guage=value', '-l value' or '-lvalue'. + + -A, --show-all + + Show non-printable characters like space, tab or newline. Use + '--tabs' to control the width of the tab-placeholders. + + -p, --plain + + Only show plain style, no decorations. This is an alias for + '--style=plain'. When '-p' is used twice ('-pp'), it also dis‐ + ables automatic paging (alias for '--style=plain + --pager=never'). + + -l, --language + + Explicitly set the language for syntax highlighting. The lan‐ + guage can be specified as a name (like 'C++' or 'LaTeX') or pos‐ + sible file extension (like 'cpp', 'hpp' or 'md'). Use + '--list-languages' to show all supported language names and file + extensions. + + -H, --highlight-line ... + + Highlight the specified line ranges with a different background + color For example: + + --highlight-line 40 + highlights line 40 + + --highlight-line 30:40 + highlights lines 30 to 40 + + --highlight-line :40 + highlights lines 1 to 40 + + --highlight-line 40: + highlights lines 40 to the end of the file + + --tabs + + Set the tab width to T spaces. Use a width of 0 to pass tabs + through directly + + --wrap + + Specify the text-wrapping mode (*auto*, never, character). The + '--terminal-width' option can be used in addition to control the + output width. + + --terminal-width + + Explicitly set the width of the terminal instead of determining + it automatically. If prefixed with '+' or '-', the value will be + treated as an offset to the actual terminal width. See also: + '--wrap'. + + -n, --number + + Only show line numbers, no other decorations. This is an alias + for '--style=numbers' + + --color + + Specify when to use colored output. The automatic mode only en‐ + ables colors if an interactive terminal is detected. Possible + values: *auto*, never, always. + + --italic-text + + Specify when to use ANSI sequences for italic text in the out‐ + put. Possible values: always, *never*. + + --decorations + + Specify when to use the decorations that have been specified via + '--style'. The automatic mode only enables decorations if an in‐ + teractive terminal is detected. Possible values: *auto*, never, + always. + + -f, --force-colorization + + Alias for '--decorations=always --color=always'. This is useful + if the output of bat is piped to another program, but you want + to keep the colorization/decorations. + + --paging + + Specify when to use the pager. To disable the pager, use '--pag‐ + ing=never' or its alias, -P. To disable the pager permanently, + set BAT_PAGER to an empty string. To control which pager is + used, see the '--pager' option. Possible values: *auto*, never, + always. + + --pager + + Determine which pager is used. This option will override the + PAGER and BAT_PAGER environment variables. The default pager is + 'less'. To control when the pager is used, see the '--paging' + option. Example: '--pager "less -RF"'. + + -m, --map-syntax ... + + Map a glob pattern to an existing syntax name. The glob pattern + is matched on the full path and the filename. For example, to + highlight *.build files with the Python syntax, use -m + '*.build:Python'. To highlight files named '.myignore' with the + Git Ignore syntax, use -m '.myignore:Git Ignore'. + + --theme + + Set the theme for syntax highlighting. Use '--list-themes' to + see all available themes. To set a default theme, add the + '--theme="..."' option to the configuration file or export the + BAT_THEME environment variable (e.g.: export BAT_THEME="..."). + + --list-themes + + Display a list of supported themes for syntax highlighting. + + --style + + Configure which elements (line numbers, file headers, grid bor‐ + ders, Git modifications, ..) to display in addition to the file + contents. The argument is a comma-separated list of components + to display (e.g. 'numbers,changes,grid') or a pre-defined style + ('full'). To set a default style, add the '--style=".."' option + to the configuration file or export the BAT_STYLE environment + variable (e.g.: export BAT_STYLE=".."). Possible values: *auto*, + full, plain, changes, header, grid, numbers, snip. + + -r, --line-range ... + + Only print the specified range of lines for each file. For exam‐ + ple: + + --line-range 30:40 + prints lines 30 to 40 + + --line-range :40 + prints lines 1 to 40 + + --line-range 40: + prints lines 40 to the end of the file + + -L, --list-languages + + Display a list of supported languages for syntax highlighting. + + -u, --unbuffered + + This option exists for POSIX-compliance reasons ('u' is for 'un‐ + buffered'). The output is always unbuffered - this option is + simply ignored. + + -h, --help + + Print this help message. + + -V, --version + + Show version information. + +POSITIONAL ARGUMENTS + ... + + Files to print and concatenate. Use a dash ('-') or no argument + at all to read from standard input. + +SUBCOMMANDS + cache - Modify the syntax-definition and theme cache. + +FILES + bat can also be customized with a configuration file. The location of + the file is dependent on your operating system. To get the default path + for your system, call: + + bat --config-file + + Alternatively, you can use the BAT_CONFIG_PATH environment variable to + point bat to a non-default location of the configuration file. + +ADDING CUSTOM LANGUAGES + bat supports Sublime Text .sublime-syntax language files, and can be + customized to add additional languages to your local installation. To + do this, add the .sublime-snytax language files to `$(bat --config- + dir)/syntaxes` and run `bat cache --build`. + + Example: + + mkdir -p "$(bat --config-dir)/syntaxes" + cd "$(bat --config-dir)/syntaxes" + + # Put new '.sublime-syntax' language definition files + # in this folder (or its subdirectories), for example: + git clone https://github.com/tellnobody1/sublime-purescript-syntax + + # And then build the cache. + bat cache --build + + Once the cache is built, the new language will be visible in `bat + --list-languages`. + If you ever want to remove the custom languages, you can clear the + cache with `bat cache --clear`. + +ADDING CUSTOM THEMES + Similarly to custom languages, bat supports Sublime Text .tmTheme + themes. These can be installed to `$(bat --config-dir)/themes`, and + are added to the cache with `bat cache --build`. + +MORE INFORMATION + For more information and up-to-date documentation, visit the bat repo: + https://github.com/sharkdp/bat + + BAT(1)