1
0
mirror of https://github.com/sharkdp/bat.git synced 2026-02-08 00:32:08 +00:00

Merge branch 'master' into master

This commit is contained in:
Keith Hall
2026-02-03 22:27:30 +02:00
committed by GitHub
27 changed files with 278 additions and 114 deletions

1
.envrc Normal file
View File

@@ -0,0 +1 @@
use flake

View File

@@ -35,7 +35,7 @@ jobs:
name: Extract crate metadata name: Extract crate metadata
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Extract crate information - name: Extract crate information
id: crate_metadata id: crate_metadata
run: | run: |
@@ -58,7 +58,7 @@ jobs:
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
with: with:
components: rustfmt,clippy components: rustfmt,clippy
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- run: cargo fmt -- --check - run: cargo fmt -- --check
- run: cargo clippy --locked --all-targets --all-features -- -D warnings - run: cargo clippy --locked --all-targets --all-features -- -D warnings
@@ -68,7 +68,7 @@ jobs:
needs: crate_metadata needs: crate_metadata
steps: steps:
- name: Checkout source code - name: Checkout source code
uses: actions/checkout@v5 uses: actions/checkout@v6
- name: Install rust toolchain (v${{ needs.crate_metadata.outputs.msrv }}) - name: Install rust toolchain (v${{ needs.crate_metadata.outputs.msrv }})
uses: dtolnay/rust-toolchain@master uses: dtolnay/rust-toolchain@master
with: with:
@@ -80,7 +80,7 @@ jobs:
name: License checks name: License checks
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
with: with:
submodules: true # we especially want to perform license checks on submodules submodules: true # we especially want to perform license checks on submodules
- run: tests/scripts/license-checks.sh - run: tests/scripts/license-checks.sh
@@ -90,7 +90,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
submodules: true # we need all syntax and theme submodules submodules: true # we need all syntax and theme submodules
- name: Install Rust toolchain - name: Install Rust toolchain
@@ -119,7 +119,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
- name: Prepare environment variables - name: Prepare environment variables
run: | run: |
echo "BAT_SYSTEM_CONFIG_PREFIX=$GITHUB_WORKSPACE/tests/examples/system_config" >> $GITHUB_ENV echo "BAT_SYSTEM_CONFIG_PREFIX=$GITHUB_WORKSPACE/tests/examples/system_config" >> $GITHUB_ENV
@@ -135,7 +135,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Git checkout - name: Git checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
- name: Install Rust toolchain - name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
- name: Check documentation - name: Check documentation
@@ -150,7 +150,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- run: cargo install cargo-audit --locked - run: cargo install cargo-audit --locked
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- run: cargo audit - run: cargo audit
build: build:
@@ -178,7 +178,7 @@ jobs:
BUILD_CMD: cargo BUILD_CMD: cargo
steps: steps:
- name: Checkout source code - name: Checkout source code
uses: actions/checkout@v5 uses: actions/checkout@v6
- name: Install prerequisites - name: Install prerequisites
shell: bash shell: bash

View File

@@ -13,7 +13,7 @@ jobs:
PR_NUMBER: ${{ github.event.number }} PR_NUMBER: ${{ github.event.number }}
PR_BASE: ${{ github.base_ref }} PR_BASE: ${{ github.base_ref }}
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Fetch PR base - name: Fetch PR base
run: git fetch --no-tags --prune --depth=1 origin run: git fetch --no-tags --prune --depth=1 origin

7
.gitignore vendored
View File

@@ -1,6 +1,11 @@
.direnv/
/target/ /target/
**/*.rs.bk **/*.rs.bk
# Editors
.idea/
.vscode/
# Generated files # Generated files
/assets/completions/_bat.ps1 /assets/completions/_bat.ps1
/assets/completions/bat.bash /assets/completions/bat.bash
@@ -8,3 +13,5 @@
/assets/completions/bat.zsh /assets/completions/bat.zsh
/assets/manual/bat.1 /assets/manual/bat.1
/assets/metadata.yaml /assets/metadata.yaml

5
.gitmodules vendored
View File

