mirror of
https://github.com/sharkdp/bat.git
synced 2024-11-25 09:13:39 +01:00
Merge branch 'master' into 2935-compatibility-issue-with-cat-piping
This commit is contained in:
commit
b13049a051
1
.github/workflows/CICD.yml
vendored
1
.github/workflows/CICD.yml
vendored
@ -163,6 +163,7 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
job:
|
job:
|
||||||
|
- { target: aarch64-unknown-linux-musl , os: ubuntu-20.04, dpkg_arch: arm64, use-cross: true }
|
||||||
- { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: arm64, use-cross: true }
|
- { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: arm64, use-cross: true }
|
||||||
- { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, dpkg_arch: armhf, use-cross: true }
|
- { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, dpkg_arch: armhf, use-cross: true }
|
||||||
- { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, dpkg_arch: musl-linux-armhf, use-cross: true }
|
- { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, dpkg_arch: musl-linux-armhf, use-cross: true }
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -260,3 +260,6 @@
|
|||||||
[submodule "assets/syntaxes/02_Extra/vscode-wgsl"]
|
[submodule "assets/syntaxes/02_Extra/vscode-wgsl"]
|
||||||
path = assets/syntaxes/02_Extra/vscode-wgsl
|
path = assets/syntaxes/02_Extra/vscode-wgsl
|
||||||
url = https://github.com/PolyMeilex/vscode-wgsl.git
|
url = https://github.com/PolyMeilex/vscode-wgsl.git
|
||||||
|
[submodule "assets/syntaxes/02_Extra/CFML"]
|
||||||
|
path = assets/syntaxes/02_Extra/CFML
|
||||||
|
url = https://github.com/jcberquist/sublimetext-cfml.git
|
||||||
|
25
CHANGELOG.md
25
CHANGELOG.md
@ -7,6 +7,9 @@
|
|||||||
- `bat --squeeze-limit` to set the maximum number of empty consecutive when using `--squeeze-blank`, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815)
|
- `bat --squeeze-limit` to set the maximum number of empty consecutive when using `--squeeze-blank`, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815)
|
||||||
- `PrettyPrinter::squeeze_empty_lines` to support line squeezing for bat as a library, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815)
|
- `PrettyPrinter::squeeze_empty_lines` to support line squeezing for bat as a library, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815)
|
||||||
- Syntax highlighting for JavaScript files that start with `#!/usr/bin/env bun` #2913 (@sharunkumar)
|
- Syntax highlighting for JavaScript files that start with `#!/usr/bin/env bun` #2913 (@sharunkumar)
|
||||||
|
- `bat --strip-ansi={never,always,auto}` to remove ANSI escape sequences from bat's input, see #2999 (@eth-p)
|
||||||
|
- Add or remove individual style components without replacing all styles #2929 (@eth-p)
|
||||||
|
- Add option `--binary=as-text` for printing binary content, see issue #2974 and PR #2976 (@einfachIrgendwer0815)
|
||||||
|
|
||||||
## Bugfixes
|
## Bugfixes
|
||||||
|
|
||||||
@ -16,6 +19,8 @@
|
|||||||
- Fix handling of inputs with combined ANSI color and attribute sequences, see #2185 and #2856 (@eth-p)
|
- Fix handling of inputs with combined ANSI color and attribute sequences, see #2185 and #2856 (@eth-p)
|
||||||
- Fix panel width when line 10000 wraps, see #2854 (@eth-p)
|
- Fix panel width when line 10000 wraps, see #2854 (@eth-p)
|
||||||
- Fix compatibility issue with cat. see #2983 (@domenicomastrangelo)
|
- Fix compatibility issue with cat. see #2983 (@domenicomastrangelo)
|
||||||
|
- Fix compile issue of `time` dependency caused by standard library regression #3045 (@cyqsimon)
|
||||||
|
- Fix override behavior of --plain and --paging, see issue #2731 and PR #3108 (@einfachIrgendwer0815)
|
||||||
|
|
||||||
## Other
|
## Other
|
||||||
|
|
||||||
@ -39,6 +44,10 @@
|
|||||||
- Display which theme is the default one in colored output, see #2838 (@sblondon)
|
- Display which theme is the default one in colored output, see #2838 (@sblondon)
|
||||||
- Add aarch64-apple-darwin ("Apple Silicon") binary tarballs to releases, see #2967 (@someposer)
|
- Add aarch64-apple-darwin ("Apple Silicon") binary tarballs to releases, see #2967 (@someposer)
|
||||||
- Update the Lisp syntax, see #2970 (@ccqpein)
|
- Update the Lisp syntax, see #2970 (@ccqpein)
|
||||||
|
- Use bat's ANSI iterator during tab expansion, see #2998 (@eth-p)
|
||||||
|
- Support 'statically linked binary' for aarch64 in 'Release' page, see #2992 (@tzq0301)
|
||||||
|
- Update options in shell completions and the man page of `bat`, see #2995 (@akinomyoga)
|
||||||
|
- Update nix dev-dependency to v0.29.0, see #3112 (@decathorpe)
|
||||||
|
|
||||||
## Syntaxes
|
## Syntaxes
|
||||||
|
|
||||||
@ -46,10 +55,17 @@
|
|||||||
- Upgrade JQ syntax, see #2820 (@dependabot[bot])
|
- Upgrade JQ syntax, see #2820 (@dependabot[bot])
|
||||||
- Add syntax mapping for quadman quadlets #2866 (@cyqsimon)
|
- Add syntax mapping for quadman quadlets #2866 (@cyqsimon)
|
||||||
- Map containers .conf files to TOML syntax #2867 (@cyqsimon)
|
- Map containers .conf files to TOML syntax #2867 (@cyqsimon)
|
||||||
- Associate `xsh` files with `xonsh` syntax that is Python, see #2840 (@anki-code).
|
- Associate `.xsh` files with `xonsh` syntax that is Python, see #2840 (@anki-code)
|
||||||
- Added auto detect syntax for `.jsonc` #2795 (@mxaddict)
|
- Associate JSON with Comments `.jsonc` with `json` syntax, see #2795 (@mxaddict)
|
||||||
- Added auto detect syntax for `.aws/{config,credentials}` #2795 (@mxaddict)
|
- Associate JSON-LD `.jsonld` files with `json` syntax, see #3037 (@vorburger)
|
||||||
- Add syntax mapping for Wireguard config #2874 (@cyqsimon)
|
- Associate `.textproto` files with `ProtoBuf` syntax, see #3038 (@vorburger)
|
||||||
|
- Associate GeoJSON `.geojson` files with `json` syntax, see #3084 (@mvaaltola)
|
||||||
|
- Associate `.aws/{config,credentials}`, see #2795 (@mxaddict)
|
||||||
|
- Associate Wireguard config `/etc/wireguard/*.conf`, see #2874 (@cyqsimon)
|
||||||
|
- Add support for [CFML](https://www.adobe.com/products/coldfusion-family.html), see #3031 (@brenton-at-pieces)
|
||||||
|
- Map `*.mkd` files to `Markdown` syntax, see issue #3060 and PR #3061 (@einfachIrgendwer0815)
|
||||||
|
- Add syntax mapping for kubernetes config files #3049 (@cyqsimon)
|
||||||
|
- Add syntax mapping for `/etc/pacman.conf` #2961 (@cyqsimon)
|
||||||
|
|
||||||
## Themes
|
## Themes
|
||||||
|
|
||||||
@ -99,6 +115,7 @@
|
|||||||
- Update `Julia` syntax, see #2553 (@dependabot)
|
- Update `Julia` syntax, see #2553 (@dependabot)
|
||||||
- add `NSIS` support, see #2577 (@idleberg)
|
- add `NSIS` support, see #2577 (@idleberg)
|
||||||
- Update `ssh-config`, see #2697 (@mrmeszaros)
|
- Update `ssh-config`, see #2697 (@mrmeszaros)
|
||||||
|
- Add syntax mapping `*.debdiff` => `diff`, see #2947 (@jacg)
|
||||||
|
|
||||||
## `bat` as a library
|
## `bat` as a library
|
||||||
|
|
||||||
|
159
Cargo.lock
generated
159
Cargo.lock
generated
@ -3,10 +3,10 @@
|
|||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "adler"
|
name = "adler2"
|
||||||
version = "1.0.2"
|
version = "2.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
|
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aho-corasick"
|
name = "aho-corasick"
|
||||||
@ -19,9 +19,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ansi_colours"
|
name = "ansi_colours"
|
||||||
version = "1.2.2"
|
version = "1.2.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a1558bd2075d341b9ca698ec8eb6fcc55a746b1fc4255585aad5b141d918a80"
|
checksum = "14eec43e0298190790f41679fe69ef7a829d2a2ddd78c8c00339e84710e435fe"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rgb",
|
"rgb",
|
||||||
]
|
]
|
||||||
@ -76,9 +76,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.78"
|
version = "1.0.86"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ca87830a3e3fb156dc96cfbd31cb620265dd053be734723f22b760d6cc3c3051"
|
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "assert_cmd"
|
name = "assert_cmd"
|
||||||
@ -103,9 +103,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "base64"
|
name = "base64"
|
||||||
version = "0.21.0"
|
version = "0.22.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
|
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bat"
|
name = "bat"
|
||||||
@ -243,6 +243,12 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg_aliases"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.4.12"
|
version = "4.4.12"
|
||||||
@ -273,12 +279,11 @@ checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clircle"
|
name = "clircle"
|
||||||
version = "0.5.0"
|
version = "0.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec0b92245ea62a7a751db4b0e4a583f8978e508077ef6de24fcc0d0dc5311a8d"
|
checksum = "e136d50bd652710f1d86259a8977263d46bef0ab782a8bfc3887e44338517015"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"winapi",
|
"winapi",
|
||||||
@ -416,9 +421,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "encoding_rs"
|
name = "encoding_rs"
|
||||||
version = "0.8.33"
|
version = "0.8.35"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
|
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
@ -463,9 +468,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "expect-test"
|
name = "expect-test"
|
||||||
version = "1.4.1"
|
version = "1.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "30d9eafeadd538e68fb28016364c9732d78e420b9ff8853fa5e4058861e9f8d3"
|
checksum = "9e0be0a561335815e06dab7c62e50353134c796e7a6155402a64bcff66b6a5e0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dissimilar",
|
"dissimilar",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@ -489,9 +494,9 @@ checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
version = "1.0.30"
|
version = "1.0.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
|
checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crc32fast",
|
"crc32fast",
|
||||||
"miniz_oxide",
|
"miniz_oxide",
|
||||||
@ -564,9 +569,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "git2"
|
name = "git2"
|
||||||
version = "0.18.3"
|
version = "0.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70"
|
checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.4.0",
|
"bitflags 2.4.0",
|
||||||
"libc",
|
"libc",
|
||||||
@ -583,9 +588,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "globset"
|
name = "globset"
|
||||||
version = "0.4.14"
|
version = "0.4.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
|
checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"bstr",
|
"bstr",
|
||||||
@ -596,9 +601,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "grep-cli"
|
name = "grep-cli"
|
||||||
version = "0.1.10"
|
version = "0.1.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ea40788c059ab8b622c4d074732750bfb3bd2912e2dd58eabc11798a4d5ad725"
|
checksum = "47f1288f0e06f279f84926fa4c17e3fcd2a22b357927a82f2777f7be26e4cec0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bstr",
|
"bstr",
|
||||||
"globset",
|
"globset",
|
||||||
@ -647,9 +652,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.2.6"
|
version = "2.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
|
checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown 0.14.1",
|
"hashbrown 0.14.1",
|
||||||
@ -688,15 +693,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.149"
|
version = "0.2.161"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
|
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libgit2-sys"
|
name = "libgit2-sys"
|
||||||
version = "0.16.2+1.7.2"
|
version = "0.17.0+1.8.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8"
|
checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
@ -716,15 +721,6 @@ dependencies = [
|
|||||||
"vcpkg",
|
"vcpkg",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "line-wrap"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
|
|
||||||
dependencies = [
|
|
||||||
"safemem",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linked-hash-map"
|
name = "linked-hash-map"
|
||||||
version = "0.5.6"
|
version = "0.5.6"
|
||||||
@ -761,21 +757,22 @@ checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "miniz_oxide"
|
name = "miniz_oxide"
|
||||||
version = "0.7.1"
|
version = "0.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
|
checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"adler",
|
"adler2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "nix"
|
||||||
version = "0.26.4"
|
version = "0.29.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
|
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.3.2",
|
"bitflags 2.4.0",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
|
"cfg_aliases",
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -811,9 +808,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.19.0"
|
version = "1.20.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1"
|
||||||
|
dependencies = [
|
||||||
|
"portable-atomic",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "onig"
|
name = "onig"
|
||||||
@ -892,18 +892,23 @@ checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "plist"
|
name = "plist"
|
||||||
version = "1.6.0"
|
version = "1.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef"
|
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"line-wrap",
|
|
||||||
"quick-xml",
|
"quick-xml",
|
||||||
"serde",
|
"serde",
|
||||||
"time",
|
"time",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "portable-atomic"
|
||||||
|
version = "1.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "powerfmt"
|
name = "powerfmt"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
@ -957,9 +962,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quick-xml"
|
name = "quick-xml"
|
||||||
version = "0.31.0"
|
version = "0.32.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33"
|
checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
@ -1087,12 +1092,6 @@ version = "1.0.11"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "safemem"
|
|
||||||
version = "0.3.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "same-file"
|
name = "same-file"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
@ -1116,18 +1115,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.199"
|
version = "1.0.209"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a"
|
checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.199"
|
version = "1.0.209"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc"
|
checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -1147,9 +1146,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_spanned"
|
name = "serde_spanned"
|
||||||
version = "0.6.5"
|
version = "0.6.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
|
checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
@ -1347,9 +1346,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.3.34"
|
version = "0.3.36"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"
|
checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deranged",
|
"deranged",
|
||||||
"itoa",
|
"itoa",
|
||||||
@ -1368,9 +1367,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time-macros"
|
name = "time-macros"
|
||||||
version = "0.2.17"
|
version = "0.2.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"
|
checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-conv",
|
"num-conv",
|
||||||
"time-core",
|
"time-core",
|
||||||
@ -1393,9 +1392,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.8.9"
|
version = "0.8.19"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c6a4b9e8023eb94392d3dca65d717c53abc5dad49c07cb65bb8fcd87115fa325"
|
checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"serde",
|
"serde",
|
||||||
@ -1406,18 +1405,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_datetime"
|
name = "toml_datetime"
|
||||||
version = "0.6.5"
|
version = "0.6.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
|
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_edit"
|
name = "toml_edit"
|
||||||
version = "0.21.1"
|
version = "0.22.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
|
checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"serde",
|
"serde",
|
||||||
@ -1449,9 +1448,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-width"
|
name = "unicode-width"
|
||||||
version = "0.1.11"
|
version = "0.1.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
|
checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unsafe-libyaml"
|
name = "unsafe-libyaml"
|
||||||
@ -1493,9 +1492,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "walkdir"
|
name = "walkdir"
|
||||||
version = "2.4.0"
|
version = "2.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
|
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"same-file",
|
"same-file",
|
||||||
"winapi-util",
|
"winapi-util",
|
||||||
@ -1747,9 +1746,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winnow"
|
name = "winnow"
|
||||||
version = "0.5.18"
|
version = "0.6.20"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "176b6138793677221d420fd2f0aeeced263f197688b36484660da767bca2fa32"
|
checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
30
Cargo.toml
30
Cargo.toml
@ -46,31 +46,31 @@ ansi_colours = "^1.2"
|
|||||||
bincode = "1.0"
|
bincode = "1.0"
|
||||||
console = "0.15.8"
|
console = "0.15.8"
|
||||||
flate2 = "1.0"
|
flate2 = "1.0"
|
||||||
once_cell = "1.19"
|
once_cell = "1.20"
|
||||||
thiserror = "1.0"
|
thiserror = "1.0"
|
||||||
wild = { version = "2.2", optional = true }
|
wild = { version = "2.2", optional = true }
|
||||||
content_inspector = "0.2.4"
|
content_inspector = "0.2.4"
|
||||||
shell-words = { version = "1.1.0", optional = true }
|
shell-words = { version = "1.1.0", optional = true }
|
||||||
unicode-width = "0.1.11"
|
unicode-width = "0.1.13"
|
||||||
globset = "0.4"
|
globset = "0.4"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_yaml = "0.9.28"
|
serde_yaml = "0.9.28"
|
||||||
semver = "1.0"
|
semver = "1.0"
|
||||||
path_abs = { version = "0.5", default-features = false }
|
path_abs = { version = "0.5", default-features = false }
|
||||||
clircle = "0.5"
|
clircle = "0.6"
|
||||||
bugreport = { version = "0.5.0", optional = true }
|
bugreport = { version = "0.5.0", optional = true }
|
||||||
etcetera = { version = "0.8.0", optional = true }
|
etcetera = { version = "0.8.0", optional = true }
|
||||||
grep-cli = { version = "0.1.10", optional = true }
|
grep-cli = { version = "0.1.11", optional = true }
|
||||||
regex = { version = "1.10.2", optional = true }
|
regex = { version = "1.10.2", optional = true }
|
||||||
walkdir = { version = "2.4", optional = true }
|
walkdir = { version = "2.5", optional = true }
|
||||||
bytesize = { version = "1.3.0" }
|
bytesize = { version = "1.3.0" }
|
||||||
encoding_rs = "0.8.33"
|
encoding_rs = "0.8.35"
|
||||||
os_str_bytes = { version = "~7.0", optional = true }
|
os_str_bytes = { version = "~7.0", optional = true }
|
||||||
run_script = { version = "^0.10.1", optional = true}
|
run_script = { version = "^0.10.1", optional = true}
|
||||||
|
|
||||||
[dependencies.git2]
|
[dependencies.git2]
|
||||||
version = "0.18"
|
version = "0.19"
|
||||||
optional = true
|
optional = true
|
||||||
default-features = false
|
default-features = false
|
||||||
|
|
||||||
@ -86,11 +86,11 @@ features = ["wrap_help", "cargo"]
|
|||||||
|
|
||||||
[target.'cfg(target_os = "macos")'.dependencies]
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
home = "0.5.9"
|
home = "0.5.9"
|
||||||
plist = "1.6.0"
|
plist = "1.7.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
assert_cmd = "2.0.12"
|
assert_cmd = "2.0.12"
|
||||||
expect-test = "1.4.1"
|
expect-test = "1.5.0"
|
||||||
serial_test = { version = "2.0.0", default-features = false }
|
serial_test = { version = "2.0.0", default-features = false }
|
||||||
predicates = "3.1.0"
|
predicates = "3.1.0"
|
||||||
wait-timeout = "0.2.0"
|
wait-timeout = "0.2.0"
|
||||||
@ -98,19 +98,19 @@ tempfile = "3.8.1"
|
|||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
|
||||||
[target.'cfg(unix)'.dev-dependencies]
|
[target.'cfg(unix)'.dev-dependencies]
|
||||||
nix = { version = "0.26.4", default-features = false, features = ["term"] }
|
nix = { version = "0.29", default-features = false, features = ["term"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
anyhow = "1.0.78"
|
anyhow = "1.0.86"
|
||||||
indexmap = { version = "2.2.6", features = ["serde"] }
|
indexmap = { version = "2.3.0", features = ["serde"] }
|
||||||
itertools = "0.13.0"
|
itertools = "0.13.0"
|
||||||
once_cell = "1.18"
|
once_cell = "1.20"
|
||||||
regex = "1.10.2"
|
regex = "1.10.2"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_with = { version = "3.8.1", default-features = false, features = ["macros"] }
|
serde_with = { version = "3.8.1", default-features = false, features = ["macros"] }
|
||||||
toml = { version = "0.8.9", features = ["preserve_order"] }
|
toml = { version = "0.8.19", features = ["preserve_order"] }
|
||||||
walkdir = "2.4"
|
walkdir = "2.5"
|
||||||
|
|
||||||
[build-dependencies.clap]
|
[build-dependencies.clap]
|
||||||
version = "4.4.12"
|
version = "4.4.12"
|
||||||
|
27
README.md
27
README.md
@ -373,6 +373,14 @@ You can install `bat` using the [nix package manager](https://nixos.org/nix):
|
|||||||
nix-env -i bat
|
nix-env -i bat
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Via flox
|
||||||
|
|
||||||
|
You can install `bat` using [Flox](https://flox.dev)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
flox install bat
|
||||||
|
```
|
||||||
|
|
||||||
### On openSUSE
|
### On openSUSE
|
||||||
|
|
||||||
You can install `bat` with zypper:
|
You can install `bat` with zypper:
|
||||||
@ -507,6 +515,16 @@ and line numbers but no grid and no file header. Set the `BAT_STYLE` environment
|
|||||||
variable to make these changes permanent or use `bat`s
|
variable to make these changes permanent or use `bat`s
|
||||||
[configuration file](https://github.com/sharkdp/bat#configuration-file).
|
[configuration file](https://github.com/sharkdp/bat#configuration-file).
|
||||||
|
|
||||||
|
>[!tip]
|
||||||
|
> If you specify a default style in `bat`'s config file, you can change which components
|
||||||
|
> are displayed during a single run of `bat` using the `--style` command-line argument.
|
||||||
|
> By prefixing a component with `+` or `-`, it can be added or removed from the current style.
|
||||||
|
>
|
||||||
|
> For example, if your config contains `--style=full,-snip`, you can run bat with
|
||||||
|
> `--style=-grid,+snip` to remove the grid and add back the `snip` component.
|
||||||
|
> Or, if you want to override the styles completely, you use `--style=numbers` to
|
||||||
|
> only show the line numbers.
|
||||||
|
|
||||||
### Adding new syntaxes / language definitions
|
### Adding new syntaxes / language definitions
|
||||||
|
|
||||||
Should you find that a particular syntax is not available within `bat`, you can follow these
|
Should you find that a particular syntax is not available within `bat`, you can follow these
|
||||||
@ -729,7 +747,7 @@ your `PATH` or [define an environment variable](#using-a-different-pager). The [
|
|||||||
Windows 10 natively supports colors in both `conhost.exe` (Command Prompt) and PowerShell since
|
Windows 10 natively supports colors in both `conhost.exe` (Command Prompt) and PowerShell since
|
||||||
[v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)), as
|
[v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)), as
|
||||||
well as in newer versions of bash. On earlier versions of Windows, you can use
|
well as in newer versions of bash. On earlier versions of Windows, you can use
|
||||||
[Cmder](http://cmder.net/), which includes [ConEmu](https://conemu.github.io/).
|
[Cmder](http://cmder.app/), which includes [ConEmu](https://conemu.github.io/).
|
||||||
|
|
||||||
**Note:** Old versions of `less` do not correctly interpret colors on Windows. To fix this, you can add the optional Unix tools to your PATH when installing Git. If you don’t have any other pagers installed, you can disable paging entirely by passing `--paging=never` or by setting `BAT_PAGER` to an empty string.
|
**Note:** Old versions of `less` do not correctly interpret colors on Windows. To fix this, you can add the optional Unix tools to your PATH when installing Git. If you don’t have any other pagers installed, you can disable paging entirely by passing `--paging=never` or by setting `BAT_PAGER` to an empty string.
|
||||||
|
|
||||||
@ -759,9 +777,14 @@ bat() {
|
|||||||
|
|
||||||
If an input file contains color codes or other ANSI escape sequences or control characters, `bat` will have problems
|
If an input file contains color codes or other ANSI escape sequences or control characters, `bat` will have problems
|
||||||
performing syntax highlighting and text wrapping, and thus the output can become garbled.
|
performing syntax highlighting and text wrapping, and thus the output can become garbled.
|
||||||
When displaying such files it is recommended to disable both syntax highlighting and wrapping by
|
|
||||||
|
If your version of `bat` supports the `--strip-ansi=auto` option, it can be used to remove such sequences
|
||||||
|
before syntax highlighting. Alternatively, you may disable both syntax highlighting and wrapping by
|
||||||
passing the `--color=never --wrap=never` options to `bat`.
|
passing the `--color=never --wrap=never` options to `bat`.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> The `auto` option of `--strip-ansi` avoids removing escape sequences when the syntax is plain text.
|
||||||
|
|
||||||
### Terminals & colors
|
### Terminals & colors
|
||||||
|
|
||||||
`bat` handles terminals *with* and *without* truecolor support. However, the colors in most syntax
|
`bat` handles terminals *with* and *without* truecolor support. However, the colors in most syntax
|
||||||
|
8
assets/completions/bat.bash.in
vendored
8
assets/completions/bat.bash.in
vendored
@ -76,6 +76,7 @@ _bat() {
|
|||||||
-m | --map-syntax | \
|
-m | --map-syntax | \
|
||||||
--ignored-suffix | \
|
--ignored-suffix | \
|
||||||
--list-themes | \
|
--list-themes | \
|
||||||
|
--squeeze-limit | \
|
||||||
--line-range | \
|
--line-range | \
|
||||||
-L | --list-languages | \
|
-L | --list-languages | \
|
||||||
--lessopen | \
|
--lessopen | \
|
||||||
@ -157,6 +158,7 @@ _bat() {
|
|||||||
--diff-context
|
--diff-context
|
||||||
--tabs
|
--tabs
|
||||||
--wrap
|
--wrap
|
||||||
|
--chop-long-lines
|
||||||
--terminal-width
|
--terminal-width
|
||||||
--number
|
--number
|
||||||
--color
|
--color
|
||||||
@ -169,18 +171,24 @@ _bat() {
|
|||||||
--ignored-suffix
|
--ignored-suffix
|
||||||
--theme
|
--theme
|
||||||
--list-themes
|
--list-themes
|
||||||
|
--squeeze-blank
|
||||||
|
--squeeze-limit
|
||||||
--style
|
--style
|
||||||
--line-range
|
--line-range
|
||||||
--list-languages
|
--list-languages
|
||||||
--lessopen
|
--lessopen
|
||||||
--diagnostic
|
--diagnostic
|
||||||
--acknowledgements
|
--acknowledgements
|
||||||
|
--set-terminal-title
|
||||||
--help
|
--help
|
||||||
--version
|
--version
|
||||||
--cache-dir
|
--cache-dir
|
||||||
--config-dir
|
--config-dir
|
||||||
--config-file
|
--config-file
|
||||||
--generate-config-file
|
--generate-config-file
|
||||||
|
--no-config
|
||||||
|
--no-custom-assets
|
||||||
|
--no-lessopen
|
||||||
" -- "$cur"))
|
" -- "$cur"))
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
2
assets/completions/bat.fish.in
vendored
2
assets/completions/bat.fish.in
vendored
@ -133,6 +133,8 @@ set -l tabs_opts '
|
|||||||
|
|
||||||
complete -c $bat -l acknowledgements -d "Print acknowledgements" -n __fish_is_first_arg
|
complete -c $bat -l acknowledgements -d "Print acknowledgements" -n __fish_is_first_arg
|
||||||
|
|
||||||
|
complete -c $bat -l cache-dir -f -d "Show bat's cache directory" -n __fish_is_first_arg
|
||||||
|
|
||||||
complete -c $bat -l color -x -a "$color_opts" -d "When to use colored output" -n __bat_no_excl_args
|
complete -c $bat -l color -x -a "$color_opts" -d "When to use colored output" -n __bat_no_excl_args
|
||||||
|
|
||||||
complete -c $bat -l config-dir -f -d "Display location of configuration directory" -n __fish_is_first_arg
|
complete -c $bat -l config-dir -f -d "Display location of configuration directory" -n __fish_is_first_arg
|
||||||
|
1
assets/completions/bat.zsh.in
vendored
1
assets/completions/bat.zsh.in
vendored
@ -48,6 +48,7 @@ _{{PROJECT_EXECUTABLE}}_main() {
|
|||||||
default auto full plain changes header header-filename header-filesize grid rule numbers snip'
|
default auto full plain changes header header-filename header-filesize grid rule numbers snip'
|
||||||
\*{-r+,--line-range=}'[only print the specified line range]:start\:end'
|
\*{-r+,--line-range=}'[only print the specified line range]:start\:end'
|
||||||
'(* -)'{-L,--list-languages}'[display all supported languages]'
|
'(* -)'{-L,--list-languages}'[display all supported languages]'
|
||||||
|
-P'[disable paging]'
|
||||||
"--no-config[don't use the configuration file]"
|
"--no-config[don't use the configuration file]"
|
||||||
"--no-custom-assets[don't load custom assets]"
|
"--no-custom-assets[don't load custom assets]"
|
||||||
'(--no-lessopen)'--lessopen'[enable the $LESSOPEN preprocessor]'
|
'(--no-lessopen)'--lessopen'[enable the $LESSOPEN preprocessor]'
|
||||||
|
65
assets/manual/bat.1.in
vendored
65
assets/manual/bat.1.in
vendored
@ -87,6 +87,10 @@ Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
|
|||||||
Specify the text\-wrapping mode (*auto*, never, character). The '\-\-terminal\-width' option
|
Specify the text\-wrapping mode (*auto*, never, character). The '\-\-terminal\-width' option
|
||||||
can be used in addition to control the output width.
|
can be used in addition to control the output width.
|
||||||
.HP
|
.HP
|
||||||
|
\fB\-S\fR, \fB\-\-chop\-long\-lines\fR
|
||||||
|
.IP
|
||||||
|
Truncate all lines longer than screen width. Alias for '\-\-wrap=never'.
|
||||||
|
.HP
|
||||||
\fB\-\-terminal\-width\fR <width>
|
\fB\-\-terminal\-width\fR <width>
|
||||||
.IP
|
.IP
|
||||||
Explicitly set the width of the terminal instead of determining it automatically. If
|
Explicitly set the width of the terminal instead of determining it automatically. If
|
||||||
@ -141,6 +145,11 @@ use -m '*.build:Python'. To highlight files named '.myignore' with the Git Ignor
|
|||||||
syntax, use -m '.myignore:Git Ignore'.
|
syntax, use -m '.myignore:Git Ignore'.
|
||||||
Note that the right-hand side is the *name* of the syntax, not a file extension.
|
Note that the right-hand side is the *name* of the syntax, not a file extension.
|
||||||
.HP
|
.HP
|
||||||
|
\fB\-\-ignored\-suffix\fR <ignored-suffix>
|
||||||
|
.IP
|
||||||
|
Ignore extension. For example: 'bat \-\-ignored-suffix ".dev" my_file.json.dev'
|
||||||
|
will use JSON syntax, and ignore '.dev'
|
||||||
|
.HP
|
||||||
\fB\-\-theme\fR <theme>
|
\fB\-\-theme\fR <theme>
|
||||||
.IP
|
.IP
|
||||||
Set the theme for syntax highlighting. Use '\-\-list\-themes' to see all available themes.
|
Set the theme for syntax highlighting. Use '\-\-list\-themes' to see all available themes.
|
||||||
@ -151,6 +160,14 @@ export the BAT_THEME environment variable (e.g.: export BAT_THEME="...").
|
|||||||
.IP
|
.IP
|
||||||
Display a list of supported themes for syntax highlighting.
|
Display a list of supported themes for syntax highlighting.
|
||||||
.HP
|
.HP
|
||||||
|
\fB\-s\fR, \fB\-\-squeeze\-blank\fR
|
||||||
|
.IP
|
||||||
|
Squeeze consecutive empty lines into a single empty line.
|
||||||
|
.HP
|
||||||
|
\fB\-\-squeeze\-limit\fR <squeeze-limit>
|
||||||
|
.IP
|
||||||
|
Set the maximum number of consecutive empty lines to be printed.
|
||||||
|
.HP
|
||||||
\fB\-\-style\fR <style\-components>
|
\fB\-\-style\fR <style\-components>
|
||||||
.IP
|
.IP
|
||||||
Configure which elements (line numbers, file headers, grid borders, Git modifications,
|
Configure which elements (line numbers, file headers, grid borders, Git modifications,
|
||||||
@ -184,6 +201,30 @@ Display a list of supported languages for syntax highlighting.
|
|||||||
This option exists for POSIX\-compliance reasons ('u' is for 'unbuffered'). The output is
|
This option exists for POSIX\-compliance reasons ('u' is for 'unbuffered'). The output is
|
||||||
always unbuffered \- this option is simply ignored.
|
always unbuffered \- this option is simply ignored.
|
||||||
.HP
|
.HP
|
||||||
|
\fB\-\-no\-custom\-assets\fR
|
||||||
|
.IP
|
||||||
|
Do not load custom assets.
|
||||||
|
.HP
|
||||||
|
\fB\-\-config\-dir\fR
|
||||||
|
.IP
|
||||||
|
Show bat's configuration directory.
|
||||||
|
.HP
|
||||||
|
\fB\-\-cache\-dir\fR
|
||||||
|
.IP
|
||||||
|
Show bat's cache directory.
|
||||||
|
.HP
|
||||||
|
\fB\-\-diagnostic\fR
|
||||||
|
.IP
|
||||||
|
Show diagnostic information for bug reports.
|
||||||
|
.HP
|
||||||
|
\fB\-\-acknowledgements\fR
|
||||||
|
.IP
|
||||||
|
Show acknowledgements.
|
||||||
|
.HP
|
||||||
|
\fB\-\-set\-terminal\-title\fR
|
||||||
|
.IP
|
||||||
|
Sets terminal title to filenames when using a pager.
|
||||||
|
.HP
|
||||||
\fB\-h\fR, \fB\-\-help\fR
|
\fB\-h\fR, \fB\-\-help\fR
|
||||||
.IP
|
.IP
|
||||||
Print this help message.
|
Print this help message.
|
||||||
@ -212,6 +253,20 @@ location of the configuration file.
|
|||||||
To generate a default configuration file, call:
|
To generate a default configuration file, call:
|
||||||
|
|
||||||
\fB{{PROJECT_EXECUTABLE}} --generate-config-file\fR
|
\fB{{PROJECT_EXECUTABLE}} --generate-config-file\fR
|
||||||
|
|
||||||
|
These are related options:
|
||||||
|
.HP
|
||||||
|
\fB\-\-config\-file\fR
|
||||||
|
.IP
|
||||||
|
Show path to the configuration file.
|
||||||
|
.HP
|
||||||
|
\fB\-\-generate-config\-file\fR
|
||||||
|
.IP
|
||||||
|
Generates a default configuration file.
|
||||||
|
.HP
|
||||||
|
\fB\-\-no\-config\fR
|
||||||
|
.IP
|
||||||
|
Do not use the configuration file.
|
||||||
.SH "ADDING CUSTOM LANGUAGES"
|
.SH "ADDING CUSTOM LANGUAGES"
|
||||||
{{PROJECT_EXECUTABLE}} supports Sublime Text \fB.sublime-syntax\fR language files, and can be
|
{{PROJECT_EXECUTABLE}} supports Sublime Text \fB.sublime-syntax\fR language files, and can be
|
||||||
customized to add additional languages to your local installation. To do this, add the \fB.sublime-syntax\fR language
|
customized to add additional languages to your local installation. To do this, add the \fB.sublime-syntax\fR language
|
||||||
@ -258,6 +313,16 @@ To temporarily disable the preprocessor if it is enabled by default, call:
|
|||||||
|
|
||||||
\fB{{PROJECT_EXECUTABLE}} --no-lessopen\fR
|
\fB{{PROJECT_EXECUTABLE}} --no-lessopen\fR
|
||||||
|
|
||||||
|
These are related options:
|
||||||
|
.HP
|
||||||
|
\fB\-\-lessopen\fR
|
||||||
|
.IP
|
||||||
|
Enable the $LESSOPEN preprocessor.
|
||||||
|
.HP
|
||||||
|
\fB\-\-no\-lessopen\fR
|
||||||
|
.IP
|
||||||
|
Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)
|
||||||
|
.PP
|
||||||
For more information, see the "INPUT PREPROCESSOR" section of less(1).
|
For more information, see the "INPUT PREPROCESSOR" section of less(1).
|
||||||
|
|
||||||
.SH "MORE INFORMATION"
|
.SH "MORE INFORMATION"
|
||||||
|
1
assets/syntaxes/02_Extra/CFML
vendored
Submodule
1
assets/syntaxes/02_Extra/CFML
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit b91c44a32e251c20c6359a8d9232287e1b408e6c
|
2
assets/syntaxes/02_Extra/Protobuf
vendored
2
assets/syntaxes/02_Extra/Protobuf
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 726e21d74dac23cbb036f2fbbd626decdc954060
|
Subproject commit 1365331580b0e4bb86f74d0c599dccc87e7bdacb
|
@ -616,63 +616,59 @@ iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
|
|||||||
|
|
||||||
注意: 当`bat`无法识别语言时你可能会需要`-l`/`--language`参数。
|
注意: 当`bat`无法识别语言时你可能会需要`-l`/`--language`参数。
|
||||||
|
|
||||||
## Development
|
## 开发
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Recursive clone to retrieve all submodules
|
# 递归 clone 以获取所有子模块
|
||||||
git clone --recursive https://github.com/sharkdp/bat
|
git clone --recursive https://github.com/sharkdp/bat
|
||||||
|
|
||||||
# Build (debug version)
|
# 构建(调试版本)
|
||||||
cd bat
|
cd bat
|
||||||
cargo build --bins
|
cargo build --bins
|
||||||
|
|
||||||
# Run unit tests and integration tests
|
# 运行单元测试和集成测试
|
||||||
cargo test
|
cargo test
|
||||||
|
|
||||||
# Install (release version)
|
# 安装(发布版本)
|
||||||
cargo install --path . --locked
|
cargo install --path . --locked
|
||||||
|
|
||||||
# Build a bat binary with modified syntaxes and themes
|
# 使用修改后的语法和主题构建一个 bat 二进制文件
|
||||||
bash assets/create.sh
|
bash assets/create.sh
|
||||||
cargo install --path . --locked --force
|
cargo install --path . --locked --force
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to build an application that uses `bat`s pretty-printing
|
如果你想构建一个使用 `bat` 美化打印功能的应用程序,请查看 [API 文档](https://docs.rs/bat/)。请注意,当你依赖 `bat` 作为库时,必须使用 `regex-onig` 或 `regex-fancy` 作为特性。
|
||||||
features as a library, check out the [the API documentation](https://docs.rs/bat/).
|
|
||||||
Note that you have to use either `regex-onig` or `regex-fancy` as a feature
|
|
||||||
when you depend on `bat` as a library.
|
|
||||||
|
|
||||||
## Contributing
|
## 贡献指南
|
||||||
|
|
||||||
Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide.
|
请查看 [`CONTRIBUTING.md`](CONTRIBUTING.md) 指南。
|
||||||
|
|
||||||
## Maintainers
|
## 维护者
|
||||||
|
|
||||||
- [sharkdp](https://github.com/sharkdp)
|
- [sharkdp](https://github.com/sharkdp)
|
||||||
- [eth-p](https://github.com/eth-p)
|
- [eth-p](https://github.com/eth-p)
|
||||||
- [keith-hall](https://github.com/keith-hall)
|
- [keith-hall](https://github.com/keith-hall)
|
||||||
- [Enselic](https://github.com/Enselic)
|
- [Enselic](https://github.com/Enselic)
|
||||||
|
|
||||||
## Security vulnerabilities
|
## 安全漏洞
|
||||||
|
|
||||||
Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`.
|
如果你想报告 `bat` 中的漏洞,请通过邮件联系 [David Peter](https://david-peter.de/)。
|
||||||
|
|
||||||
## Project goals and alternatives
|
## 项目目标和替代方案
|
||||||
|
|
||||||
`bat` tries to achieve the following goals:
|
`bat` 试图实现以下目标:
|
||||||
|
|
||||||
- Provide beautiful, advanced syntax highlighting
|
- 提供美观的高级语法高亮
|
||||||
- Integrate with Git to show file modifications
|
- 与 Git 集成以显示文件修改
|
||||||
- Be a drop-in replacement for (POSIX) `cat`
|
- 成为 (POSIX) `cat` 的替代品
|
||||||
- Offer a user-friendly command-line interface
|
- 提供用户友好的命令行界面
|
||||||
|
|
||||||
There are a lot of alternatives, if you are looking for similar programs. See
|
如果你在寻找类似的程序,有很多替代方案。请参阅[本文档](doc/alternatives.md)进行比较。
|
||||||
[this document](doc/alternatives.md) for a comparison.
|
|
||||||
|
|
||||||
## License
|
## 许可证
|
||||||
|
|
||||||
Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat).
|
版权所有 (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat)。
|
||||||
|
|
||||||
`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option.
|
`bat` 可根据 MIT 许可证或 Apache 许可证 2.0 的条款使用,任选其一。
|
||||||
|
|
||||||
See the [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files for license details.
|
有关许可证的详细信息,请参阅 [LICENSE-APACHE](LICENSE-APACHE) 和 [LICENSE-MIT](LICENSE-MIT) 文件。
|
||||||
|
@ -20,6 +20,13 @@ Options:
|
|||||||
* unicode (␇, ␊, ␀, ..)
|
* unicode (␇, ␊, ␀, ..)
|
||||||
* caret (^G, ^J, ^@, ..)
|
* caret (^G, ^J, ^@, ..)
|
||||||
|
|
||||||
|
--binary <behavior>
|
||||||
|
How to treat binary content. (default: no-printing)
|
||||||
|
|
||||||
|
Possible values:
|
||||||
|
* no-printing: do not print any binary content
|
||||||
|
* as-text: treat binary content as normal text
|
||||||
|
|
||||||
-p, --plain...
|
-p, --plain...
|
||||||
Only show plain style, no decorations. This is an alias for '--style=plain'. When '-p' is
|
Only show plain style, no decorations. This is an alias for '--style=plain'. When '-p' is
|
||||||
used twice ('-pp'), it also disables automatic paging (alias for '--style=plain
|
used twice ('-pp'), it also disables automatic paging (alias for '--style=plain
|
||||||
@ -122,6 +129,11 @@ Options:
|
|||||||
--squeeze-limit <squeeze-limit>
|
--squeeze-limit <squeeze-limit>
|
||||||
Set the maximum number of consecutive empty lines to be printed.
|
Set the maximum number of consecutive empty lines to be printed.
|
||||||
|
|
||||||
|
--strip-ansi <when>
|
||||||
|
Specify when to strip ANSI escape sequences from the input. The automatic mode will remove
|
||||||
|
escape sequences unless the syntax highlighting language is plain text. Possible values:
|
||||||
|
auto, always, *never*.
|
||||||
|
|
||||||
--style <components>
|
--style <components>
|
||||||
Configure which elements (line numbers, file headers, grid borders, Git modifications, ..)
|
Configure which elements (line numbers, file headers, grid borders, Git modifications, ..)
|
||||||
to display in addition to the file contents. The argument is a comma-separated list of
|
to display in addition to the file contents. The argument is a comma-separated list of
|
||||||
@ -129,6 +141,12 @@ Options:
|
|||||||
set a default style, add the '--style=".."' option to the configuration file or export the
|
set a default style, add the '--style=".."' option to the configuration file or export the
|
||||||
BAT_STYLE environment variable (e.g.: export BAT_STYLE="..").
|
BAT_STYLE environment variable (e.g.: export BAT_STYLE="..").
|
||||||
|
|
||||||
|
When styles are specified in multiple places, the "nearest" set of styles take precedence.
|
||||||
|
The command-line arguments are the highest priority, followed by the BAT_STYLE environment
|
||||||
|
variable, and then the configuration file. If any set of styles consists entirely of
|
||||||
|
components prefixed with "+" or "-", it will modify the previous set of styles instead of
|
||||||
|
replacing them.
|
||||||
|
|
||||||
By default, the following components are enabled:
|
By default, the following components are enabled:
|
||||||
changes, grid, header-filename, numbers, snip
|
changes, grid, header-filename, numbers, snip
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@ Options:
|
|||||||
Show non-printable characters (space, tab, newline, ..).
|
Show non-printable characters (space, tab, newline, ..).
|
||||||
--nonprintable-notation <notation>
|
--nonprintable-notation <notation>
|
||||||
Set notation for non-printable characters.
|
Set notation for non-printable characters.
|
||||||
|
--binary <behavior>
|
||||||
|
How to treat binary content. (default: no-printing)
|
||||||
-p, --plain...
|
-p, --plain...
|
||||||
Show plain style (alias for '--style=plain').
|
Show plain style (alias for '--style=plain').
|
||||||
-l, --language <language>
|
-l, --language <language>
|
||||||
|
@ -2,11 +2,15 @@ use std::collections::HashSet;
|
|||||||
use std::env;
|
use std::env;
|
||||||
use std::io::IsTerminal;
|
use std::io::IsTerminal;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
clap_app,
|
clap_app,
|
||||||
config::{get_args_from_config_file, get_args_from_env_opts_var, get_args_from_env_vars},
|
config::{get_args_from_config_file, get_args_from_env_opts_var, get_args_from_env_vars},
|
||||||
};
|
};
|
||||||
|
use bat::style::StyleComponentList;
|
||||||
|
use bat::BinaryBehavior;
|
||||||
|
use bat::StripAnsiMode;
|
||||||
use clap::ArgMatches;
|
use clap::ArgMatches;
|
||||||
|
|
||||||
use console::Term;
|
use console::Term;
|
||||||
@ -85,7 +89,6 @@ impl App {
|
|||||||
|
|
||||||
// .. and the rest at the end
|
// .. and the rest at the end
|
||||||
cli_args.for_each(|a| args.push(a));
|
cli_args.for_each(|a| args.push(a));
|
||||||
|
|
||||||
args
|
args
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -104,12 +107,30 @@ impl App {
|
|||||||
|
|
||||||
let style_components = self.style_components(loop_through)?;
|
let style_components = self.style_components(loop_through)?;
|
||||||
|
|
||||||
|
let extra_plain = self.matches.get_count("plain") > 1;
|
||||||
|
let plain_last_index = self
|
||||||
|
.matches
|
||||||
|
.indices_of("plain")
|
||||||
|
.and_then(Iterator::max)
|
||||||
|
.unwrap_or_default();
|
||||||
|
let paging_last_index = self
|
||||||
|
.matches
|
||||||
|
.indices_of("paging")
|
||||||
|
.and_then(Iterator::max)
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
let paging_mode = match self.matches.get_one::<String>("paging").map(|s| s.as_str()) {
|
let paging_mode = match self.matches.get_one::<String>("paging").map(|s| s.as_str()) {
|
||||||
Some("always") => PagingMode::Always,
|
Some("always") => {
|
||||||
|
// Disable paging if the second -p (or -pp) is specified after --paging=always
|
||||||
|
if extra_plain && plain_last_index > paging_last_index {
|
||||||
|
PagingMode::Never
|
||||||
|
} else {
|
||||||
|
PagingMode::Always
|
||||||
|
}
|
||||||
|
}
|
||||||
Some("never") => PagingMode::Never,
|
Some("never") => PagingMode::Never,
|
||||||
Some("auto") | None => {
|
Some("auto") | None => {
|
||||||
// If we have -pp as an option when in auto mode, the pager should be disabled.
|
// If we have -pp as an option when in auto mode, the pager should be disabled.
|
||||||
let extra_plain = self.matches.get_count("plain") > 1;
|
|
||||||
if extra_plain || self.matches.get_flag("no-paging") {
|
if extra_plain || self.matches.get_flag("no-paging") {
|
||||||
PagingMode::Never
|
PagingMode::Never
|
||||||
} else if inputs.iter().any(Input::is_stdin) {
|
} else if inputs.iter().any(Input::is_stdin) {
|
||||||
@ -200,6 +221,11 @@ impl App {
|
|||||||
Some("caret") => NonprintableNotation::Caret,
|
Some("caret") => NonprintableNotation::Caret,
|
||||||
_ => unreachable!("other values for --nonprintable-notation are not allowed"),
|
_ => unreachable!("other values for --nonprintable-notation are not allowed"),
|
||||||
},
|
},
|
||||||
|
binary: match self.matches.get_one::<String>("binary").map(|s| s.as_str()) {
|
||||||
|
Some("as-text") => BinaryBehavior::AsText,
|
||||||
|
Some("no-printing") => BinaryBehavior::NoPrinting,
|
||||||
|
_ => unreachable!("other values for --binary are not allowed"),
|
||||||
|
},
|
||||||
wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
|
wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
|
||||||
if !self.matches.get_flag("chop-long-lines") {
|
if !self.matches.get_flag("chop-long-lines") {
|
||||||
match self.matches.get_one::<String>("wrap").map(|s| s.as_str()) {
|
match self.matches.get_one::<String>("wrap").map(|s| s.as_str()) {
|
||||||
@ -244,6 +270,16 @@ impl App {
|
|||||||
4
|
4
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
strip_ansi: match self
|
||||||
|
.matches
|
||||||
|
.get_one::<String>("strip-ansi")
|
||||||
|
.map(|s| s.as_str())
|
||||||
|
{
|
||||||
|
Some("never") => StripAnsiMode::Never,
|
||||||
|
Some("always") => StripAnsiMode::Always,
|
||||||
|
Some("auto") => StripAnsiMode::Auto,
|
||||||
|
_ => unreachable!("other values for --strip-ansi are not allowed"),
|
||||||
|
},
|
||||||
theme: self
|
theme: self
|
||||||
.matches
|
.matches
|
||||||
.get_one::<String>("theme")
|
.get_one::<String>("theme")
|
||||||
@ -355,34 +391,62 @@ impl App {
|
|||||||
Ok(file_input)
|
Ok(file_input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn forced_style_components(&self) -> Option<StyleComponents> {
|
||||||
|
// No components if `--decorations=never``.
|
||||||
|
if self
|
||||||
|
.matches
|
||||||
|
.get_one::<String>("decorations")
|
||||||
|
.map(|s| s.as_str())
|
||||||
|
== Some("never")
|
||||||
|
{
|
||||||
|
return Some(StyleComponents(HashSet::new()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only line numbers if `--number`.
|
||||||
|
if self.matches.get_flag("number") {
|
||||||
|
return Some(StyleComponents(HashSet::from([
|
||||||
|
StyleComponent::LineNumbers,
|
||||||
|
])));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plain if `--plain` is specified at least once.
|
||||||
|
if self.matches.get_count("plain") > 0 {
|
||||||
|
return Some(StyleComponents(HashSet::from([StyleComponent::Plain])));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default behavior.
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
fn style_components(&self, loop_through: bool) -> Result<StyleComponents> {
|
fn style_components(&self, loop_through: bool) -> Result<StyleComponents> {
|
||||||
let matches = &self.matches;
|
let matches = &self.matches;
|
||||||
let mut styled_components = StyleComponents(
|
let mut styled_components = match self.forced_style_components() {
|
||||||
if matches.get_one::<String>("decorations").map(|s| s.as_str()) == Some("never") {
|
Some(forced_components) => forced_components,
|
||||||
HashSet::new()
|
|
||||||
} else if matches.get_flag("number") {
|
// Parse the `--style` arguments and merge them.
|
||||||
[StyleComponent::LineNumbers].iter().cloned().collect()
|
None if matches.contains_id("style") => {
|
||||||
} else if 0 < matches.get_count("plain") {
|
let lists = matches
|
||||||
[StyleComponent::Plain].iter().cloned().collect()
|
.get_many::<String>("style")
|
||||||
} else {
|
.expect("styles present")
|
||||||
matches
|
.map(|v| StyleComponentList::from_str(v))
|
||||||
.get_one::<String>("style")
|
.collect::<Result<Vec<StyleComponentList>>>()?;
|
||||||
.map(|styles| {
|
|
||||||
styles
|
StyleComponentList::to_components(lists, self.interactive_output, true)
|
||||||
.split(',')
|
}
|
||||||
.map(|style| style.parse::<StyleComponent>())
|
|
||||||
.filter_map(|style| style.ok())
|
// Use the default.
|
||||||
.collect::<Vec<_>>()
|
None => StyleComponents(HashSet::from_iter(
|
||||||
})
|
StyleComponent::Default
|
||||||
.unwrap_or_else(|| vec![StyleComponent::Default])
|
.components(self.interactive_output)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|style| style.components(self.interactive_output, loop_through))
|
.map(|style| style.components(self.interactive_output, loop_through))
|
||||||
.fold(HashSet::new(), |mut acc, components| {
|
.fold(HashSet::new(), |mut acc, components| {
|
||||||
acc.extend(components.iter().cloned());
|
acc.extend(components.iter().cloned());
|
||||||
acc
|
acc
|
||||||
})
|
})
|
||||||
},
|
.cloned(),
|
||||||
);
|
)),
|
||||||
|
};
|
||||||
|
|
||||||
// If `grid` is set, remove `rule` as it is a subset of `grid`, and print a warning.
|
// If `grid` is set, remove `rule` as it is a subset of `grid`, and print a warning.
|
||||||
if styled_components.grid() && styled_components.0.remove(&StyleComponent::Rule) {
|
if styled_components.grid() && styled_components.0.remove(&StyleComponent::Rule) {
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
|
use bat::style::StyleComponentList;
|
||||||
use clap::{
|
use clap::{
|
||||||
crate_name, crate_version, value_parser, Arg, ArgAction, ArgGroup, ColorChoice, Command,
|
crate_name, crate_version, value_parser, Arg, ArgAction, ArgGroup, ColorChoice, Command,
|
||||||
};
|
};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
static VERSION: Lazy<String> = Lazy::new(|| {
|
static VERSION: Lazy<String> = Lazy::new(|| {
|
||||||
#[cfg(feature = "bugreport")]
|
#[cfg(feature = "bugreport")]
|
||||||
@ -75,11 +77,26 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
* caret (^G, ^J, ^@, ..)",
|
* caret (^G, ^J, ^@, ..)",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::new("binary")
|
||||||
|
.long("binary")
|
||||||
|
.action(ArgAction::Set)
|
||||||
|
.default_value("no-printing")
|
||||||
|
.value_parser(["no-printing", "as-text"])
|
||||||
|
.value_name("behavior")
|
||||||
|
.hide_default_value(true)
|
||||||
|
.help("How to treat binary content. (default: no-printing)")
|
||||||
|
.long_help(
|
||||||
|
"How to treat binary content. (default: no-printing)\n\n\
|
||||||
|
Possible values:\n \
|
||||||
|
* no-printing: do not print any binary content\n \
|
||||||
|
* as-text: treat binary content as normal text",
|
||||||
|
),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("plain")
|
Arg::new("plain")
|
||||||
.overrides_with("plain")
|
.overrides_with("plain")
|
||||||
.overrides_with("number")
|
.overrides_with("number")
|
||||||
.overrides_with("paging")
|
|
||||||
.short('p')
|
.short('p')
|
||||||
.long("plain")
|
.long("plain")
|
||||||
.action(ArgAction::Count)
|
.action(ArgAction::Count)
|
||||||
@ -304,7 +321,6 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
.long("paging")
|
.long("paging")
|
||||||
.overrides_with("paging")
|
.overrides_with("paging")
|
||||||
.overrides_with("no-paging")
|
.overrides_with("no-paging")
|
||||||
.overrides_with("plain")
|
|
||||||
.value_name("when")
|
.value_name("when")
|
||||||
.value_parser(["auto", "never", "always"])
|
.value_parser(["auto", "never", "always"])
|
||||||
.default_value("auto")
|
.default_value("auto")
|
||||||
@ -402,37 +418,30 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
.long_help("Set the maximum number of consecutive empty lines to be printed.")
|
.long_help("Set the maximum number of consecutive empty lines to be printed.")
|
||||||
.hide_short_help(true)
|
.hide_short_help(true)
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::new("strip-ansi")
|
||||||
|
.long("strip-ansi")
|
||||||
|
.overrides_with("strip-ansi")
|
||||||
|
.value_name("when")
|
||||||
|
.value_parser(["auto", "always", "never"])
|
||||||
|
.default_value("never")
|
||||||
|
.hide_default_value(true)
|
||||||
|
.help("Strip colors from the input (auto, always, *never*)")
|
||||||
|
.long_help("Specify when to strip ANSI escape sequences from the input. \
|
||||||
|
The automatic mode will remove escape sequences unless the syntax highlighting \
|
||||||
|
language is plain text. Possible values: auto, always, *never*.")
|
||||||
|
.hide_short_help(true)
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new("style")
|
Arg::new("style")
|
||||||
.long("style")
|
.long("style")
|
||||||
|
.action(ArgAction::Append)
|
||||||
.value_name("components")
|
.value_name("components")
|
||||||
.overrides_with("style")
|
|
||||||
.overrides_with("plain")
|
|
||||||
.overrides_with("number")
|
|
||||||
// Cannot use claps built in validation because we have to turn off clap's delimiters
|
// Cannot use claps built in validation because we have to turn off clap's delimiters
|
||||||
.value_parser(|val: &str| {
|
.value_parser(|val: &str| {
|
||||||
let mut invalid_vals = val.split(',').filter(|style| {
|
match StyleComponentList::from_str(val) {
|
||||||
!&[
|
Err(err) => Err(err),
|
||||||
"auto",
|
Ok(_) => Ok(val.to_owned()),
|
||||||
"full",
|
|
||||||
"default",
|
|
||||||
"plain",
|
|
||||||
"header",
|
|
||||||
"header-filename",
|
|
||||||
"header-filesize",
|
|
||||||
"grid",
|
|
||||||
"rule",
|
|
||||||
"numbers",
|
|
||||||
"snip",
|
|
||||||
#[cfg(feature = "git")]
|
|
||||||
"changes",
|
|
||||||
].contains(style)
|
|
||||||
});
|
|
||||||
|
|
||||||
if let Some(invalid) = invalid_vals.next() {
|
|
||||||
Err(format!("Unknown style, '{invalid}'"))
|
|
||||||
} else {
|
|
||||||
Ok(val.to_owned())
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.help(
|
.help(
|
||||||
@ -447,6 +456,12 @@ pub fn build_app(interactive_output: bool) -> Command {
|
|||||||
pre-defined style ('full'). To set a default style, add the \
|
pre-defined style ('full'). To set a default style, add the \
|
||||||
'--style=\"..\"' option to the configuration file or export the \
|
'--style=\"..\"' option to the configuration file or export the \
|
||||||
BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
|
BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\
|
||||||
|
When styles are specified in multiple places, the \"nearest\" set \
|
||||||
|
of styles take precedence. The command-line arguments are the highest \
|
||||||
|
priority, followed by the BAT_STYLE environment variable, and then \
|
||||||
|
the configuration file. If any set of styles consists entirely of \
|
||||||
|
components prefixed with \"+\" or \"-\", it will modify the \
|
||||||
|
previous set of styles instead of replacing them.\n\n\
|
||||||
By default, the following components are enabled:\n \
|
By default, the following components are enabled:\n \
|
||||||
changes, grid, header-filename, numbers, snip\n\n\
|
changes, grid, header-filename, numbers, snip\n\n\
|
||||||
Possible values:\n\n \
|
Possible values:\n\n \
|
||||||
|
@ -146,8 +146,11 @@ pub fn get_args_from_env_vars() -> Vec<OsString> {
|
|||||||
("--style", "BAT_STYLE"),
|
("--style", "BAT_STYLE"),
|
||||||
]
|
]
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|(flag, key)| env::var(key).ok().map(|var| [flag.to_string(), var]))
|
.filter_map(|(flag, key)| {
|
||||||
.flatten()
|
env::var(key)
|
||||||
|
.ok()
|
||||||
|
.map(|var| [flag.to_string(), var].join("="))
|
||||||
|
})
|
||||||
.map(|a| a.into())
|
.map(|a| a.into())
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ pub fn list_themes(cfg: &Config, config_dir: &Path, cache_dir: &Path) -> Result<
|
|||||||
|
|
||||||
let default_theme = HighlightingAssets::default_theme();
|
let default_theme = HighlightingAssets::default_theme();
|
||||||
for theme in assets.themes() {
|
for theme in assets.themes() {
|
||||||
let default_theme_info = if default_theme == theme {
|
let default_theme_info = if !config.loop_through && default_theme == theme {
|
||||||
" (default)"
|
" (default)"
|
||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
use crate::line_range::{HighlightedLineRanges, LineRanges};
|
use crate::line_range::{HighlightedLineRanges, LineRanges};
|
||||||
use crate::nonprintable_notation::NonprintableNotation;
|
use crate::nonprintable_notation::{BinaryBehavior, NonprintableNotation};
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
use crate::paging::PagingMode;
|
use crate::paging::PagingMode;
|
||||||
use crate::style::StyleComponents;
|
use crate::style::StyleComponents;
|
||||||
use crate::syntax_mapping::SyntaxMapping;
|
use crate::syntax_mapping::SyntaxMapping;
|
||||||
use crate::wrapping::WrappingMode;
|
use crate::wrapping::WrappingMode;
|
||||||
|
use crate::StripAnsiMode;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum VisibleLines {
|
pub enum VisibleLines {
|
||||||
@ -43,6 +44,9 @@ pub struct Config<'a> {
|
|||||||
/// The configured notation for non-printable characters
|
/// The configured notation for non-printable characters
|
||||||
pub nonprintable_notation: NonprintableNotation,
|
pub nonprintable_notation: NonprintableNotation,
|
||||||
|
|
||||||
|
/// How to treat binary content
|
||||||
|
pub binary: BinaryBehavior,
|
||||||
|
|
||||||
/// The character width of the terminal
|
/// The character width of the terminal
|
||||||
pub term_width: usize,
|
pub term_width: usize,
|
||||||
|
|
||||||
@ -100,6 +104,9 @@ pub struct Config<'a> {
|
|||||||
|
|
||||||
/// The maximum number of consecutive empty lines to display
|
/// The maximum number of consecutive empty lines to display
|
||||||
pub squeeze_lines: Option<usize>,
|
pub squeeze_lines: Option<usize>,
|
||||||
|
|
||||||
|
// Weather or not to set terminal title when using a pager
|
||||||
|
pub strip_ansi: StripAnsiMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(feature = "minimal-application", feature = "paging"))]
|
#[cfg(all(feature = "minimal-application", feature = "paging"))]
|
||||||
|
@ -52,7 +52,8 @@ mod terminal;
|
|||||||
mod vscreen;
|
mod vscreen;
|
||||||
pub(crate) mod wrapping;
|
pub(crate) mod wrapping;
|
||||||
|
|
||||||
pub use nonprintable_notation::NonprintableNotation;
|
pub use nonprintable_notation::{BinaryBehavior, NonprintableNotation};
|
||||||
|
pub use preprocessor::StripAnsiMode;
|
||||||
pub use pretty_printer::{Input, PrettyPrinter, Syntax};
|
pub use pretty_printer::{Input, PrettyPrinter, Syntax};
|
||||||
pub use syntax_mapping::{MappingTarget, SyntaxMapping};
|
pub use syntax_mapping::{MappingTarget, SyntaxMapping};
|
||||||
pub use wrapping::WrappingMode;
|
pub use wrapping::WrappingMode;
|
||||||
|
@ -10,3 +10,15 @@ pub enum NonprintableNotation {
|
|||||||
#[default]
|
#[default]
|
||||||
Unicode,
|
Unicode,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// How to treat binary content
|
||||||
|
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub enum BinaryBehavior {
|
||||||
|
/// Do not print any binary content
|
||||||
|
#[default]
|
||||||
|
NoPrinting,
|
||||||
|
|
||||||
|
/// Treat binary content as normal text
|
||||||
|
AsText,
|
||||||
|
}
|
||||||
|
@ -1,17 +1,18 @@
|
|||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
use console::AnsiCodeIterator;
|
use crate::{
|
||||||
|
nonprintable_notation::NonprintableNotation,
|
||||||
use crate::nonprintable_notation::NonprintableNotation;
|
vscreen::{EscapeSequenceOffsets, EscapeSequenceOffsetsIterator},
|
||||||
|
};
|
||||||
|
|
||||||
/// Expand tabs like an ANSI-enabled expand(1).
|
/// Expand tabs like an ANSI-enabled expand(1).
|
||||||
pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String {
|
pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String {
|
||||||
let mut buffer = String::with_capacity(line.len() * 2);
|
let mut buffer = String::with_capacity(line.len() * 2);
|
||||||
|
|
||||||
for chunk in AnsiCodeIterator::new(line) {
|
for seq in EscapeSequenceOffsetsIterator::new(line) {
|
||||||
match chunk {
|
match seq {
|
||||||
(text, true) => buffer.push_str(text),
|
EscapeSequenceOffsets::Text { .. } => {
|
||||||
(mut text, false) => {
|
let mut text = &line[seq.index_of_start()..seq.index_past_end()];
|
||||||
while let Some(index) = text.find('\t') {
|
while let Some(index) = text.find('\t') {
|
||||||
// Add previous text.
|
// Add previous text.
|
||||||
if index > 0 {
|
if index > 0 {
|
||||||
@ -31,6 +32,10 @@ pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String {
|
|||||||
*cursor += text.len();
|
*cursor += text.len();
|
||||||
buffer.push_str(text);
|
buffer.push_str(text);
|
||||||
}
|
}
|
||||||
|
_ => {
|
||||||
|
// Copy the ANSI escape sequence.
|
||||||
|
buffer.push_str(&line[seq.index_of_start()..seq.index_past_end()])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,6 +136,27 @@ pub fn replace_nonprintable(
|
|||||||
output
|
output
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Strips ANSI escape sequences from the input.
|
||||||
|
pub fn strip_ansi(line: &str) -> String {
|
||||||
|
let mut buffer = String::with_capacity(line.len());
|
||||||
|
|
||||||
|
for seq in EscapeSequenceOffsetsIterator::new(line) {
|
||||||
|
if let EscapeSequenceOffsets::Text { .. } = seq {
|
||||||
|
buffer.push_str(&line[seq.index_of_start()..seq.index_past_end()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Clone, Copy, Default)]
|
||||||
|
pub enum StripAnsiMode {
|
||||||
|
#[default]
|
||||||
|
Never,
|
||||||
|
Always,
|
||||||
|
Auto,
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_try_parse_utf8_char() {
|
fn test_try_parse_utf8_char() {
|
||||||
assert_eq!(try_parse_utf8_char(&[0x20]), Some((' ', 1)));
|
assert_eq!(try_parse_utf8_char(&[0x20]), Some((' ', 1)));
|
||||||
@ -174,3 +200,14 @@ fn test_try_parse_utf8_char() {
|
|||||||
assert_eq!(try_parse_utf8_char(&[0xef, 0x20]), None);
|
assert_eq!(try_parse_utf8_char(&[0xef, 0x20]), None);
|
||||||
assert_eq!(try_parse_utf8_char(&[0xf0, 0xf0]), None);
|
assert_eq!(try_parse_utf8_char(&[0xf0, 0xf0]), None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_strip_ansi() {
|
||||||
|
// The sequence detection is covered by the tests in the vscreen module.
|
||||||
|
assert_eq!(strip_ansi("no ansi"), "no ansi");
|
||||||
|
assert_eq!(strip_ansi("\x1B[33mone"), "one");
|
||||||
|
assert_eq!(
|
||||||
|
strip_ansi("\x1B]1\x07multiple\x1B[J sequences"),
|
||||||
|
"multiple sequences"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -11,7 +11,7 @@ use crate::{
|
|||||||
input,
|
input,
|
||||||
line_range::{HighlightedLineRanges, LineRange, LineRanges},
|
line_range::{HighlightedLineRanges, LineRange, LineRanges},
|
||||||
style::StyleComponent,
|
style::StyleComponent,
|
||||||
SyntaxMapping, WrappingMode,
|
StripAnsiMode, SyntaxMapping, WrappingMode,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "paging")]
|
#[cfg(feature = "paging")]
|
||||||
@ -182,6 +182,15 @@ impl<'a> PrettyPrinter<'a> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether to remove ANSI escape sequences from the input (default: never)
|
||||||
|
///
|
||||||
|
/// If `Auto` is used, escape sequences will only be removed when the input
|
||||||
|
/// is not plain text.
|
||||||
|
pub fn strip_ansi(&mut self, mode: StripAnsiMode) -> &mut Self {
|
||||||
|
self.config.strip_ansi = mode;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Text wrapping mode (default: do not wrap)
|
/// Text wrapping mode (default: do not wrap)
|
||||||
pub fn wrapping_mode(&mut self, mode: WrappingMode) -> &mut Self {
|
pub fn wrapping_mode(&mut self, mode: WrappingMode) -> &mut Self {
|
||||||
self.config.wrapping_mode = mode;
|
self.config.wrapping_mode = mode;
|
||||||
|
@ -30,11 +30,14 @@ use crate::diff::LineChanges;
|
|||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
use crate::input::OpenedInput;
|
use crate::input::OpenedInput;
|
||||||
use crate::line_range::RangeCheckResult;
|
use crate::line_range::RangeCheckResult;
|
||||||
|
use crate::preprocessor::strip_ansi;
|
||||||
use crate::preprocessor::{expand_tabs, replace_nonprintable};
|
use crate::preprocessor::{expand_tabs, replace_nonprintable};
|
||||||
use crate::style::StyleComponent;
|
use crate::style::StyleComponent;
|
||||||
use crate::terminal::{as_terminal_escaped, to_ansi_color};
|
use crate::terminal::{as_terminal_escaped, to_ansi_color};
|
||||||
use crate::vscreen::{AnsiStyle, EscapeSequence, EscapeSequenceIterator};
|
use crate::vscreen::{AnsiStyle, EscapeSequence, EscapeSequenceIterator};
|
||||||
use crate::wrapping::WrappingMode;
|
use crate::wrapping::WrappingMode;
|
||||||
|
use crate::BinaryBehavior;
|
||||||
|
use crate::StripAnsiMode;
|
||||||
|
|
||||||
const ANSI_UNDERLINE_ENABLE: EscapeSequence = EscapeSequence::CSI {
|
const ANSI_UNDERLINE_ENABLE: EscapeSequence = EscapeSequence::CSI {
|
||||||
raw_sequence: "\x1B[4m",
|
raw_sequence: "\x1B[4m",
|
||||||
@ -219,6 +222,7 @@ pub(crate) struct InteractivePrinter<'a> {
|
|||||||
highlighter_from_set: Option<HighlighterFromSet<'a>>,
|
highlighter_from_set: Option<HighlighterFromSet<'a>>,
|
||||||
background_color_highlight: Option<Color>,
|
background_color_highlight: Option<Color>,
|
||||||
consecutive_empty_lines: usize,
|
consecutive_empty_lines: usize,
|
||||||
|
strip_ansi: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> InteractivePrinter<'a> {
|
impl<'a> InteractivePrinter<'a> {
|
||||||
@ -277,20 +281,42 @@ impl<'a> InteractivePrinter<'a> {
|
|||||||
.content_type
|
.content_type
|
||||||
.map_or(false, |c| c.is_binary() && !config.show_nonprintable);
|
.map_or(false, |c| c.is_binary() && !config.show_nonprintable);
|
||||||
|
|
||||||
let highlighter_from_set = if is_printing_binary || !config.colored_output {
|
let needs_to_match_syntax = (!is_printing_binary
|
||||||
None
|
|| matches!(config.binary, BinaryBehavior::AsText))
|
||||||
} else {
|
&& (config.colored_output || config.strip_ansi == StripAnsiMode::Auto);
|
||||||
|
|
||||||
|
let (is_plain_text, highlighter_from_set) = if needs_to_match_syntax {
|
||||||
// Determine the type of syntax for highlighting
|
// Determine the type of syntax for highlighting
|
||||||
let syntax_in_set =
|
const PLAIN_TEXT_SYNTAX: &str = "Plain Text";
|
||||||
match assets.get_syntax(config.language, input, &config.syntax_mapping) {
|
match assets.get_syntax(config.language, input, &config.syntax_mapping) {
|
||||||
Ok(syntax_in_set) => syntax_in_set,
|
Ok(syntax_in_set) => (
|
||||||
Err(Error::UndetectedSyntax(_)) => assets
|
syntax_in_set.syntax.name == PLAIN_TEXT_SYNTAX,
|
||||||
.find_syntax_by_name("Plain Text")?
|
Some(HighlighterFromSet::new(syntax_in_set, theme)),
|
||||||
|
),
|
||||||
|
|
||||||
|
Err(Error::UndetectedSyntax(_)) => (
|
||||||
|
true,
|
||||||
|
Some(
|
||||||
|
assets
|
||||||
|
.find_syntax_by_name(PLAIN_TEXT_SYNTAX)?
|
||||||
|
.map(|s| HighlighterFromSet::new(s, theme))
|
||||||
.expect("A plain text syntax is available"),
|
.expect("A plain text syntax is available"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
Err(e) => return Err(e),
|
Err(e) => return Err(e),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(false, None)
|
||||||
};
|
};
|
||||||
|
|
||||||
Some(HighlighterFromSet::new(syntax_in_set, theme))
|
// Determine when to strip ANSI sequences
|
||||||
|
let strip_ansi = match config.strip_ansi {
|
||||||
|
_ if config.show_nonprintable => false,
|
||||||
|
StripAnsiMode::Always => true,
|
||||||
|
StripAnsiMode::Auto if is_plain_text => false, // Plain text may already contain escape sequences.
|
||||||
|
StripAnsiMode::Auto => true,
|
||||||
|
_ => false,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(InteractivePrinter {
|
Ok(InteractivePrinter {
|
||||||
@ -305,6 +331,7 @@ impl<'a> InteractivePrinter<'a> {
|
|||||||
highlighter_from_set,
|
highlighter_from_set,
|
||||||
background_color_highlight,
|
background_color_highlight,
|
||||||
consecutive_empty_lines: 0,
|
consecutive_empty_lines: 0,
|
||||||
|
strip_ansi,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,7 +472,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !self.config.style_components.header() {
|
if !self.config.style_components.header() {
|
||||||
if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable {
|
if Some(ContentType::BINARY) == self.content_type
|
||||||
|
&& !self.config.show_nonprintable
|
||||||
|
&& !matches!(self.config.binary, BinaryBehavior::AsText)
|
||||||
|
{
|
||||||
writeln!(
|
writeln!(
|
||||||
handle,
|
handle,
|
||||||
"{}: Binary content from {} will not be printed to the terminal \
|
"{}: Binary content from {} will not be printed to the terminal \
|
||||||
@ -526,7 +556,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
if self.config.style_components.grid() {
|
if self.config.style_components.grid() {
|
||||||
if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
|
if self.content_type.map_or(false, |c| c.is_text())
|
||||||
|
|| self.config.show_nonprintable
|
||||||
|
|| matches!(self.config.binary, BinaryBehavior::AsText)
|
||||||
|
{
|
||||||
self.print_horizontal_line(handle, '┼')?;
|
self.print_horizontal_line(handle, '┼')?;
|
||||||
} else {
|
} else {
|
||||||
self.print_horizontal_line(handle, '┴')?;
|
self.print_horizontal_line(handle, '┴')?;
|
||||||
@ -538,7 +571,9 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
|
|
||||||
fn print_footer(&mut self, handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> {
|
fn print_footer(&mut self, handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> {
|
||||||
if self.config.style_components.grid()
|
if self.config.style_components.grid()
|
||||||
&& (self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable)
|
&& (self.content_type.map_or(false, |c| c.is_text())
|
||||||
|
|| self.config.show_nonprintable
|
||||||
|
|| matches!(self.config.binary, BinaryBehavior::AsText))
|
||||||
{
|
{
|
||||||
self.print_horizontal_line(handle, '┴')
|
self.print_horizontal_line(handle, '┴')
|
||||||
} else {
|
} else {
|
||||||
@ -585,8 +620,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
)
|
)
|
||||||
.into()
|
.into()
|
||||||
} else {
|
} else {
|
||||||
match self.content_type {
|
let mut line = match self.content_type {
|
||||||
Some(ContentType::BINARY) | None => {
|
Some(ContentType::BINARY) | None
|
||||||
|
if !matches!(self.config.binary, BinaryBehavior::AsText) =>
|
||||||
|
{
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
Some(ContentType::UTF_16LE) => UTF_16LE.decode_with_bom_removal(line_buffer).0,
|
Some(ContentType::UTF_16LE) => UTF_16LE.decode_with_bom_removal(line_buffer).0,
|
||||||
@ -602,7 +639,14 @@ impl<'a> Printer for InteractivePrinter<'a> {
|
|||||||
line
|
line
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// If ANSI escape sequences are supposed to be stripped, do it before syntax highlighting.
|
||||||
|
if self.strip_ansi {
|
||||||
|
line = strip_ansi(&line).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
line
|
||||||
};
|
};
|
||||||
|
|
||||||
let regions = self.highlight_regions_for_line(&line)?;
|
let regions = self.highlight_regions_for_line(&line)?;
|
||||||
|
224
src/style.rs
224
src/style.rs
@ -152,3 +152,227 @@ impl StyleComponents {
|
|||||||
self.0.clear();
|
self.0.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
enum ComponentAction {
|
||||||
|
Override,
|
||||||
|
Add,
|
||||||
|
Remove,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ComponentAction {
|
||||||
|
fn extract_from_str(string: &str) -> (ComponentAction, &str) {
|
||||||
|
match string.chars().next() {
|
||||||
|
Some('-') => (ComponentAction::Remove, string.strip_prefix('-').unwrap()),
|
||||||
|
Some('+') => (ComponentAction::Add, string.strip_prefix('+').unwrap()),
|
||||||
|
_ => (ComponentAction::Override, string),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A list of [StyleComponent] that can be parsed from a string.
|
||||||
|
pub struct StyleComponentList(Vec<(ComponentAction, StyleComponent)>);
|
||||||
|
|
||||||
|
impl StyleComponentList {
|
||||||
|
fn expand_into(&self, components: &mut HashSet<StyleComponent>, interactive_terminal: bool) {
|
||||||
|
for (action, component) in self.0.iter() {
|
||||||
|
let subcomponents = component.components(interactive_terminal);
|
||||||
|
|
||||||
|
use ComponentAction::*;
|
||||||
|
match action {
|
||||||
|
Override | Add => components.extend(subcomponents),
|
||||||
|
Remove => components.retain(|c| !subcomponents.contains(c)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` if any component in the list was not prefixed with `+` or `-`.
|
||||||
|
fn contains_override(&self) -> bool {
|
||||||
|
self.0.iter().any(|(a, _)| *a == ComponentAction::Override)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Combines multiple [StyleComponentList]s into a single [StyleComponents] set.
|
||||||
|
///
|
||||||
|
/// ## Precedence
|
||||||
|
/// The most recent list will take precedence and override all previous lists
|
||||||
|
/// unless it only contains components prefixed with `-` or `+`. When this
|
||||||
|
/// happens, the list's components will be merged into the previous list.
|
||||||
|
///
|
||||||
|
/// ## Example
|
||||||
|
/// ```text
|
||||||
|
/// [numbers,grid] + [header,changes] -> [header,changes]
|
||||||
|
/// [numbers,grid] + [+header,-grid] -> [numbers,header]
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ## Parameters
|
||||||
|
/// - `with_default`: If true, the styles lists will build upon the StyleComponent::Auto style.
|
||||||
|
pub fn to_components(
|
||||||
|
lists: impl IntoIterator<Item = StyleComponentList>,
|
||||||
|
interactive_terminal: bool,
|
||||||
|
with_default: bool,
|
||||||
|
) -> StyleComponents {
|
||||||
|
let mut components: HashSet<StyleComponent> = HashSet::new();
|
||||||
|
if with_default {
|
||||||
|
components.extend(StyleComponent::Auto.components(interactive_terminal))
|
||||||
|
}
|
||||||
|
|
||||||
|
StyleComponents(lists.into_iter().fold(components, |mut components, list| {
|
||||||
|
if list.contains_override() {
|
||||||
|
components.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
list.expand_into(&mut components, interactive_terminal);
|
||||||
|
components
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for StyleComponentList {
|
||||||
|
fn default() -> Self {
|
||||||
|
StyleComponentList(vec![(ComponentAction::Override, StyleComponent::Default)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for StyleComponentList {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self> {
|
||||||
|
Ok(StyleComponentList(
|
||||||
|
s.split(",")
|
||||||
|
.map(|s| ComponentAction::extract_from_str(s)) // If the component starts with "-", it's meant to be removed
|
||||||
|
.map(|(a, s)| Ok((a, StyleComponent::from_str(s)?)))
|
||||||
|
.collect::<Result<Vec<(ComponentAction, StyleComponent)>>>()?,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use std::collections::HashSet;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use super::ComponentAction::*;
|
||||||
|
use super::StyleComponent;
|
||||||
|
use super::StyleComponent::*;
|
||||||
|
use super::StyleComponentList;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_parse() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::from_str("grid,+numbers,snip,-snip,header")
|
||||||
|
.expect("no error")
|
||||||
|
.0,
|
||||||
|
vec![
|
||||||
|
(Override, Grid),
|
||||||
|
(Add, LineNumbers),
|
||||||
|
(Override, Snip),
|
||||||
|
(Remove, Snip),
|
||||||
|
(Override, Header),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
assert!(StyleComponentList::from_str("not-a-component").is_err());
|
||||||
|
assert!(StyleComponentList::from_str("grid,not-a-component").is_err());
|
||||||
|
assert!(StyleComponentList::from_str("numbers,-not-a-component").is_err());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_to_components() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::to_components(
|
||||||
|
vec![StyleComponentList::from_str("grid,numbers").expect("no error")],
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
HashSet::from([Grid, LineNumbers])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_to_components_removes_negated() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::to_components(
|
||||||
|
vec![StyleComponentList::from_str("grid,numbers,-grid").expect("no error")],
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
HashSet::from([LineNumbers])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_to_components_expands_subcomponents() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::to_components(
|
||||||
|
vec![StyleComponentList::from_str("full").expect("no error")],
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
HashSet::from_iter(Full.components(true).to_owned())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_expand_negates_subcomponents() {
|
||||||
|
assert!(!StyleComponentList::to_components(
|
||||||
|
vec![StyleComponentList::from_str("full,-numbers").expect("no error")],
|
||||||
|
true,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
.numbers());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_to_components_precedence_overrides_previous_lists() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::to_components(
|
||||||
|
vec![
|
||||||
|
StyleComponentList::from_str("grid").expect("no error"),
|
||||||
|
StyleComponentList::from_str("numbers").expect("no error"),
|
||||||
|
],
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
HashSet::from([LineNumbers])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_to_components_precedence_merges_previous_lists() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::to_components(
|
||||||
|
vec![
|
||||||
|
StyleComponentList::from_str("grid,header").expect("no error"),
|
||||||
|
StyleComponentList::from_str("-grid").expect("no error"),
|
||||||
|
StyleComponentList::from_str("+numbers").expect("no error"),
|
||||||
|
],
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
HashSet::from([HeaderFilename, LineNumbers])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn style_component_list_default_builds_on_auto() {
|
||||||
|
assert_eq!(
|
||||||
|
StyleComponentList::to_components(
|
||||||
|
vec![StyleComponentList::from_str("-numbers").expect("no error"),],
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
.0,
|
||||||
|
{
|
||||||
|
let mut expected: HashSet<StyleComponent> = HashSet::new();
|
||||||
|
expected.extend(Auto.components(true));
|
||||||
|
expected.remove(&LineNumbers);
|
||||||
|
expected
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
3
src/syntax_mapping/builtins/common/50-diff.toml
Normal file
3
src/syntax_mapping/builtins/common/50-diff.toml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# .debdiff is the extension used for diffs in Debian packaging
|
||||||
|
[mappings]
|
||||||
|
"Diff" = ["*.debdiff"]
|
@ -1,3 +1,3 @@
|
|||||||
# JSON Lines is a simple variation of JSON #2535
|
# JSON Lines is a simple variation of JSON #2535
|
||||||
[mappings]
|
[mappings]
|
||||||
"JSON" = ["*.jsonl", "*.jsonc"]
|
"JSON" = ["*.jsonl", "*.jsonc", "*.jsonld", "*.geojson"]
|
||||||
|
2
src/syntax_mapping/builtins/common/50-markdown.toml
Normal file
2
src/syntax_mapping/builtins/common/50-markdown.toml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[mappings]
|
||||||
|
"Markdown" = ["*.mkd"]
|
2
src/syntax_mapping/builtins/linux/50-kubernetes.toml
Normal file
2
src/syntax_mapping/builtins/linux/50-kubernetes.toml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[mappings]
|
||||||
|
"YAML" = ["/etc/kubernetes/*.conf"]
|
@ -1,3 +1,8 @@
|
|||||||
[mappings]
|
[mappings]
|
||||||
# pacman hooks
|
"INI" = [
|
||||||
"INI" = ["/usr/share/libalpm/hooks/*.hook", "/etc/pacman.d/hooks/*.hook"]
|
# config
|
||||||
|
"/etc/pacman.conf",
|
||||||
|
# hooks
|
||||||
|
"/usr/share/libalpm/hooks/*.hook",
|
||||||
|
"/etc/pacman.d/hooks/*.hook",
|
||||||
|
]
|
||||||
|
@ -285,7 +285,7 @@ fn join(
|
|||||||
|
|
||||||
/// A range of indices for a raw ANSI escape sequence.
|
/// A range of indices for a raw ANSI escape sequence.
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
enum EscapeSequenceOffsets {
|
pub enum EscapeSequenceOffsets {
|
||||||
Text {
|
Text {
|
||||||
start: usize,
|
start: usize,
|
||||||
end: usize,
|
end: usize,
|
||||||
@ -320,6 +320,32 @@ enum EscapeSequenceOffsets {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl EscapeSequenceOffsets {
|
||||||
|
/// Returns the byte-index of the first character in the escape sequence.
|
||||||
|
pub fn index_of_start(&self) -> usize {
|
||||||
|
use EscapeSequenceOffsets::*;
|
||||||
|
match self {
|
||||||
|
Text { start, .. } => *start,
|
||||||
|
Unknown { start, .. } => *start,
|
||||||
|
NF { start_sequence, .. } => *start_sequence,
|
||||||
|
OSC { start_sequence, .. } => *start_sequence,
|
||||||
|
CSI { start_sequence, .. } => *start_sequence,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the byte-index past the last character in the escape sequence.
|
||||||
|
pub fn index_past_end(&self) -> usize {
|
||||||
|
use EscapeSequenceOffsets::*;
|
||||||
|
match self {
|
||||||
|
Text { end, .. } => *end,
|
||||||
|
Unknown { end, .. } => *end,
|
||||||
|
NF { end, .. } => *end,
|
||||||
|
OSC { end, .. } => *end,
|
||||||
|
CSI { end, .. } => *end,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An iterator over the offests of ANSI/VT escape sequences within a string.
|
/// An iterator over the offests of ANSI/VT escape sequences within a string.
|
||||||
///
|
///
|
||||||
/// ## Example
|
/// ## Example
|
||||||
@ -327,7 +353,7 @@ enum EscapeSequenceOffsets {
|
|||||||
/// ```ignore
|
/// ```ignore
|
||||||
/// let iter = EscapeSequenceOffsetsIterator::new("\x1B[33mThis is yellow text.\x1B[m");
|
/// let iter = EscapeSequenceOffsetsIterator::new("\x1B[33mThis is yellow text.\x1B[m");
|
||||||
/// ```
|
/// ```
|
||||||
struct EscapeSequenceOffsetsIterator<'a> {
|
pub struct EscapeSequenceOffsetsIterator<'a> {
|
||||||
text: &'a str,
|
text: &'a str,
|
||||||
chars: Peekable<CharIndices<'a>>,
|
chars: Peekable<CharIndices<'a>>,
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ use tempfile::tempdir;
|
|||||||
mod unix {
|
mod unix {
|
||||||
pub use std::fs::File;
|
pub use std::fs::File;
|
||||||
pub use std::io::{self, Write};
|
pub use std::io::{self, Write};
|
||||||
pub use std::os::unix::io::FromRawFd;
|
|
||||||
pub use std::path::PathBuf;
|
pub use std::path::PathBuf;
|
||||||
pub use std::process::Stdio;
|
pub use std::process::Stdio;
|
||||||
pub use std::thread;
|
pub use std::thread;
|
||||||
@ -300,6 +299,7 @@ fn list_themes_without_colors() {
|
|||||||
|
|
||||||
bat()
|
bat()
|
||||||
.arg("--color=never")
|
.arg("--color=never")
|
||||||
|
.arg("--decorations=always") // trick bat into setting `Config::loop_through` to false
|
||||||
.arg("--list-themes")
|
.arg("--list-themes")
|
||||||
.assert()
|
.assert()
|
||||||
.success()
|
.success()
|
||||||
@ -307,6 +307,15 @@ fn list_themes_without_colors() {
|
|||||||
.stdout(predicate::str::contains(default_theme_chunk).normalize());
|
.stdout(predicate::str::contains(default_theme_chunk).normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn list_themes_to_piped_output() {
|
||||||
|
bat()
|
||||||
|
.arg("--list-themes")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(predicate::str::contains("(default)").not());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg_attr(any(not(feature = "git"), target_os = "windows"), ignore)]
|
#[cfg_attr(any(not(feature = "git"), target_os = "windows"), ignore)]
|
||||||
fn short_help() {
|
fn short_help() {
|
||||||
@ -406,8 +415,8 @@ fn no_args_doesnt_break() {
|
|||||||
// not exit, because in this case it is safe to read and write to the same fd, which is why
|
// not exit, because in this case it is safe to read and write to the same fd, which is why
|
||||||
// this test exists.
|
// this test exists.
|
||||||
let OpenptyResult { master, slave } = openpty(None, None).expect("Couldn't open pty.");
|
let OpenptyResult { master, slave } = openpty(None, None).expect("Couldn't open pty.");
|
||||||
let mut master = unsafe { File::from_raw_fd(master) };
|
let mut master = File::from(master);
|
||||||
let stdin_file = unsafe { File::from_raw_fd(slave) };
|
let stdin_file = File::from(slave);
|
||||||
let stdout_file = stdin_file.try_clone().unwrap();
|
let stdout_file = stdin_file.try_clone().unwrap();
|
||||||
let stdin = Stdio::from(stdin_file);
|
let stdin = Stdio::from(stdin_file);
|
||||||
let stdout = Stdio::from(stdout_file);
|
let stdout = Stdio::from(stdout_file);
|
||||||
@ -1010,6 +1019,31 @@ fn enable_pager_if_pp_flag_comes_before_paging() {
|
|||||||
.stdout(predicate::eq("pager-output\n").normalize());
|
.stdout(predicate::eq("pager-output\n").normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn paging_does_not_override_simple_plain() {
|
||||||
|
bat()
|
||||||
|
.env("PAGER", "echo pager-output")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--plain")
|
||||||
|
.arg("--paging=never")
|
||||||
|
.arg("test.txt")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(predicate::eq("hello world\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simple_plain_does_not_override_paging() {
|
||||||
|
bat()
|
||||||
|
.env("PAGER", "echo pager-output")
|
||||||
|
.arg("--paging=always")
|
||||||
|
.arg("--plain")
|
||||||
|
.arg("test.txt")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(predicate::eq("pager-output\n"));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn pager_failed_to_parse() {
|
fn pager_failed_to_parse() {
|
||||||
bat()
|
bat()
|
||||||
@ -1929,6 +1963,16 @@ fn show_all_with_unicode() {
|
|||||||
.stderr("");
|
.stderr("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn binary_as_text() {
|
||||||
|
bat()
|
||||||
|
.arg("--binary=as-text")
|
||||||
|
.arg("control_characters.txt")
|
||||||
|
.assert()
|
||||||
|
.stdout("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x7F")
|
||||||
|
.stderr("");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn no_paging_arg() {
|
fn no_paging_arg() {
|
||||||
bat()
|
bat()
|
||||||
@ -2677,5 +2721,214 @@ fn piped_output_with_lines() {
|
|||||||
.assert()
|
.assert()
|
||||||
.success()
|
.success()
|
||||||
.stdout(expected)
|
.stdout(expected)
|
||||||
|
|
||||||
|
fn strip_ansi_always_strips_ansi() {
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=always")
|
||||||
|
.write_stdin("\x1B[33mYellow\x1B[m")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout("Yellow");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_never_does_not_strip_ansi() {
|
||||||
|
let output = String::from_utf8(
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=never")
|
||||||
|
.write_stdin("\x1B[33mYellow\x1B[m")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.get_output()
|
||||||
|
.stdout
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.expect("valid utf8");
|
||||||
|
|
||||||
|
assert!(output.contains("\x1B[33mYellow"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_does_not_affect_simple_printer() {
|
||||||
|
let output = String::from_utf8(
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=never")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=always")
|
||||||
|
.write_stdin("\x1B[33mYellow\x1B[m")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.get_output()
|
||||||
|
.stdout
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.expect("valid utf8");
|
||||||
|
|
||||||
|
assert!(output.contains("\x1B[33mYellow"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_does_not_strip_when_show_nonprintable() {
|
||||||
|
let output = String::from_utf8(
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=never")
|
||||||
|
.arg("--color=always")
|
||||||
|
.arg("--strip-ansi=always")
|
||||||
|
.arg("--show-nonprintable")
|
||||||
|
.write_stdin("\x1B[33mY")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.get_output()
|
||||||
|
.stdout
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.expect("valid utf8");
|
||||||
|
|
||||||
|
assert!(output.contains("␛"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_auto_strips_ansi_when_detected_syntax_by_filename() {
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=auto")
|
||||||
|
.arg("--file-name=test.rs")
|
||||||
|
.write_stdin("fn \x1B[33mYellow\x1B[m() -> () {}")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout("fn Yellow() -> () {}");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_auto_strips_ansi_when_provided_syntax_by_option() {
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=auto")
|
||||||
|
.arg("--language=rust")
|
||||||
|
.write_stdin("fn \x1B[33mYellow\x1B[m() -> () {}")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout("fn Yellow() -> () {}");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_auto_does_not_strip_when_plain_text_by_filename() {
|
||||||
|
let output = String::from_utf8(
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=auto")
|
||||||
|
.arg("--file-name=ansi.txt")
|
||||||
|
.write_stdin("\x1B[33mYellow\x1B[m")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.get_output()
|
||||||
|
.stdout
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.expect("valid utf8");
|
||||||
|
|
||||||
|
assert!(output.contains("\x1B[33mYellow"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn strip_ansi_auto_does_not_strip_ansi_when_plain_text_by_option() {
|
||||||
|
let output = String::from_utf8(
|
||||||
|
bat()
|
||||||
|
.arg("--style=plain")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.arg("--strip-ansi=auto")
|
||||||
|
.arg("--language=txt")
|
||||||
|
.write_stdin("\x1B[33mYellow\x1B[m")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.get_output()
|
||||||
|
.stdout
|
||||||
|
.clone(),
|
||||||
|
)
|
||||||
|
.expect("valid utf8");
|
||||||
|
|
||||||
|
assert!(output.contains("\x1B[33mYellow"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that style components can be removed with `-component`.
|
||||||
|
#[test]
|
||||||
|
fn style_components_can_be_removed() {
|
||||||
|
bat()
|
||||||
|
.arg({
|
||||||
|
#[cfg(not(feature = "git"))]
|
||||||
|
{
|
||||||
|
"--style=full,-grid"
|
||||||
|
}
|
||||||
|
#[cfg(feature = "git")]
|
||||||
|
{
|
||||||
|
"--style=full,-grid,-changes"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.write_stdin("test")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(" STDIN\n Size: -\n 1 test\n")
|
||||||
|
.stderr("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that style components are chosen based on the rightmost `--style` argument.
|
||||||
|
#[test]
|
||||||
|
fn style_components_can_be_overidden() {
|
||||||
|
bat()
|
||||||
|
.arg("--style=full")
|
||||||
|
.arg("--style=header,numbers")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.write_stdin("test")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(" STDIN\n 1 test\n")
|
||||||
|
.stderr("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that style components can be merged across multiple `--style` arguments.
|
||||||
|
#[test]
|
||||||
|
fn style_components_will_merge() {
|
||||||
|
bat()
|
||||||
|
.arg("--style=header,grid")
|
||||||
|
.arg("--style=-grid,+numbers")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.write_stdin("test")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(" STDIN\n 1 test\n")
|
||||||
|
.stderr("");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that style components can be merged with the `BAT_STYLE` environment variable.
|
||||||
|
#[test]
|
||||||
|
fn style_components_will_merge_with_env_var() {
|
||||||
|
bat()
|
||||||
|
.env("BAT_STYLE", "header,grid")
|
||||||
|
.arg("--style=-grid,+numbers")
|
||||||
|
.arg("--decorations=always")
|
||||||
|
.arg("--color=never")
|
||||||
|
.write_stdin("test")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(" STDIN\n 1 test\n")
|
||||||
.stderr("");
|
.stderr("");
|
||||||
}
|
}
|
||||||
|
54
tests/syntax-tests/highlighted/CFML/test.cfml
vendored
Normal file
54
tests/syntax-tests/highlighted/CFML/test.cfml
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mhead[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mtitle[0m[38;2;255;255;255m>[0m[38;2;248;248;242mAdd New Employees[0m[38;2;255;255;255m</[0m[38;2;249;38;114mtitle[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mhead[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mbody[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mh1[0m[38;2;255;255;255m>[0m[38;2;248;248;242mAdd New Employees[0m[38;2;255;255;255m</[0m[38;2;249;38;114mh1[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;117;113;94m<!---[0m[38;2;117;113;94m Action page code for the form at the bottom of this page. [0m[38;2;117;113;94m--->[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;117;113;94m<!---[0m[38;2;117;113;94m Establish parameters for first time through [0m[38;2;117;113;94m--->[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfparam[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mForm.firstname[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mdefault[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfparam[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mForm.lastname[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mdefault[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfparam[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mForm.email[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mdefault[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfparam[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mForm.phone[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mdefault[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfparam[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116mForm.department[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mdefault[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;117;113;94m<!---[0m[38;2;117;113;94m If at least the firstname form field is passed, create [0m
|
||||||
|
[38;2;117;113;94ma structure named employee and add values. [0m[38;2;117;113;94m--->[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfif[0m[38;2;248;248;242m [0m[38;2;248;248;242m#[0m[38;2;255;255;255mForm[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfirstname[0m[38;2;248;248;242m#[0m[38;2;248;248;242m [0m[38;2;255;255;255meq[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mp[0m[38;2;255;255;255m>[0m[38;2;248;248;242mPlease fill out the form.[0m[38;2;255;255;255m</[0m[38;2;249;38;114mp[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfelse[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfoutput[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcfscript[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255memployee[0m[38;2;249;38;114m=[0m[38;2;102;217;239mStructNew[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;255;255;255memployee[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfirstname[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255mForm[0m[38;2;248;248;242m.[0m[38;2;248;248;242mfirstname[0m[38;2;248;248;242m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255memployee[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlastname[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255mForm[0m[38;2;248;248;242m.[0m[38;2;248;248;242mlastname[0m[38;2;248;248;242m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255memployee[0m[38;2;248;248;242m.[0m[38;2;248;248;242memail[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255mForm[0m[38;2;248;248;242m.[0m[38;2;248;248;242memail[0m[38;2;248;248;242m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255memployee[0m[38;2;248;248;242m.[0m[38;2;248;248;242mphone[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255mForm[0m[38;2;248;248;242m.[0m[38;2;248;248;242mphone[0m[38;2;248;248;242m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255memployee[0m[38;2;248;248;242m.[0m[38;2;248;248;242mdepartment[0m[38;2;248;248;242m [0m[38;2;249;38;114m=[0m[38;2;248;248;242m [0m[38;2;255;255;255mForm[0m[38;2;248;248;242m.[0m[38;2;248;248;242mdepartment[0m[38;2;248;248;242m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mcfscript[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;117;113;94m<!---[0m[38;2;117;113;94m Display results of creating the structure. [0m[38;2;117;113;94m--->[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mFirst name is [0m[38;2;248;248;242m#[0m[38;2;102;217;239mStructFind[0m[38;2;248;248;242m([0m[38;2;255;255;255memployee[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mfirstname[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m#[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mLast name is [0m[38;2;248;248;242m#[0m[38;2;102;217;239mStructFind[0m[38;2;248;248;242m([0m[38;2;255;255;255memployee[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mlastname[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m#[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mEMail is [0m[38;2;248;248;242m#[0m[38;2;102;217;239mStructFind[0m[38;2;248;248;242m([0m[38;2;255;255;255memployee[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116memail[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m#[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mPhone is [0m[38;2;248;248;242m#[0m[38;2;102;217;239mStructFind[0m[38;2;248;248;242m([0m[38;2;255;255;255memployee[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mphone[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m#[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mDepartment is [0m[38;2;248;248;242m#[0m[38;2;102;217;239mStructFind[0m[38;2;248;248;242m([0m[38;2;255;255;255memployee[0m[38;2;248;248;242m,[0m[38;2;248;248;242m [0m[38;2;230;219;116m"[0m[38;2;230;219;116mdepartment[0m[38;2;230;219;116m"[0m[38;2;248;248;242m)[0m[38;2;248;248;242m#[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mcfoutput[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;117;113;94m<!---[0m[38;2;117;113;94m Call the custom tag that adds employees. [0m[38;2;117;113;94m--->[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mcf_addemployee[0m[38;2;248;248;242m [0m[38;2;166;226;46mempinfo[0m[38;2;248;248;242m=[0m[38;2;230;219;116m"[0m[38;2;230;219;116m#[0m[38;2;255;255;255memployee[0m[38;2;230;219;116m#[0m[38;2;230;219;116m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mcfif[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;117;113;94m<!---[0m[38;2;117;113;94m The form for adding the new employee information [0m[38;2;117;113;94m--->[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mhr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mform[0m[38;2;248;248;242m [0m[38;2;166;226;46maction[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mnewemployee.cfm[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mmethod[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mPost[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mFirst Name:[0m[38;2;190;132;255m&[0m[38;2;190;132;255mnbsp[0m[38;2;190;132;255m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114minput[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mfirstname[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mtype[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mtext[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mhspace[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mmaxlength[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mLast Name:[0m[38;2;190;132;255m&[0m[38;2;190;132;255mnbsp[0m[38;2;190;132;255m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114minput[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mlastname[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mtype[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mtext[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mhspace[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mmaxlength[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mEMail:[0m[38;2;190;132;255m&[0m[38;2;190;132;255mnbsp[0m[38;2;190;132;255m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114minput[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116memail[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mtype[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mtext[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mhspace[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mmaxlength[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mPhone:[0m[38;2;190;132;255m&[0m[38;2;190;132;255mnbsp[0m[38;2;190;132;255m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114minput[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mphone[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mtype[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mtext[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mhspace[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m20[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mmaxlength[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m20[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;248;248;242mDepartment:[0m[38;2;190;132;255m&[0m[38;2;190;132;255mnbsp[0m[38;2;190;132;255m;[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114minput[0m[38;2;248;248;242m [0m[38;2;166;226;46mname[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mdepartment[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mtype[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mtext[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mhspace[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mmaxlength[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116m30[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114minput[0m[38;2;248;248;242m [0m[38;2;166;226;46mtype[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mSubmit[0m[38;2;255;255;255m"[0m[38;2;248;248;242m [0m[38;2;166;226;46mvalue[0m[38;2;166;226;46m=[0m[38;2;255;255;255m"[0m[38;2;230;219;116mOK[0m[38;2;255;255;255m"[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mform[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m<[0m[38;2;249;38;114mbr[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mbody[0m[38;2;255;255;255m>[0m[38;2;248;248;242m [0m
|
||||||
|
[38;2;255;255;255m</[0m[38;2;249;38;114mhtml[0m[38;2;255;255;255m>[0m
|
54
tests/syntax-tests/source/CFML/test.cfml
vendored
Normal file
54
tests/syntax-tests/source/CFML/test.cfml
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<head>
|
||||||
|
<title>Add New Employees</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Add New Employees</h1>
|
||||||
|
<!--- Action page code for the form at the bottom of this page. --->
|
||||||
|
<!--- Establish parameters for first time through --->
|
||||||
|
<cfparam name="Form.firstname" default="">
|
||||||
|
<cfparam name="Form.lastname" default="">
|
||||||
|
<cfparam name="Form.email" default="">
|
||||||
|
<cfparam name="Form.phone" default="">
|
||||||
|
<cfparam name="Form.department" default="">
|
||||||
|
<!--- If at least the firstname form field is passed, create
|
||||||
|
a structure named employee and add values. --->
|
||||||
|
<cfif #Form.firstname# eq "">
|
||||||
|
<p>Please fill out the form.</p>
|
||||||
|
<cfelse>
|
||||||
|
<cfoutput>
|
||||||
|
<cfscript>
|
||||||
|
employee=StructNew();
|
||||||
|
employee.firstname = Form.firstname;
|
||||||
|
employee.lastname = Form.lastname;
|
||||||
|
employee.email = Form.email;
|
||||||
|
employee.phone = Form.phone;
|
||||||
|
employee.department = Form.department;
|
||||||
|
</cfscript>
|
||||||
|
<!--- Display results of creating the structure. --->
|
||||||
|
First name is #StructFind(employee, "firstname")#<br>
|
||||||
|
Last name is #StructFind(employee, "lastname")#<br>
|
||||||
|
EMail is #StructFind(employee, "email")#<br>
|
||||||
|
Phone is #StructFind(employee, "phone")#<br>
|
||||||
|
Department is #StructFind(employee, "department")#<br>
|
||||||
|
</cfoutput>
|
||||||
|
<!--- Call the custom tag that adds employees. --->
|
||||||
|
<cf_addemployee empinfo="#employee#">
|
||||||
|
</cfif>
|
||||||
|
<!--- The form for adding the new employee information --->
|
||||||
|
<hr>
|
||||||
|
<form action="newemployee.cfm" method="Post">
|
||||||
|
First Name:
|
||||||
|
<input name="firstname" type="text" hspace="30" maxlength="30"><br>
|
||||||
|
Last Name:
|
||||||
|
<input name="lastname" type="text" hspace="30" maxlength="30"><br>
|
||||||
|
EMail:
|
||||||
|
<input name="email" type="text" hspace="30" maxlength="30"><br>
|
||||||
|
Phone:
|
||||||
|
<input name="phone" type="text" hspace="20" maxlength="20"><br>
|
||||||
|
Department:
|
||||||
|
<input name="department" type="text" hspace="30" maxlength="30"><br>
|
||||||
|
<input type="Submit" value="OK">
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user