diff options
author | David Peter <sharkdp@users.noreply.github.com> | 2020-10-30 19:36:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-30 19:36:27 +0100 |
commit | 3a612f063eb157a35b4d09d4dcf2b04ed1604388 (patch) | |
tree | a1128b792bde1ea9051e6e60c9efc555f6755ea6 | |
parent | 9daea73bbab6e3f4ad6761bcf9702cc7a9811489 (diff) | |
parent | 8e8131590ca9922c996c33ad7a5076f57a619e42 (diff) |
Merge branch 'master' into master
51 files changed, 2083 insertions, 65 deletions
diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index 5ff77927..19d4e927 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -58,6 +58,11 @@ jobs: with: command: test args: --release + - name: Run ignored-by-default unit tests with new syntaxes and themes + uses: actions-rs/cargo@v1 + with: + command: test + args: --release -- --ignored - name: Syntax highlighting regression test run: tests/syntax-tests/regression_test.sh - name: List of languages diff --git a/.gitmodules b/.gitmodules index e00573c6..4981c20e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -200,3 +200,9 @@ [submodule "assets/syntaxes/02_Extra/Ninja"] path = assets/syntaxes/02_Extra/Ninja url = https://github.com/pope/SublimeNinja.git +[submodule "assets/syntaxes/02_Extra/Svelte"] + path = assets/syntaxes/02_Extra/Svelte + url = https://github.com/corneliusio/svelte-sublime +[submodule "assets/themes/Coldark"] + path = assets/themes/Coldark + url = https://github.com/ArmandPhilippot/coldark-bat.git
\ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0971c859..478324c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ # unreleased -- Add Note to refer to see detailed help with --help (and vice versa with -h). see #1215 (@henil) ## Features @@ -8,14 +7,22 @@ ## Bugfixes +- Throws an error when `bat` is being used as `pager`, see #1343 (@adrian-rivera) + ## Other +- Add note to refer to see detailed help with `--help` (and vice versa with `-h`), see #1215 (@henil) +- Add a `Contributors` section to `README`, see #1348 (@adrian-rivera) + ## Syntaxes - Manpage syntax highlighting has been improved, see #1315 (@keith-hall) +- Add Svelte file syntax, see #1285 (@kjmph) ## New themes +- Coldark, see #1329 (@armandphilippot) + ## `bat` as a library ## Packaging diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..dca1d0f3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,48 @@ +# Contributing + +Thank you for considering to contribute to `bat`! + + + +## Add an entry to the changelog + +If your contribution changes the behavior of `bat` (as opposed to a typo-fix +in the documentation), please update the [`CHANGELOG.md`](CHANGELOG.md) file +and describe your changes. This makes the release proess much easier and +therefore helps to get your changes into a new `bat` release faster. + +The top of the `CHANGELOG` contains a *"unreleased"* section with a few +subsections (Features, Bugfixes, …). Please add your entry to the subsection +that best describes your change + +Entries follow this format: +``` +- Short description of what has been changed, see #123 (@user) +``` +Here, `#123` is the number of the original issue and/or your pull request. +Please replace `@user` by your GitHub username. + + +## Development + +Please check out the [Development](https://github.com/sharkdp/bat#development) +section in the README. + + +## Adding a new feature + +Please consider opening a +[feature request ticket](https://github.com/sharkdp/bat/issues/new?assignees=&labels=feature-request&template=feature_request.md) +first in order to give us a chance to discuss the feature first. + + +## Adding new syntaxes/languages or themes + +Before you make a pull request that adds a new syntax or theme, please read +the [Customization](https://github.com/sharkdp/bat#customization) section +in the README first. + +If you really think that a particular syntax or theme should be added for all +users, please read the corresponding +[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md) +first. @@ -131,7 +131,18 @@ highlighting: git show v0.6.0:src/main.rs | bat -l rs ``` -Note that syntax highlighting within diffs is currently not supported. If you are looking for this, check out [`delta`](https://github.com/dandavison/delta). +#### `git diff` + +You can combine `bat` with `git diff` to view lines around code changes with proper syntax +highlighting: +```bash +batdiff() { + git diff --name-only --diff-filter=d | xargs bat --diff +} +``` +If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras). + +If you are looking for more support for git and diff operations, check out [`delta`](https://github.com/dandavison/delta). #### `xclip` @@ -665,6 +676,10 @@ bash assets/create.sh cargo install --path . --locked --force ``` +## Contributing + +Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide. + ## Maintainers - [sharkdp](https://github.com/sharkdp) diff --git a/assets/syntaxes/02_Extra/Manpage.sublime-syntax b/assets/syntaxes/02_Extra/Manpage.sublime-syntax index ea0bcb3c..d92eea22 100644 --- a/assets/syntaxes/02_Extra/Manpage.sublime-syntax +++ b/assets/syntaxes/02_Extra/Manpage.sublime-syntax @@ -34,11 +34,11 @@ contexts: scope: markup.heading.title.man - match: \s\s pop: true - - match: '(?=\S)' + - match: '(?=\S|$)' pop: true - match: '$' - push: body + set: body body: # English, ..., ..., ..., Russian, ... @@ -48,14 +48,16 @@ contexts: embed: synopsis escape: '(?={{section_heading}})' + - match: '^(?:USAGE)' + 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: @@ -83,6 +85,7 @@ contexts: - match: '' pop: true - include: function-call + - include: c-code expect-command-line-option: - match: '[A-Za-z0-9-]+' @@ -127,9 +130,15 @@ contexts: - match: '$|(?=[],]|{{command_line_option}})' pop: true + c-code: + - match: '^(?=\s+(?:#include\b|#define\b|/\*|struct\s+(\w+\s*)?\{))' + embed: scope:source.c + #embed_scope: source.c.embedded.man + #escape: ^(?!#|\1|\s*(?:$|/\*|#include\b|#define\b)) + escape: ^(?=\s*(?:\(.*\.\)\s*$|[A-Z](?![A-Z]))) + synopsis: - - match: '^(?=\s+(?:#include|/\*))' - push: scope:source.c + - include: c-code - match: \[ scope: punctuation.section.brackets.begin.man push: command-line-option-or-pipe @@ -140,6 +149,7 @@ contexts: captures: 1: keyword.operator.logical.man #- match: (?={{command_line_option}}) + - match: \w+-\w+ - match: (?=-) push: - match: (?=\s*\|) diff --git a/assets/syntaxes/02_Extra/Svelte b/assets/syntaxes/02_Extra/Svelte new file mode 160000 +Subproject bf92f5b7b69c8ea641d6822fd6d12cc2d934195 diff --git a/assets/syntaxes/02_Extra/syntax_test_man.man b/assets/syntaxes/02_Extra/syntax_test_man.man index a4c8f91d..ee8bada3 100644 --- a/assets/syntaxes/02_Extra/syntax_test_man.man +++ b/assets/syntaxes/02_Extra/syntax_test_man.man @@ -5,7 +5,7 @@ SOMETHING(8) System Manager's Manual SOMETHING(8) # ^^^^^^^ meta.preprocessor NAME -#^^^ markup.heading.title +#^^^ markup.heading.other example - do something useful SYNOPSIS @@ -45,9 +45,16 @@ SYNOPSIS [--quiet] [--debug] [--help|-h] [--version] [--conf FILE] /* According to POSIX.1-2001, POSIX.1-2008 */ -# ^^ source comment.block punctuation.definition.comment +# ^^ source.c comment.block punctuation.definition.comment #include <sys/select.h> -# ^^^^^^^^ source meta.preprocessor.include keyword.control.import.include +# ^^^^^^^^ source.c meta.preprocessor.include keyword.control.import.include + struct timeval { +# ^^^^^^ source.c storage.type + + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* microseconds */ + }; + DESCRIPTION @@ -123,3 +130,22 @@ OPTIONS # ^^^ variable.parameter # ^^ - variable output NUM (default 3) lines of copied context + +EXAMPLE + #include <stdio.h> +# ^^^^^^^^ source.c meta.preprocessor.include keyword.control.import.include + + (This is not C code.) +# ^^^^^^^^^^^^^^^^^^^^^^ - source.c + + struct timeval { + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* microseconds */ + }; +# ^ source.c punctuation.terminator + + The corresponding argument for pselect() has the following type: +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - source.c + #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | + EPOLLHUP | EPOLLERR) +# ^ source.c meta.preprocessor.macro meta.group punctuation.section.group.end diff --git a/assets/themes.bin b/assets/themes.bin Binary files differindex b8683424..bc291724 100644 --- a/assets/themes.bin +++ b/assets/themes.bin diff --git a/assets/themes/Coldark b/assets/themes/Coldark new file mode 160000 +Subproject b4a1c74d8d5bdd136ec530e5905b81027247254 diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index 50c39371..eb6f75bc 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -205,6 +205,14 @@ pub fn list_themes(cfg: &Config) -> Result<()> { writeln!(stdout, "{}", theme)?; } } + writeln!( + stdout, + "Further themes can be installed to '{}', \ + and are added to the cache with `bat cache --build`. \ + For more information, see:\n\n \ + https://github.com/sharkdp/bat#adding-new-themes", + config_file().join("themes").to_string_lossy() + )?; Ok(()) } diff --git a/src/error.rs b/src/error.rs index 2e73b85b..3e5b3711 100644 --- a/src/error.rs +++ b/src/error.rs @@ -20,6 +20,10 @@ error_chain! { description("unknown syntax"), display("unknown syntax: '{}'", name) } + InvalidPagerValueBat { + description("invalid value `bat` for pager property"), + display("Use of bat as a pager is disallowed in order to avoid infinite recursion problems") + } } } diff --git a/src/output.rs b/src/output.rs index b0d5974e..689371b9 100644 --- a/src/output.rs +++ b/src/output.rs @@ -85,10 +85,10 @@ impl OutputType { match pagerflags.split_first() { Some((pager_name, args)) => { - let mut pager_path = PathBuf::from(pager_name); + let pager_path = PathBuf::from(pager_name); if pager_path.file_stem() == Some(&OsString::from("bat")) { - pager_path = PathBuf::from("less"); + return Err(ErrorKind::InvalidPagerValueBat.into()); } let is_less = pager_path.file_stem() == Some(&OsString::from("less")); diff --git a/tests/assets.rs b/tests/assets.rs index 7ced769c..55b5399e 100644 --- a/tests/assets.rs +++ b/tests/assets.rs @@ -1,7 +1,9 @@ use bat::assets::HighlightingAssets; /// This test ensures that we are not accidentally removing themes due to submodule updates. +/// It is 'ignore'd by default because it requires themes.bin to be up-to-date. #[test] +#[ignore] fn all_themes_are_present() { let assets = HighlightingAssets::from_binary(); @@ -12,6 +14,8 @@ fn all_themes_are_present() { themes, vec![ "1337", + "Coldark-Cold", + "Coldark-Dark", "DarkNeon", "Dracula", "GitHub", diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index da0690ef..09ac8498 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -406,6 +406,16 @@ fn pager_disable() { } #[test] +fn pager_value_bat() { + bat() + .arg("--pager=bat") + .arg("--paging=always") + .arg("test.txt") + .assert() + .failure(); +} + +#[test] fn alias_pager_disable() { bat() .env("PAGER", "echo other-pager") diff --git a/tests/syntax-tests/highlighted/D/test.d b/tests/syntax-tests/highlighted/D/test.d new file mode 100644 index 00000000..da347147 --- /dev/null +++ b/tests/syntax-tests/highlighted/D/test.d @@ -0,0 +1,44 @@ +[38;2;117;113;94m//[0m[38;2;117;113;94m selective import[0m +[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;255;255;255mstd[0m[38;2;248;248;242m.[0m[38;2;255;255;255mstdio[0m[38;2;248;248;242m [0m[38;2;248;248;242m:[0m[38;2;248;248;242m [0m[38;2;255;255;255mwriteln[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;255;255;255mwritefln[0m[38;2;248;248;242m;[0m +[38;2;117;113;94m//[0m[38;2;117;113;94m non-selective import[0m +[38;2;249;38;114mimport[0m[38;2;248;248;242m [0m[38;2;255;255;255mstd[0m[38;2;248;248;242m.[0m[38;2;255;255;255malgorithm[0m[38;2;248;248;242m;[0m + +[38;2;117;113;94m/*[0m[38;2;117;113;94m a multiline comment[0m +[38;2;117;113;94m*[0m +[38;2;117;113;94m*[0m[38;2;117;113;94m this function is safe because it doesn't use pointer arithmetic[0m +[38;2;117;113;94m*/[0m +[3;38;2;102;217;239mint[0m[38;2;248;248;242m [0m[38;2;166;226;46mthe_ultimate_answer[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;249;38;114m@[0m[38;2;249;38;114msafe[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m assert1on[0m +[38;2;248;248;242m [0m[38;2;249;38;114massert[0m[38;2;248;248;242m([0m[38;2;190;132;255m1[0m[38;2;248;248;242m [0m[38;2;249;38;114m!=[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m now we can safely return our answer [0m +[38;2;248;248;242m [0m[38;2;249;38;114mreturn[0m[38;2;248;248;242m [0m[38;2;190;132;255m42[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m}[0m + +[3;38;2;102;217;239mvoid[0m[38;2;248;248;242m [0m[38;2;166;226;46mmain[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m +[38;2;248;248;242m{[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m function call with string literal[0m +[38;2;248;248;242m [0m[38;2;248;248;242mwriteln[0m[38;2;248;248;242m([0m[38;2;230;219;116m"[0m[38;2;230;219;116mHello World![0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m + +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m an int array declaration[0m +[38;2;248;248;242m [0m[3;38;2;102;217;239mint[0m[38;2;248;248;242m[[0m[38;2;248;248;242m][0m[38;2;248;248;242m [0m[38;2;255;255;255marr1[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;248;248;242m[[0m[38;2;190;132;255m1[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;190;132;255m2[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;190;132;255m3[0m[38;2;248;248;242m][0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m an immutable double[0m +[38;2;248;248;242m [0m[38;2;249;38;114mimmutable[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mdouble[0m[38;2;248;248;242m [0m[38;2;255;255;255mpi[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255m3[0m[38;2;190;132;255m.[0m[38;2;190;132;255m14[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m a mutable double[0m +[38;2;248;248;242m [0m[3;38;2;102;217;239mdouble[0m[38;2;248;248;242m [0m[38;2;255;255;255md1[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255mpi[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m a pointer[0m +[38;2;248;248;242m [0m[3;38;2;102;217;239mdouble[0m[38;2;249;38;114m*[0m[38;2;248;248;242m [0m[38;2;255;255;255mdp1[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114m&[0m[38;2;255;255;255md1[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m another pointer to the same thingy[0m +[38;2;248;248;242m [0m[38;2;249;38;114mauto[0m[38;2;248;248;242m [0m[38;2;255;255;255ma1[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;249;38;114m&[0m[38;2;255;255;255md1[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m a constant bool[0m +[38;2;248;248;242m [0m[38;2;249;38;114mconst[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mbool[0m[38;2;248;248;242m [0m[38;2;255;255;255mb1[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;190;132;255mtrue[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;255;255;255mb1[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m +[38;2;248;248;242m [0m[38;2;117;113;94m//[0m[38;2;117;113;94m another function call [0m +[38;2;248;248;242m [0m[38;2;248;248;242mwritefln[0m[38;2;248;248;242m([0m[38;2;230;219;116m"[0m[38;2;230;219;116m%s[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m%s[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m%s[0m[38;2;190;132;255m\n[0m[38;2;230;219;116m"[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;255;255;255marr1[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;255;255;255md1[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;248;248;242mthe_ultimate_answer[0m[38;2;248;248;242m([0m[38;2;248;248;242m)[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;248;248;242m}[0m +[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;249;38;114mif[0m[38;2;248;248;242m [0m[38;2;248;248;242m([0m[38;2;249;38;114m![0m[38;2;255;255;255mb1[0m[38;2;248;248;242m)[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m +[38;2;248;248;242m [0m[38;2;248;248;242mwriteln[0m[38;2;248;248;242m([0m[38;2;230;219;116m"[0m[38;2;230;219;116mthis seems wrong[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;248;248;242m}[0m +[38;2;248;248;242m [0m[38;2;249;38;114melse[0m[38;2;248;248;242m [0m[38;2;248;248;242m{[0m +[38;2;248;248;242m [0m[38;2;248;248;242mwriteln[0m[38;2;248;248;242m([0m[38;2;230;219;116m"[0m[38;2;230;219;116mI'm giving up, this is too crazy for me[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m;[0m +[38;2;248;248;242m [0m[38;2;248;248;242m}[0m +[38;2;248;248;242m}[0m diff --git a/tests/syntax-tests/highlighted/EtcGroup/test.group b/tests/syntax-tests/highlighted/EtcGroup/test.group new file mode 100644 index 00000000..5049c80e --- /dev/null +++ b/tests/syntax-tests/highlighted/EtcGroup/test.group @@ -0,0 +1,67 @@ +[38;2;249;38;114mroot[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m0[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31mroot[0m +[38;2;249;38;114msys[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m3[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31mbin[0m +[38;2;249;38;114mmem[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m8[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mftp[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m11[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mmail[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m12[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mlog[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m19[0m[38;2;248;248;242m:[0m +[38;2;249;38;114msmmsp[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m25[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mproc[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m26[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31mpolkitd[0m +[38;2;249;38;114mgames[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m50[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mlock[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m54[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mnetwork[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m90[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mfloppy[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m94[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mscanner[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m96[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mpower[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m98[0m[38;2;248;248;242m:[0m +[38;2;249;38;114madm[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m999[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31mdaemon[0m +[38;2;249;38;114mwheel[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m998[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31musername[0m +[38;2;249;38;114mkmem[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m997[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mtty[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m5[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mutmp[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m996[0m[38;2;248;248;242m:[0m +[38;2;249;38;114maudio[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m995[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31mmpd,username[0m +[38;2;249;38;114mdisk[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m994[0m[38;2;248;248;242m:[0m +[38;2;249;38;114minput[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m993[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mkvm[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m992[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mlp[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m991[0m[38;2;248;248;242m:[0m +[38;2;249;38;114moptical[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m990[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31musername[0m +[38;2;249;38;114mrender[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m989[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mstorage[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m988[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31musername[0m +[38;2;249;38;114muucp[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m987[0m[38;2;248;248;242m:[0m +[38;2;249;38;114mvideo[0m[38;2;248;248;242m:[0m[38;2;248;248;240mx[0m[38;2;248;248;242m:[0m[38;2;190;132;255m986[0m[38;2;248;248;242m:[0m[3;38;2;253;151;31muser |