@@ -130,7 +130,7 @@
url = https://github.com/djuretic/SublimeStrace url = https://github.com/djuretic/SublimeStrace
[submodule "assets/syntaxes/Jinja2"] [submodule "assets/syntaxes/Jinja2"]
path = assets/syntaxes/02_Extra/Jinja2 path = assets/syntaxes/02_Extra/Jinja2
url = https://github.com/Martin819/sublime-jinja2 url = https://github.com/ltrzesniewski/sublime-jinja2.git
[submodule "assets/syntaxes/SLS"] [submodule "assets/syntaxes/SLS"]
path = assets/syntaxes/02_Extra/SLS path = assets/syntaxes/02_Extra/SLS
url = https://github.com/saltstack/sublime-text url = https://github.com/saltstack/sublime-text
@@ -203,9 +203,6 @@
[submodule "assets/syntaxes/02_Extra/SystemVerilog"] [submodule "assets/syntaxes/02_Extra/SystemVerilog"]
path = assets/syntaxes/02_Extra/SystemVerilog path = assets/syntaxes/02_Extra/SystemVerilog
url = https://github.com/TheClams/SystemVerilog.git url = https://github.com/TheClams/SystemVerilog.git
[submodule "assets/themes/visual-studio-dark-plus"]
path = assets/themes/visual-studio-dark-plus
url = https://github.com/vidann1/visual-studio-dark-plus.git
[submodule "assets/syntaxes/02_Extra/SublimeEthereum"] [submodule "assets/syntaxes/02_Extra/SublimeEthereum"]
path = assets/syntaxes/02_Extra/SublimeEthereum path = assets/syntaxes/02_Extra/SublimeEthereum
url = https://github.com/davidhq/SublimeEthereum.git url = https://github.com/davidhq/SublimeEthereum.git

View File

@@ -1,13 +1,18 @@
# unreleased # unreleased
- Fixed bug caused by using `--plain` and `--terminal-width=N` flags simultaneously, see #3529 (@H4k1l)
## Features ## Features
- Added an initial `flake.nix` for a ready made development environment; see #3578 (@vorburger)
- Add `--quiet-empty` (`-E`) flag to suppress output when input is empty. Closes #1936, see #3563 (@NORMAL-EX)
- Improve native man pages and command help syntax highlighting by stripping overstriking, see #3517 (@akirk) - Improve native man pages and command help syntax highlighting by stripping overstriking, see #3517 (@akirk)
## Bugfixes ## Bugfixes
- Fix crash with BusyBox `less` on Windows, see #3527 (@Anchal-T) - Fix crash with BusyBox `less` on Windows, see #3527 (@Anchal-T)
- `--help` now correctly honors `--pager=builtin`. See #3516 (@keith-hall) - `--help` now correctly honors `--pager=builtin`. See #3516 (@keith-hall)
- `--help` now correctly honors custom themes. See #3524 (@keith-hall) - `--help` now correctly honors custom themes. See #3524 (@keith-hall)
- Fixed test compatibility with future Cargo build directory changes, see #3550 (@nmacl)
## Other ## Other
@@ -18,6 +23,8 @@
## Themes ## Themes
- Remove the Visual Studio Dark+ theme, see #3552 (@CosmicHorrorDev)
## `bat` as a library ## `bat` as a library
# v0.26.1 # v0.26.1

98
Cargo.lock generated
View File

@@ -83,13 +83,12 @@ checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f"
[[package]] [[package]]
name = "assert_cmd" name = "assert_cmd"
version = "2.0.16" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"bstr", "bstr",
"doc-comment",
"libc", "libc",
"predicates", "predicates",
"predicates-core", "predicates-core",
@@ -253,18 +252,18 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.46" version = "4.5.56"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" checksum = "a75ca66430e33a14957acc24c5077b503e7d374151b2b4b3a10c83b4ceb4be0e"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
] ]
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.46" version = "4.5.56"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" checksum = "793207c7fa6300a0608d1080b858e5fdbe713cdc1c8db9fb17777d8a13e63df0"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@@ -297,9 +296,9 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]] [[package]]
name = "console" name = "console"
version = "0.16.1" version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4"
dependencies = [ dependencies = [
"encode_unicode", "encode_unicode",
"libc", "libc",
@@ -471,12 +470,6 @@ version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d" checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d"
[[package]]
name = "doc-comment"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
[[package]] [[package]]
name = "either" name = "either"
version = "1.13.0" version = "1.13.0"
@@ -665,9 +658,9 @@ dependencies = [
[[package]] [[package]]
name = "git2" name = "git2"
version = "0.20.2" version = "0.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" checksum = "3e2b37e2f62729cdada11f0e6b3b6fe383c69c29fc619e391223e12856af308c"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"libc", "libc",
@@ -868,9 +861,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.12.1" version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.16.1", "hashbrown 0.16.1",
@@ -922,9 +915,9 @@ checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
[[package]] [[package]]
name = "libgit2-sys" name = "libgit2-sys"
version = "0.18.2+1.9.1" version = "0.18.3+1.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c42fe03df2bd3c53a3a9c7317ad91d80c81cd1fb0caec8d7cc4cd2bfa10c222" checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
@@ -956,6 +949,12 @@ 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 = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
[[package]]
name = "linux-raw-sys"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]] [[package]]
name = "litemap" name = "litemap"
version = "0.7.4" version = "0.7.4"
@@ -1060,11 +1059,11 @@ dependencies = [
[[package]] [[package]]
name = "nu-ansi-term" name = "nu-ansi-term"
version = "0.50.1" version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -1218,9 +1217,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.103" version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@@ -1319,10 +1318,23 @@ dependencies = [
"bitflags", "bitflags",
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys 0.4.15",
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
[[package]]
name = "rustix"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys 0.11.0",
"windows-sys 0.61.2",
]
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.18" version = "1.0.18"
@@ -1403,9 +1415,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_with" name = "serde_with"
version = "3.15.1" version = "3.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7"
dependencies = [ dependencies = [
"serde_core", "serde_core",
"serde_with_macros", "serde_with_macros",
@@ -1413,9 +1425,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_with_macros" name = "serde_with_macros"
version = "3.15.1" version = "3.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c"
dependencies = [ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
@@ -1467,9 +1479,9 @@ checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
[[package]] [[package]]
name = "shell-words" name = "shell-words"
version = "1.1.0" version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77"
[[package]] [[package]]
name = "shlex" name = "shlex"
@@ -1591,16 +1603,15 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.16.0" version = "3.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
dependencies = [ dependencies = [
"cfg-if",
"fastrand", "fastrand",
"getrandom", "getrandom",
"once_cell", "once_cell",
"rustix", "rustix 1.1.2",
"windows-sys 0.59.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -1644,7 +1655,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9"
dependencies = [ dependencies = [
"rustix", "rustix 0.38.43",
"windows-sys 0.59.0", "windows-sys 0.59.0",
] ]
@@ -2034,15 +2045,6 @@ dependencies = [
"windows-targets 0.48.5", "windows-targets 0.48.5",
] ]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.6",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.59.0" version = "0.59.0"

View File

@@ -42,16 +42,16 @@ regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
[dependencies] [dependencies]
nu-ansi-term = "0.50.0" nu-ansi-term = "0.50.3"
ansi_colours = "^1.2" ansi_colours = "^1.2"
bincode = "1.0" bincode = "1.0"
console = "0.16.1" console = "0.16.2"
flate2 = "1.1" flate2 = "1.1"
once_cell = "1.20" once_cell = "1.20"
thiserror = "2.0" thiserror = "2.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.1", optional = true }
minus = { version = "5.6", optional = true, features = [ minus = { version = "5.6", optional = true, features = [
"dynamic_output", "dynamic_output",
"search", "search",
@@ -87,7 +87,7 @@ default-features = false
features = ["parsing"] features = ["parsing"]
[dependencies.clap] [dependencies.clap]
version = "4.5.46" version = "4.5.56"
optional = true optional = true
features = ["wrap_help", "cargo"] features = ["wrap_help", "cargo"]
@@ -95,12 +95,12 @@ features = ["wrap_help", "cargo"]
plist = "1.7.0" plist = "1.7.0"
[dev-dependencies] [dev-dependencies]
assert_cmd = "2.0.12" assert_cmd = "2.0.16"
expect-test = "1.5.0" 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.3" predicates = "3.1.3"
wait-timeout = "0.2.1" wait-timeout = "0.2.1"
tempfile = "3.16.0" tempfile = "3.23.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
[target.'cfg(unix)'.dev-dependencies] [target.'cfg(unix)'.dev-dependencies]
@@ -108,22 +108,22 @@ nix = { version = "0.30", default-features = false, features = ["term"] }
[build-dependencies] [build-dependencies]
anyhow = "1.0.97" anyhow = "1.0.97"
indexmap = { version = "2.8.0", features = ["serde"] } indexmap = { version = "2.13.0", features = ["serde"] }
itertools = "0.14.0" itertools = "0.14.0"
once_cell = "1.20" once_cell = "1.20"
prettyplease = "0.2.37" prettyplease = "0.2.37"
proc-macro2 = "1.0.103" proc-macro2 = "1.0.106"
quote = "1.0.40" quote = "1.0.40"
regex = "1.12.2" regex = "1.12.2"
serde = "1.0" serde = "1.0"
serde_derive = "1.0" serde_derive = "1.0"
serde_with = { version = "3.15.1", default-features = false, features = ["macros"] } serde_with = { version = "3.16.1", default-features = false, features = ["macros"] }
syn = { version = "2.0.104", features = ["full"] } syn = { version = "2.0.104", features = ["full"] }
toml = { version = "0.9.8", features = ["preserve_order"] } toml = { version = "0.9.8", features = ["preserve_order"] }
walkdir = "2.5" walkdir = "2.5"
[build-dependencies.clap] [build-dependencies.clap]
version = "4.5.46" version = "4.5.56"
optional = true optional = true
features = ["wrap_help", "cargo"] features = ["wrap_help", "cargo"]

View File

@@ -186,6 +186,7 @@ Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -Script
[CompletionResult]::new('--acknowledgements' , 'acknowledgements' , [CompletionResultType]::ParameterName, 'Show acknowledgements.') [CompletionResult]::new('--acknowledgements' , 'acknowledgements' , [CompletionResultType]::ParameterName, 'Show acknowledgements.')
[CompletionResult]::new('--set-terminal-title' , 'set-terminal-title' , [CompletionResultType]::ParameterName, 'Sets terminal title to filenames when using a pager.') [CompletionResult]::new('--set-terminal-title' , 'set-terminal-title' , [CompletionResultType]::ParameterName, 'Sets terminal title to filenames when using a pager.')
[CompletionResult]::new('--diagnostic' , 'diagnostic' , [CompletionResultType]::ParameterName, 'Show diagnostic information for bug reports.') [CompletionResult]::new('--diagnostic' , 'diagnostic' , [CompletionResultType]::ParameterName, 'Show diagnostic information for bug reports.')
[CompletionResult]::new('--quiet-empty' , 'quiet-empty' , [CompletionResultType]::ParameterName, 'Do not produce any output when the input is empty.')
# [CompletionResult]::new('-h' , 'h' , [CompletionResultType]::ParameterName, 'Print this help message.') # [CompletionResult]::new('-h' , 'h' , [CompletionResultType]::ParameterName, 'Print this help message.')
[CompletionResult]::new('--help' , 'help' , [CompletionResultType]::ParameterName, 'Print this help message.') [CompletionResult]::new('--help' , 'help' , [CompletionResultType]::ParameterName, 'Print this help message.')
# [CompletionResult]::new('-V' , 'V' , [CompletionResultType]::ParameterName, 'Show version information.') # [CompletionResult]::new('-V' , 'V' , [CompletionResultType]::ParameterName, 'Show version information.')

View File

@@ -100,6 +100,7 @@ _bat() {
--lessopen | \ --lessopen | \
--no-paging | \ --no-paging | \
--diagnostic | \ --diagnostic | \
--quiet-empty | \
--acknowledgements | \ --acknowledgements | \
-h | --help | \ -h | --help | \
-V | --version | \ -V | --version | \
@@ -227,6 +228,7 @@ _bat() {
--lessopen --lessopen
--completion --completion
--diagnostic --diagnostic
--quiet-empty
--acknowledgements --acknowledgements
--set-terminal-title --set-terminal-title
--help --help

View File

@@ -61,7 +61,7 @@ function __bat_no_excl_args
-s V -l version \ -s V -l version \
-l acknowledgements \ -l acknowledgements \
-l config-dir -l config-file \ -l config-dir -l config-file \
-l diagnostic \ -l diagnostic -l quiet-empty \
-l list-languages -l list-themes -l list-languages -l list-themes
end end
@@ -159,6 +159,7 @@ complete -c $bat -l config-file -f -d "Display location of configuration file" -
complete -c $bat -l decorations -x -a "$decorations_opts" -d "When to use --style decorations" -n __bat_no_excl_args complete -c $bat -l decorations -x -a "$decorations_opts" -d "When to use --style decorations" -n __bat_no_excl_args
complete -c $bat -l diagnostic -d "Print diagnostic info for bug reports" -n __fish_is_first_arg complete -c $bat -l diagnostic -d "Print diagnostic info for bug reports" -n __fish_is_first_arg
complete -c $bat -l quiet-empty -d "Do not produce any output when the input is empty" -n __fish_is_first_arg
complete -c $bat -s d -l diff -d "Only show lines with Git changes" -n __bat_no_excl_args complete -c $bat -s d -l diff -d "Only show lines with Git changes" -n __bat_no_excl_args

View File

@@ -62,6 +62,7 @@ _{{PROJECT_EXECUTABLE}}_main() {
--completion='[show shell completion for a certain shell]:shell:(bash fish zsh ps1)' --completion='[show shell completion for a certain shell]:shell:(bash fish zsh ps1)'
--set-terminal-title'[sets terminal title to filenames when using a pager]' --set-terminal-title'[sets terminal title to filenames when using a pager]'
--diagnostic'[show diagnostic information for bug reports]' --diagnostic'[show diagnostic information for bug reports]'
--quiet-empty'[do not produce any output when the input is empty]'
-P'[disable paging]' -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]"

View File

@@ -282,6 +282,10 @@ Show bat's cache directory.
.IP .IP
Show diagnostic information for bug reports. Show diagnostic information for bug reports.
.HP .HP
\fB\-\-quiet\-empty\fR
.IP
Do not produce any output when the input is empty (e.g. an empty file or empty stdin). This is useful in scripts where silent behavior is preferred for empty input.
.HP
\fB\-\-acknowledgements\fR \fB\-\-acknowledgements\fR
.IP .IP
Show acknowledgements. Show acknowledgements.

View File

@@ -212,6 +212,10 @@ Options:
--diagnostic --diagnostic
Show diagnostic information for bug reports. Show diagnostic information for bug reports.
-E, --quiet-empty
When this flag is set, bat will produce no output at all when the input is empty. This is
useful when piping commands that may produce empty output, like 'git diff'.
--acknowledgements --acknowledgements
Show acknowledgements. Show acknowledgements.

View File

@@ -60,6 +60,8 @@ Options:
Display all supported languages. Display all supported languages.
--completion <SHELL> --completion <SHELL>
Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1] Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]
-E, --quiet-empty
Produce no output when the input is empty.
-h, --help -h, --help
Print help (see more with '--help') Print help (see more with '--help')
-V, --version -V, --version

27
flake.lock generated Normal file
View File

@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1769789167,
"narHash": "sha256-kKB3bqYJU5nzYeIROI82Ef9VtTbu4uA3YydSk/Bioa8=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "62c8382960464ceb98ea593cb8321a2cf8f9e3e5",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

40
flake.nix Normal file
View File

@@ -0,0 +1,40 @@
{
description = "bat";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs =
{ self, ... }@inputs:
let
supportedSystems = [
"x86_64-linux" # 64-bit Intel/AMD Linux
"aarch64-linux" # 64-bit ARM Linux
"aarch64-darwin" # 64-bit ARM macOS
"x86_64-darwin" # 64-bit Intel macOS
];
forEachSupportedSystem =
f:
inputs.nixpkgs.lib.genAttrs supportedSystems (
system:
f {
inherit system;
pkgs = import inputs.nixpkgs {
inherit system;
};
}
);
in
{
devShells = forEachSupportedSystem (
{ pkgs, system }:
{
default = pkgs.mkShellNoCC {
packages = with pkgs; [
cargo
];
};
}
);
};
}

View File

@@ -405,7 +405,7 @@ impl App {
Some("character") => WrappingMode::Character, Some("character") => WrappingMode::Character,
Some("never") => WrappingMode::NoWrapping(true), Some("never") => WrappingMode::NoWrapping(true),
Some("auto") | None => { Some("auto") | None => {
if style_components.plain() { if style_components.plain() && maybe_term_width.is_none() {
WrappingMode::NoWrapping(false) WrappingMode::NoWrapping(false)
} else { } else {
WrappingMode::Character WrappingMode::Character
@@ -461,6 +461,7 @@ impl App {
Some("auto") => StripAnsiMode::Auto, Some("auto") => StripAnsiMode::Auto,
_ => unreachable!("other values for --strip-ansi are not allowed"), _ => unreachable!("other values for --strip-ansi are not allowed"),
}, },
quiet_empty: self.matches.get_flag("quiet-empty"),
theme: theme(self.theme_options()).to_string(), theme: theme(self.theme_options()).to_string(),
visible_lines: match self.matches.try_contains_id("diff").unwrap_or_default() visible_lines: match self.matches.try_contains_id("diff").unwrap_or_default()
&& self.matches.get_flag("diff") && self.matches.get_flag("diff")

View File

@@ -643,6 +643,18 @@ pub fn build_app(interactive_output: bool) -> Command {
.hide_short_help(true) .hide_short_help(true)
.help("Show diagnostic information for bug reports."), .help("Show diagnostic information for bug reports."),
) )
.arg(
Arg::new("quiet-empty")
.long("quiet-empty")
.short('E')
.action(ArgAction::SetTrue)
.help("Produce no output when the input is empty.")
.long_help(
"When this flag is set, bat will produce no output at all when \
the input is empty. This is useful when piping commands that may \
produce empty output, like 'git diff'.",
),
)
.arg( .arg(
Arg::new("acknowledgements") Arg::new("acknowledgements")
.long("acknowledgements") .long("acknowledgements")

View File

@@ -99,14 +99,17 @@ pub struct Config<'a> {
#[cfg(feature = "lessopen")] #[cfg(feature = "lessopen")]
pub use_lessopen: bool, pub use_lessopen: bool,
// Weather or not to set terminal title when using a pager // Whether or not to set terminal title when using a pager
pub set_terminal_title: bool, pub set_terminal_title: bool,
/// 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 // Whether or not to strip ANSI escape codes from the input
pub strip_ansi: StripAnsiMode, pub strip_ansi: StripAnsiMode,
/// Whether or not to produce no output when input is empty
pub quiet_empty: bool,
} }
#[cfg(all(feature = "minimal-application", feature = "paging"))] #[cfg(all(feature = "minimal-application", feature = "paging"))]

View File

@@ -454,6 +454,11 @@ impl Printer for InteractivePrinter<'_> {
input: &OpenedInput, input: &OpenedInput,
add_header_padding: bool, add_header_padding: bool,
) -> Result<()> { ) -> Result<()> {
// If input is empty and quiet_empty is enabled, skip all output
if self.content_type.is_none() && self.config.quiet_empty {
return Ok(());
}
if add_header_padding && self.config.style_components.rule() { if add_header_padding && self.config.style_components.rule() {
self.print_horizontal_line_term(handle, self.colors.rule)?; self.print_horizontal_line_term(handle, self.colors.rule)?;
} }
@@ -556,6 +561,11 @@ impl Printer for InteractivePrinter<'_> {
} }
fn print_footer(&mut self, handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> { fn print_footer(&mut self, handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> {
// If input is empty and quiet_empty is enabled, skip footer
if self.content_type.is_none() && self.config.quiet_empty {
return Ok(());
}
if self.config.style_components.grid() if self.config.style_components.grid()
&& (self.content_type.is_some_and(|c| c.is_text()) && (self.content_type.is_some_and(|c| c.is_text())
|| self.config.show_nonprintable || self.config.show_nonprintable

View File

@@ -34,7 +34,6 @@ fn all_themes_are_present() {
"Solarized (light)", "Solarized (light)",
"Sublime Snazzy", "Sublime Snazzy",
"TwoDark", "TwoDark",
"Visual Studio Dark+",
"ansi", "ansi",
"base16", "base16",
"base16-256", "base16-256",

View File

@@ -1357,27 +1357,33 @@ fn disable_pager_if_pp_flag_comes_after_paging() {
} }
#[test] #[test]
#[serial]
fn enable_pager_if_disable_paging_flag_comes_before_paging() { fn enable_pager_if_disable_paging_flag_comes_before_paging() {
mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| {
bat() bat()
.env("PAGER", "echo pager-output") .env("PAGER", mocked_pagers::from("echo pager-output"))
.arg("-P") .arg("-P")
.arg("--paging=always") .arg("--paging=always")
.arg("test.txt") .arg("test.txt")
.assert() .assert()
.success() .success()
.stdout(predicate::eq("pager-output\n").normalize()); .stdout(predicate::str::contains("pager-output\n").normalize());
});
} }
#[test] #[test]
#[serial]
fn enable_pager_if_pp_flag_comes_before_paging() { fn enable_pager_if_pp_flag_comes_before_paging() {
mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| {
bat() bat()
.env("PAGER", "echo pager-output") .env("PAGER", mocked_pagers::from("echo pager-output"))
.arg("-pp") .arg("-pp")
.arg("--paging=always") .arg("--paging=always")
.arg("test.txt") .arg("test.txt")
.assert() .assert()
.success() .success()
.stdout(predicate::eq("pager-output\n").normalize()); .stdout(predicate::str::contains("pager-output\n").normalize());
});
} }
#[test] #[test]
@@ -1394,15 +1400,18 @@ fn paging_does_not_override_simple_plain() {
} }
#[test] #[test]
#[serial]
fn simple_plain_does_not_override_paging() { fn simple_plain_does_not_override_paging() {
mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| {
bat() bat()
.env("PAGER", "echo pager-output") .env("PAGER", mocked_pagers::from("echo pager-output"))
.arg("--paging=always") .arg("--paging=always")
.arg("--plain") .arg("--plain")
.arg("test.txt") .arg("test.txt")
.assert() .assert()
.success() .success()
.stdout(predicate::eq("pager-output\n")); .stdout(predicate::str::contains("pager-output\n").normalize());
});
} }
#[test] #[test]
@@ -3631,3 +3640,47 @@ fn style_components_will_merge_with_env_var() {
.stdout(" STDIN\n 1 test\n") .stdout(" STDIN\n 1 test\n")
.stderr(""); .stderr("");
} }
// Test for https://github.com/sharkdp/bat/issues/3526
#[test]
fn plain_with_sized_terminal_width() {
bat()
.arg("--plain")
.arg("--terminal-width=6")
.arg("--decorations=always")
.arg("test.txt")
.assert()
.success()
.stdout("hello \nworld\n")
.stderr("");
}
#[test]
fn quiet_empty_suppresses_output_on_empty_stdin() {
bat()
.arg("--quiet-empty")
.write_stdin("")
.assert()
.success()
.stdout("");
}
#[test]
fn quiet_empty_does_not_affect_non_empty_input() {
bat()
.arg("--quiet-empty")
.write_stdin("hello\n")
.assert()
.success()
.stdout("hello\n");
}
#[test]
fn quiet_empty_suppresses_output_on_empty_file() {
bat()
.arg("--quiet-empty")
.arg("empty.txt")
.assert()
.success()
.stdout("");
}

View File

@@ -53,16 +53,7 @@ impl Default for BatTester {
fn default() -> Self { fn default() -> Self {
let temp_dir = create_sample_directory().expect("sample directory"); let temp_dir = create_sample_directory().expect("sample directory");
let root = env::current_exe() let exe = assert_cmd::cargo::cargo_bin!("bat").to_path_buf();
.expect("tests executable")
.parent()
.expect("tests executable directory")
.parent()
.expect("bat executable directory")
.to_path_buf();
let exe_name = if cfg!(windows) { "bat.exe" } else { "bat" };
let exe = root.join(exe_name);
BatTester { temp_dir, exe } BatTester { temp_dir, exe }
} }

View File

@@ -4,7 +4,7 @@ use assert_cmd::cargo::CommandCargoExt;
use std::process::Command; use std::process::Command;
pub fn bat_raw_command_with_config() -> Command { pub fn bat_raw_command_with_config() -> Command {
let mut cmd = Command::cargo_bin("bat").unwrap(); let mut cmd = Command::new(assert_cmd::cargo::cargo_bin!("bat"));
cmd.current_dir("tests/examples"); cmd.current_dir("tests/examples");
cmd.env_remove("BAT_CACHE_PATH"); cmd.env_remove("BAT_CACHE_PATH");
cmd.env_remove("BAT_CONFIG_DIR"); cmd.env_remove("BAT_CONFIG_DIR");