1
0
mirror of https://github.com/sharkdp/bat synced 2026-08-04 19:01:44 +00:00

Compare commits

..

611 Commits

Author SHA1 Message Date
Keith Hall 410e284322 Ignore --wrap=character when output is not interactive
unless it was explicitly provided on the command line as opposed to in a config file / BAT_OPTS env var
2026-03-31 22:51:47 +03:00
Keith Hall 7d9884d6d2 Merge pull request #3655 from claw-explorer/docs/fish-abbr-removal
docs: add instructions for removing fish help abbreviations
2026-03-28 22:44:07 +02:00
Claw Explorer 652489251b docs: move removal instructions into a TIP callout
Address review feedback from @keith-hall: wrap the abbreviation
removal instructions in a GitHub callout (> [!TIP]) to visually
separate them from the main setup flow. Also reorder so the
'This way, you can keep on using...' sentence follows directly
after the abbreviation creation, improving readability.
2026-03-28 16:34:28 -04:00
Claw Explorer 89f3d2d31a docs: add instructions for removing fish help abbreviations
Add documentation showing how to erase the fish abbreviations for
--help and -h, since the dash-prefixed names make removal non-obvious.
The key is using -- before the abbreviation name to prevent fish from
interpreting it as a flag.

Closes #3536
2026-03-26 12:21:56 -04:00
Keith Hall 3ee9ea9a8d Merge pull request #3652 from cyqsimon/syntax-mapping-glob-parse-cleanup
Builtin syntax mapping: cleanup matcher glob parsing logic
2026-03-25 22:01:52 +02:00
cyqsimon b511b928f4 Write changelog 2026-03-25 15:58:58 +08:00
cyqsimon 3e789f5241 Imprv: cleanup matcher glob parsing logic
- Data flow is now strictly linear from `RawMatcher` to `Matcher`
  - I've also hoisted `RawMatcher` in front of `Matcher` to signal this
- Re-type `RawMatcher.case_sensitive` from `bool` to `Option<bool>`
  - This moves all parser logic away from `RawMatcher`, making it a more faithful representation of the data
- Favour default consts in `Matcher::try_from<RawMatcher>` to `Default` impl on `Case`
  - Because the default choice of casing is a design decision of the logic, not an intrinsic property of the type
2026-03-25 15:58:45 +08:00
Keith Hall a500fb236a Merge pull request #3650 from Sim-hu/fix/i686-deb-architecture
fix: use correct Debian architecture name for i686 .deb
2026-03-24 22:37:48 +02:00
Keith Hall 515b9d62db Merge branch 'master' into fix/i686-deb-architecture 2026-03-24 22:23:29 +02:00
Keith Hall 62907b1da5 Merge pull request #3651 from sharkdp/minus_home_end_keys
Add Home/End key bindings to builtin minus pager
2026-03-24 22:22:53 +02:00
Keith Hall eef7107407 update changelog 2026-03-24 21:38:07 +02:00
copilot-swe-agent[bot] 87e043b91c Add Home/End key bindings to builtin minus pager
Co-authored-by: keith-hall <11882719+keith-hall@users.noreply.github.com>
2026-03-24 21:33:43 +02:00
Sim-hu b8d462ba87 fix: add PR number and author to changelog entry 2026-03-24 19:24:36 +09:00
Sim-hu ca3ef28d56 fix: use correct Debian architecture name for i686 .deb package
The i686 .deb package declared its architecture as "i686", which
Debian does not recognize. Debian uses "i386" for 32-bit x86,
matching the convention already used by the other targets (arm64,
armhf, amd64).

Closes #3611
2026-03-24 19:20:18 +09:00
Sungjoon Moon 0b4c886efc ci: Use git version of cross for better target support 2026-03-24 06:09:32 +01:00
Keith Hall 780fdeb888 Merge pull request #3576 from vorburger/patch-2
feat: Map BUILD to Python (Starlark) for Bazel (fixes #3575)
2026-03-22 20:14:05 +02:00
Keith Hall 7a9c6e0de5 Merge branch 'master' into patch-2 2026-03-22 17:47:24 +02:00
Keith Hall a1e7c0ab4a Merge pull request #3643 from mvanhorn/feat/diff-plain-compatibility
feat: preserve change markers when combining --diff with --plain
2026-03-21 16:30:43 +02:00
Keith Hall 1e36873704 Merge branch 'master' into feat/diff-plain-compatibility 2026-03-21 16:21:56 +02:00
Matt Van Horn e86797fbf4 style: auto-format integration tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 15:46:54 -07:00
Matt Van Horn e60875ac12 fix: gate Changes component on git feature flag
When bat is built without the `git` feature, `StyleComponent::Changes`
is not available. Add `#[cfg(feature = "git")]` guard so `--diff --plain`
works in both configurations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 15:27:10 -07:00
Keith Hall 66eece4e2c Merge branch 'master' into patch-2 2026-03-20 23:57:19 +02:00
Keith Hall a19593b383 improvements from PR review
1. Added `Deserialize` derive and `#[serde(try_from = "RawMatcher")]` to the `Matcher` struct. With `try_from`, serde generates a `Deserialize` impl that first deserializes into `RawMatcher`, then calls `TryFrom<RawMatcher> for Matcher`. It never attempts to deserialize `Matcher`'s fields directly, so `Case` and `MatcherSegment` don't need `Deserialize` impls.
2. Replaced the manual `impl<'de> serde::Deserialize<'de> for Matcher` with a standard `impl TryFrom<RawMatcher> for Matcher`. The logic is identical - the conversion is fallible because `Matcher::from_str` returns `Result<_, anyhow::Error>`, so `try_from` (not `from`) is the correct choice, avoiding any panics.

The net effect: same behavior, same error handling, but using the idiomatic serde pattern instead of a manual deserializer impl. The `RawMatcher` intermediate type and its `#[serde(untagged)]` derive remain unchanged.
2026-03-20 23:53:30 +02:00
Keith Hall 7a6f442c86 improvements from PR review
- prefer to use `Default::default` because it's semantically clearer why we've chosen to use a particular value
2026-03-20 23:35:27 +02:00
Keith Hall 3767f15c2a improvements from PR review
fix documentation about syntax mappings
2026-03-20 23:34:38 +02:00
Keith Hall 1932d1da39 Merge pull request #3642 from mvanhorn/fix/deb-musl-package-names
fix: consistent .deb MUSL package names
2026-03-20 22:57:41 +02:00
Keith Hall b0e5590864 Merge branch 'master' into fix/deb-musl-package-names 2026-03-20 22:42:24 +02:00
Keith Hall f2daa1eb6e Merge pull request #3640 from eyupcanakman/fix/binary-as-text-width-3631
Fix line wrapping for files with control characters
2026-03-20 22:40:28 +02:00
Eyüp Can Akman 1f540752ef fix: reference PR number in CHANGELOG entry 2026-03-20 22:28:39 +02:00
Eyüp Can Akman fc94a0ec49 fix: account for caret notation width in text wrapping
Control characters displayed in caret notation (e.g. ^@ for NUL)
occupy 2 terminal columns, but the width calculation treated them
as 0-width. Add a char_width() helper that returns 2 for control
characters, fixing incorrect line wrapping with --binary=as-text.

Fixes #3631
2026-03-20 22:28:39 +02:00
Matt Van Horn 169dc7c45b test: add integration tests for --diff combined with --plain 2026-03-20 10:33:33 -07:00
Matt Van Horn 5e140558b1 fix: update changelog entry with PR number for CI check 2026-03-19 21:38:03 -07:00
Matt Van Horn 99c8e15c27 fix: update changelog entry with PR number for CI check 2026-03-19 21:37:45 -07:00
Matt Van Horn 2a3ed948ec feat: preserve change markers when combining --diff with --plain
When --plain is set (via CLI or config file), --diff output loses all
visual markers, making it indistinguishable from plain text. The diff
line filtering still works, but without Changes markers or Snip
separators the output is not useful.

Automatically include Changes and Snip style components when --diff is
active alongside --plain. This preserves the --plain intent (no grid,
no header, no line numbers) while keeping diff output readable.

Closes #3630
2026-03-19 21:35:48 -07:00
Matt Van Horn 618d7340bb fix: consistent .deb MUSL package names
Fix two inconsistencies in MUSL .deb package naming:

1. Change dpkg_arch for aarch64-unknown-linux-musl from `arm64` to
   `musl-linux-arm64` to match the convention used by other MUSL targets.

2. Change the DPKG_BASENAME case pattern from `*-musl)` to `*-musl*)`
   so it also matches `musleabihf`, giving the arm target the `bat-musl`
   prefix like all other MUSL packages.

After this fix, all MUSL .deb packages follow the consistent pattern:
`bat-musl_VERSION_musl-linux-ARCH.deb`

Closes #3482
2026-03-19 21:34:12 -07:00
Keith Hall 4a38eab3ea Merge pull request #3628 from XploitMonk0x01/codex/clarify-bat-vs-batcat
docs: clarify Ubuntu and Debian executable name
2026-03-19 23:00:59 +02:00
XploitMonk0x01 9fccdbc484 docs: clarify Ubuntu and Debian executable name 2026-03-19 22:50:23 +02:00
Keith Hall c6e661d80b cargo fmt 2026-03-18 22:25:07 +02:00
Keith Hall 031ba0953a Merge branch 'master' into patch-2 2026-03-18 22:17:18 +02:00
copilot-swe-agent[bot] 2a29802dd5 Refactor: string-or-struct matcher syntax, Case enum, remove case_sensitive_mappings table
Co-authored-by: keith-hall <11882719+keith-hall@users.noreply.github.com>
2026-03-18 22:16:50 +02:00
Keith Hall 31e30a2e97 Merge pull request #3636 from victor-gp/add-mapping-for-ignore-files
Add mapping for ignore files
2026-03-18 22:08:02 +02:00
Víctor González Prieto ffed52f6eb Document how to contribute syntax mappings 2026-03-18 21:58:23 +02:00
Víctor González Prieto a4e853c4fa Map ignore files to Git Ignore syntax
This would catch any dotfiles that end in "ignore", but not `.ignore`

Set as a lower priority rule (90 vs the usual 50) because it's a blanket
assignation. If there are conflict with other, more specific rules,
those will take precedence.
2026-03-18 21:58:23 +02:00
Keith Hall f11374535d Merge pull request #3629 from Rohan5commit/docs/fix-readme-wording
docs: fix README sidebar wording
2026-03-18 20:37:04 +02:00
rohan436 de209f8a23 docs: fix README sidebar wording 2026-03-18 20:15:53 +02:00
Keith Hall 22c38b6fcb Merge remote-tracking branch 'origin/master' into patch-2 2026-03-18 05:19:21 +02:00
Keith Hall 63d5796f8f Merge pull request #3635 from victor-gp/add-mappings-for-gcloud-cli
Add syntax mappings for GCloud CLI config files
2026-03-17 22:45:12 +02:00
Víctor González Prieto a1917275cd Add syntax mappings for GCloud CLI config files
> .boto => INI

I was uninstalling gcloud-cli and the docs said to review the contents
of ~/.boto [^1].

`bat` doesn't recognize it but it's just an INI-like file to configure
gsutil [^2].

I took the chance to add a few more mappings for other GCloud config
files without extension...

> .gcloudignore => Git Ignore

This one's self-explanatory, but it's documented in [^3].

Makes me wonder if we could just do a blanket `Git Ignore = ".?*ignore"`
for every kind of ignore file. For instance, `bat` doesn't catch
.dockerignore either.

> **/gcloud/configurations/config_* => INI

These are configuration files for each different profile you have
configured for the gcloud-cli [^4].

They're named like "config_default" or "config_<name>", without a
file extension, but they are also INI syntax [^5][^6].

[^1]: https://docs.cloud.google.com/sdk/docs/uninstall-cloud-sdk
[^2]: https://docs.cloud.google.com/storage/docs/boto-gsutil
[^3]: https://docs.cloud.google.com/sdk/gcloud/reference/topic/gcloudignore
[^4]: https://docs.cloud.google.com/sdk/docs/configurations
[^5]: https://stackoverflow.com/questions/74290882/return-active-gcp-project-name-programatically-for-both-local-dev-and-deployed-c/7^4292151#74292151
[^6]: https://stackoverflow.com/questions/49212350/where-does-gcloud-store-its-defaults/49256835#49256835
2026-03-17 20:51:23 +01:00
Keith Hall 884765bdeb Merge remote-tracking branch 'origin/master' into patch-2 2026-03-14 09:21:19 +02:00
Keith Hall 56fe0fa226 Add case-sensitive glob support to syntax mapping
to allow us to map `BUILD` case sensitively to Python for Skylark
2026-03-14 09:18:56 +02:00
Keith Hall d9adfe90fc Merge pull request #3627 from XploitMonk0x01/codex/clarify-theme-format
docs: clarify supported custom theme format
2026-03-14 09:08:30 +02:00
XploitMonk0x01 b1f04995a6 docs: clarify supported custom theme format 2026-03-14 11:44:38 +05:30
auto-merge-dependabot-prs[bot] ea6d2ac911 Merge pull request #3605 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/cmd-help-db0a616
build(deps): bump assets/syntaxes/02_Extra/cmd-help from `273cb98` to `db0a616`
2026-03-11 17:06:16 +00:00
dependabot[bot] ac97356930 build(deps): bump assets/syntaxes/02_Extra/cmd-help
Bumps [assets/syntaxes/02_Extra/cmd-help](https://github.com/victor-gp/cmd-help-sublime-syntax) from `273cb98` to `db0a616`.
- [Commits](https://github.com/victor-gp/cmd-help-sublime-syntax/compare/273cb988177e96f4187e06008b13fa72ad22ae4d...db0a616cfa367a4f52fd81d1a46c8ebea11e867d)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/cmd-help
  dependency-version: db0a616cfa367a4f52fd81d1a46c8ebea11e867d
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-11 16:54:46 +00:00
Keith Hall 23abbdcea9 Merge pull request #3584 from adukhan99/add-cobol-syntax
Add COBOL syntax highlighting
2026-03-11 18:51:14 +02:00
Alex Dukhan 927873392b Drop .ss extension from COBOL 2026-03-11 15:06:47 +00:00
Alex Dukhan 91965d28a6 Add COBOL sans CPY ext 2026-03-11 14:36:20 +00:00
Alex Dukhan 88ff40f93e Merge branch 'master' into add-cobol-syntax 2026-03-11 11:26:01 +00:00
Keith Hall 0dcdcb678a Merge pull request #3621 from Xavrir/fix-symlink-syntax-detection
Fix syntax highlighting for symlinked files by resolving target path
2026-03-08 20:01:25 +02:00
Rizky Mirzaviandy Priambodo f49641a6c3 Fix syntax highlighting for symlinked files by resolving target path
When a symlink name has no recognizable extension (e.g. Aliases/0install),
syntax detection fails because the symlink path doesn't match any syntax.
The target file may have a recognizable extension (e.g. Formula/zero-install.rb)
but was never consulted.

When path-based syntax detection fails with UndetectedSyntax, canonicalize
the path to resolve symlinks and retry detection with the target path.
This preserves existing behavior where the symlink path itself matches
(e.g. .ssh/config), since the original path is tried first.

Closes #1001
2026-03-09 00:01:09 +07:00
Keith Hall fc4f12b390 Merge pull request #3620 from Xavrir/fix-bat-config-dir-duplicate
Fix BAT_CONFIG_DIR pointing at system config directory causing duplicate flag errors
2026-03-08 08:23:14 +02:00
Rizky Mirzaviandy Priambodo 9cce9e04d2 Fix BAT_CONFIG_DIR pointing at system config dir causing duplicate flag errors
When BAT_CONFIG_DIR is set to the system config directory (e.g. /etc/bat),
both system_config_file() and config_file() resolve to /etc/bat/config.
The config file was read twice, causing clap errors for non-repeatable flags
like --italic-text.

Skip the user config read when it resolves to the same file as the system
config, using canonicalization to also handle symlinks.

Closes #3589
2026-03-08 12:20:27 +07:00
Rizky Mirzaviandy Priambodo 844bfded50 Add --fallback-syntax for undetected files (#3617)
* feat(cli): add fallback syntax option

Expose a new fallback syntax CLI option so users can opt into syntax highlighting only when auto-detection fails.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* feat(syntax): apply fallback only after detection fails

Use the fallback syntax only when path and first-line detection fail, preserving existing behavior for detected files and explicit language selection.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* test(cli): cover fallback syntax behavior

Add integration coverage for fallback syntax usage, precedence with --language, and no-op behavior when syntax is already detected; update help snapshots for the new option.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

* docs(changelog): document fallback syntax option

Record the new fallback syntax feature in the unreleased changelog section.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>

---------

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-03-08 05:18:29 +02:00
Matei6942 ab80bd9717 feat(syntax): add support for hidden_file_extensions (#3613)
* feat(syntax): add support for hidden_file_extensions
2026-03-06 20:14:20 +02:00
foxfromworld a1a10c777f Docs: clarify PATH requirement and explain highlighted outputs (Fixes… (#3610)
* Docs: clarify PATH requirement and explain highlighted outputs (Fixes #2376)

* Update CHANGELOG for PR #3610

* Apply suggestion from @keith-hall

Applied reviewer’s suggestion to improve PATH export: safer with quotes and more convenient with $(pwd).

Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>

* Docs: clarify PATH setup in CONTRIBUTING.md, remove that section from README.md

* Docs: add cross reference to syntax tests step 5 in doc/assets.md

---------

Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>
2026-03-05 05:55:05 +00:00
Varun Chawla cc5f782d28 Add word wrapping mode (#3597)
* feat: add word wrapping mode for --wrap flag

* Run `cargo fmt` and add CHANGELOG entry

* Add word wrap tests, update manpage and shell completions

- Add integration tests for word wrapping: basic word boundary breaking,
  fallback to character wrapping for long words, line numbers, and
  short lines that fit without wrapping
- Update manpage to document the new 'word' wrapping mode
- Update bash, fish, zsh, and PowerShell completions with 'word' option
- Avoid unnecessary clone of `line_buf` when word wrap is disabled

* make clippy and cargo fmt happy

---------

Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>
2026-03-03 05:18:49 +02:00
Keith Hall 1424f9d6bf Merge pull request #3609 from Nicolas0315/fix/builtin-pager-drop-panic
Fix panic in BuiltinPager Drop when pager thread fails (#3449)
2026-03-02 04:57:37 +02:00
Nicolas fd67095cff Fix panic in BuiltinPager drop when pager thread panics
The Drop impl for OutputType::BuiltinPager calls
handle.take().unwrap().join().unwrap() which panics if the
pager thread itself panicked. In Drop, this causes a double
panic (abort).

Replace with if-let and discard the join result, matching the
pattern used for OutputType::Pager which also uses let _ =.

Reported in #3449 where BAT_PAGER=builtin with --help
causes the pager thread to fail.

Fixes #3449
2026-03-02 04:12:50 +09:00
auto-merge-dependabot-prs[bot] 908b1f22d1 Merge pull request #3608 from sharkdp/dependabot/cargo/bytesize-2.3.1
build(deps): bump bytesize from 1.3.0 to 2.3.1
2026-03-01 04:47:12 +00:00
dependabot[bot] 17a70d9b8c build(deps): bump bytesize from 1.3.0 to 2.3.1
Bumps [bytesize](https://github.com/bytesize-rs/bytesize) from 1.3.0 to 2.3.1.
- [Release notes](https://github.com/bytesize-rs/bytesize/releases)
- [Changelog](https://github.com/bytesize-rs/bytesize/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bytesize-rs/bytesize/compare/v1.3.0...bytesize-v2.3.1)

---
updated-dependencies:
- dependency-name: bytesize
  dependency-version: 2.3.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 04:36:13 +00:00
auto-merge-dependabot-prs[bot] 49d77a469a Merge pull request #3607 from sharkdp/dependabot/cargo/clap-4.5.60
build(deps): bump clap from 4.5.56 to 4.5.60
2026-03-01 04:33:43 +00:00
dependabot[bot] fa35495888 build(deps): bump clap from 4.5.56 to 4.5.60
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.56 to 4.5.60.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.56...clap_complete-v4.5.60)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.60
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 04:18:28 +00:00
auto-merge-dependabot-prs[bot] 8a858b19dc Merge pull request #3606 from sharkdp/dependabot/cargo/git2-0.20.4
build(deps): bump git2 from 0.20.3 to 0.20.4
2026-03-01 04:16:23 +00:00
dependabot[bot] 397252d2cc build(deps): bump git2 from 0.20.3 to 0.20.4
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.20.3 to 0.20.4.
- [Changelog](https://github.com/rust-lang/git2-rs/blob/git2-0.20.4/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/git2-rs/compare/git2-0.20.3...git2-0.20.4)

---
updated-dependencies:
- dependency-name: git2
  dependency-version: 0.20.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 04:00:55 +00:00
auto-merge-dependabot-prs[bot] 5e59957349 Merge pull request #3603 from sharkdp/dependabot/cargo/nix-0.31.2
build(deps): bump nix from 0.30.1 to 0.31.2
2026-03-01 03:58:09 +00:00
dependabot[bot] 90f8e00e0c build(deps): bump nix from 0.30.1 to 0.31.2
Bumps [nix](https://github.com/nix-rust/nix) from 0.30.1 to 0.31.2.
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.30.1...v0.31.2)

---
updated-dependencies:
- dependency-name: nix
  dependency-version: 0.31.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 03:35:51 +00:00
auto-merge-dependabot-prs[bot] 673929c189 Merge pull request #3604 from sharkdp/dependabot/cargo/serde_with-3.17.0
build(deps): bump serde_with from 3.16.1 to 3.17.0
2026-03-01 03:32:28 +00:00
dependabot[bot] e36bb8cc66 build(deps): bump serde_with from 3.16.1 to 3.17.0
Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.16.1 to 3.17.0.
- [Release notes](https://github.com/jonasbb/serde_with/releases)
- [Commits](https://github.com/jonasbb/serde_with/compare/v3.16.1...v3.17.0)

---
updated-dependencies:
- dependency-name: serde_with
  dependency-version: 3.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 03:04:00 +00:00
Keith Hall 7d7e202bd5 Merge pull request #3588 from IMaloney/fix/warn-missing-pager
warn when pager is missing instead of silently falling back
2026-02-20 20:46:38 +02:00
Keith Hall 74de075748 Merge branch 'master' into fix/warn-missing-pager 2026-02-20 20:37:07 +02:00
Keith Hall 594069581d Merge pull request #3592 from IMaloney/fix/wrap-never-clean
respect --wrap=never flag when piping to pager
2026-02-20 20:26:23 +02:00
Ian Maloney 62b0388236 remove code comments 2026-02-20 06:12:14 +00:00
Ian Maloney 16d041492c fix pr number in changelog 2026-02-20 06:07:23 +00:00
Ian Maloney 22ee03ff00 add changelog entry for wrap-never bug fix 2026-02-20 06:04:29 +00:00
Ian Maloney 790bed3a2d fix: respect --wrap=never flag when paging is enabled
When output is piped to a pager, the wrapping_mode logic was not checking the explicit --wrap=never flag and would always default to NoWrapping(false). This meant the -S flag was not passed to less, causing lines to wrap despite the user's explicit request.

The fix prioritizes explicit CLI flags (--wrap=never, --chop-long-lines) over the interactive_output-based logic, ensuring they are always respected.

Fixes #3587
2026-02-20 06:04:14 +00:00
Ian Maloney bc84854d4b use cat as test pager instead of builtin (builtin is interactive, doesnt output to stdout) 2026-02-20 00:19:47 +00:00
Ian Maloney 319811df01 fix test: use builtin pager instead of less, revert to warn for all missing pagers 2026-02-20 00:09:02 +00:00
Ian Maloney 2c1a8caadd simplify: just never warn for less (universal default) 2026-02-19 22:49:02 +00:00
Ian Maloney a240aa4afd never warn for missing 'less' pager (common default) 2026-02-19 22:21:17 +00:00
Ian Maloney 00e38cd056 only warn for explicitly configured pagers, not defaults 2026-02-19 22:01:58 +00:00
Ian Maloney 335eff51f3 fix type error, pager.bin is already a string 2026-02-19 21:44:47 +00:00
Ian Maloney d04b960c05 warn when pager is missing instead of silently falling back
when a configured pager (via BAT_PAGER, PAGER, or --pager) is not found,
bat now shows a warning message before falling back to stdout. this helps
users understand why their pager isn't running and makes it obvious when
there's a typo or PATH issue.

fixes issue #2904
2026-02-19 21:29:59 +00:00
Keith Hall fbc05da785 Merge pull request #3586 from BlueElectivire/master
Fixed manpage syntax to remove ANSI artifacts
2026-02-19 18:56:14 +02:00
Guy Barzilai a71d16fa1b Fixed manpage syntax-test format 2026-02-19 18:11:36 +02:00
Guy Barzilai 5bd08845a3 Fixed manpage regex regression and add syntax test 2026-02-18 23:59:38 +02:00
Guy Barzilai 3ebfbb7ac5 Fixed manpage syntax to remove ANSI artifacts 2026-02-17 21:54:58 +02:00
Alex Dukhan 2b47f3c5eb Updated CHANGELOG.md 2026-02-12 22:10:08 +00:00
Alex Dukhan 9f8ac934ab Updated CHANGELOG.md 2026-02-12 21:43:34 +00:00
Alex Dukhan ab393a0281 Add COBOL syntax highlighting 2026-02-12 21:06:03 +00:00
Keith Hall 990b2fc06f Merge pull request #3583 from mainnebula/steward/sharkdp-bat-3555-2de8ac3c
feat: implement --unbuffered mode for streaming input
2026-02-12 08:40:44 +02:00
mainnebula 0c883d6f28 docs: add changelog entry for --unbuffered mode (#3583) 2026-02-11 23:45:20 -05:00
mainnebula 167dda63a8 feat: implement --unbuffered mode for streaming input (#3555)
Repurpose the existing --unbuffered/-u flag (previously a POSIX no-op)
to enable unbuffered input reading using fill_buf()/consume() instead
of read_until(b'\n'). This allows partial lines to display immediately
when piping streaming input like `tail -f` into bat.

- Add unbuffered field to Config and InputReader
- Add read_line_unbuffered() using BufRead::fill_buf()/consume()
- Add flush() to OutputHandle, called after each line in unbuffered mode
- Auto-disable line numbers in unbuffered mode to avoid partial line confusion
- Update help text, man page, and shell completions
- Add unit tests and integration tests
2026-02-11 23:27:08 -05:00
dddffgg cb8b637574 fix(cache): allow --help flag for cache subcommand (#3580)
* fix(cache): allow --help flag for cache subcommand

* docs: add changelog entry for cache --help fix
2026-02-09 05:06:40 +02:00
Keith Hall 391e7ff072 Merge pull request #3581 from NORMAL-EX/chore/update-time-crate
chore(deps): update time crate to 0.3.47 (RUSTSEC-2026-0009)
2026-02-07 13:37:17 +02:00
dddffgg 2b517199a2 docs: add changelog entry for MSRV bump and time crate update 2026-02-07 19:23:57 +08:00
dddffgg a0f326aa22 chore: bump MSRV to 1.88 2026-02-07 19:23:47 +08:00
dddffgg a4a7692134 chore(deps): update time crate to 0.3.47 (RUSTSEC-2026-0009) 2026-02-06 21:32:02 +08:00
Keith Hall 3df9d581b7 Merge pull request #3527 from Anchal-T/master
Fix bat crash with BusyBox less on Windows
2026-02-03 22:40:04 +02:00
Keith Hall eb724f2dc4 Merge branch 'master' into master 2026-02-03 22:27:30 +02:00
Keith Hall c491488140 Merge pull request #3578 from vorburger/nix
Add initial flake.nix; just for develop, for now (fixes#3577)
2026-02-03 22:25:49 +02:00
Michael Vorburger 3f12b1c1ab docs: Use PR not Issue ID in CHANGELOG.md 2026-02-01 14:20:40 +01:00
Michael Vorburger 2c682ff6a6 docs: Document flake.nix in CHANGELOG.md (see #3577) 2026-02-01 14:13:03 +01:00
Michael Vorburger 36b37e1aa5 Add x86_64-darwin (Intel macOS) to flake.nix 2026-02-01 14:11:05 +01:00
Michael Vorburger d19c80a7c1 Remove allowUnfree = true from flake.nix
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-01 14:09:18 +01:00
Michael Vorburger eff57943c9 Add initial flake.nix; just for develop, for now (fixes#3577) 2026-02-01 14:06:05 +01:00
Michael Vorburger 5a4a7de933 docs: Document mapping BUILD to Python (Starlark) for Bazel in CHANGELOG.md (see #3576) 2026-02-01 13:40:51 +01:00
Michael Vorburger ba97230b98 feat: Map BUILD to Python (Starlark) for Bazel (fixes #3575)
See #3575.
2026-02-01 13:34:33 +01:00
Keith Hall 8664cc9df9 Merge pull request #3563 from NORMAL-EX/feat/quiet-empty
feat: add --quiet-empty flag to suppress output on empty input
2026-02-01 11:15:45 +02:00
dddffgg 3b34b47d55 docs: add --quiet-empty to PowerShell completion 2026-02-01 16:21:38 +08:00
dddffgg 9a5519057c docs: add --quiet-empty to fish completion 2026-02-01 16:21:22 +08:00
dddffgg 93411a96e4 docs: add --quiet-empty to zsh completion 2026-02-01 16:21:05 +08:00
dddffgg bd461afd75 docs: add --quiet-empty to bash completion 2026-02-01 16:20:49 +08:00
dddffgg 55306c15a6 docs: add --quiet-empty to man page 2026-02-01 16:20:27 +08:00
dddffgg afd804ebea Merge branch 'master' into feat/quiet-empty 2026-02-01 14:50:07 +08:00
auto-merge-dependabot-prs[bot] 3d0a7ed0a0 Merge pull request #3568 from sharkdp/dependabot/cargo/indexmap-2.13.0
build(deps): bump indexmap from 2.12.1 to 2.13.0
2026-02-01 05:30:27 +00:00
dependabot[bot] 8f6f5dfbd2 build(deps): bump indexmap from 2.12.1 to 2.13.0
Bumps [indexmap](https://github.com/indexmap-rs/indexmap) from 2.12.1 to 2.13.0.
- [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md)
- [Commits](https://github.com/indexmap-rs/indexmap/compare/2.12.1...2.13.0)

---
updated-dependencies:
- dependency-name: indexmap
  dependency-version: 2.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 05:19:49 +00:00
auto-merge-dependabot-prs[bot] 43ab174d42 Merge pull request #3567 from sharkdp/dependabot/cargo/proc-macro2-1.0.106
build(deps): bump proc-macro2 from 1.0.103 to 1.0.106
2026-02-01 05:16:54 +00:00
dependabot[bot] b396ab865f build(deps): bump proc-macro2 from 1.0.103 to 1.0.106
Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.103 to 1.0.106.
- [Release notes](https://github.com/dtolnay/proc-macro2/releases)
- [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.103...1.0.106)

---
updated-dependencies:
- dependency-name: proc-macro2
  dependency-version: 1.0.106
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 04:54:36 +00:00
auto-merge-dependabot-prs[bot] 8a82847121 Merge pull request #3571 from sharkdp/dependabot/cargo/serde_with-3.16.1
build(deps): bump serde_with from 3.15.1 to 3.16.1
2026-02-01 04:48:09 +00:00
dependabot[bot] c3c19c8018 build(deps): bump serde_with from 3.15.1 to 3.16.1
Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.15.1 to 3.16.1.
- [Release notes](https://github.com/jonasbb/serde_with/releases)
- [Commits](https://github.com/jonasbb/serde_with/compare/v3.15.1...v3.16.1)

---
updated-dependencies:
- dependency-name: serde_with
  dependency-version: 3.16.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 04:19:31 +00:00
auto-merge-dependabot-prs[bot] 0d2078b32b Merge pull request #3569 from sharkdp/dependabot/cargo/clap-4.5.56
build(deps): bump clap from 4.5.46 to 4.5.56
2026-02-01 04:15:25 +00:00
dependabot[bot] cddfad83e4 build(deps): bump clap from 4.5.46 to 4.5.56
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.46 to 4.5.56.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.46...clap_complete-v4.5.56)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.56
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 03:49:22 +00:00
dddffgg 2e355ffa4e Merge branch 'master' into feat/quiet-empty 2026-02-01 11:48:43 +08:00
dddffgg fa66d8e3ef fix: correct position of --quiet-empty in long-help.txt 2026-02-01 11:48:10 +08:00
dddffgg cb83b8fb9a fix: correct position of --quiet-empty in short-help.txt 2026-02-01 11:47:24 +08:00
auto-merge-dependabot-prs[bot] adfdcf4c6d Merge pull request #3564 from sharkdp/dependabot/cargo/git2-0.20.3
build(deps): bump git2 from 0.20.2 to 0.20.3
2026-02-01 03:39:56 +00:00
dependabot[bot] 593cf76811 build(deps): bump git2 from 0.20.2 to 0.20.3
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.20.2 to 0.20.3.
- [Changelog](https://github.com/rust-lang/git2-rs/blob/git2-0.20.3/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/git2-rs/compare/git2-0.20.2...git2-0.20.3)

---
updated-dependencies:
- dependency-name: git2
  dependency-version: 0.20.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-01 03:03:36 +00:00
dddffgg 3aaec8cb3b docs: update long-help.txt with --quiet-empty flag 2026-01-31 17:02:24 +08:00
dddffgg 2030ffa664 docs: update short-help.txt with --quiet-empty flag 2026-01-31 17:02:12 +08:00
dddffgg edb8342eab docs: fix changelog entry to reference PR number 2026-01-31 16:48:03 +08:00
dddffgg 6a7936a26f test: add integration tests for --quiet-empty flag 2026-01-31 16:45:46 +08:00
dddffgg 26118afde0 docs: add changelog entry for --quiet-empty flag 2026-01-31 16:44:39 +08:00
dddffgg 783acbc83d feat: implement quiet_empty behavior in printer 2026-01-31 16:42:28 +08:00
dddffgg 6f0a61cef9 feat: wire up quiet_empty config in app 2026-01-31 16:41:46 +08:00
dddffgg 53a10e0b0a feat: add --quiet-empty CLI flag 2026-01-31 16:41:13 +08:00
dddffgg 626154317f feat: add quiet_empty config option 2026-01-31 16:40:59 +08:00
Keith Hall 885ae1dc81 Merge pull request #3561 from cerdelen/small_typo_fix
Small typo fixes
2026-01-28 22:03:09 +02:00
Cedric Erdelen f6f1f18e9c remove trailing whitespace 2026-01-28 19:59:10 +01:00
cerdelen 69a2ffbdac Update src/config.rs
Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>
2026-01-28 19:48:02 +01:00
Cedric Erdelen 6b8decf2a4 Small typo fixes 2026-01-28 14:12:32 +01:00
Keith Hall cd06fe46e0 Merge pull request #3552 from CosmicHorrorDev/remove-vs-dark+
Remove Visual Studio Dark+ theme
2026-01-15 22:13:41 +02:00
Cosmic Horror 099d716455 Remove Visual Studio Dark+ theme 2026-01-14 21:13:44 -07:00
auto-merge-dependabot-prs[bot] 298e1f5321 Merge pull request #3506 from sharkdp/dependabot/github_actions/actions/checkout-6
build(deps): bump actions/checkout from 5 to 6
2026-01-12 05:14:43 +00:00
dependabot[bot] 3cb55e85d0 build(deps): bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-12 06:04:14 +01:00
Keith Hall 981f25989a Merge pull request #3550 from nmacl/master
Use cargo_bin! macro to fix tests for future Cargo versions
2026-01-10 13:53:09 +02:00
Your Name 57bf8ff7da Update changelog with PR number 2026-01-08 09:45:41 -05:00
Your Name 31f982e736 Fixed formatting 2026-01-08 09:42:42 -05:00
Your Name 0a97a1edd7 Add changelog entry 2026-01-08 09:35:01 -05:00
Your Name 6c75acfffc Replace deprecated cargo_bin with cargo_bin! macro
The old Command::cargo_bin() is deprecated and will break when Cargo
changes build directory layout. Updated to use cargo_bin!() macro instead.

Bumped assert_cmd to 2.0.16 to get the new macro.

Fixes #3528
2026-01-08 09:28:11 -05:00
auto-merge-dependabot-prs[bot] 4e84e838a3 Merge pull request #3544 from sharkdp/dependabot/cargo/shell-words-1.1.1
build(deps): bump shell-words from 1.1.0 to 1.1.1
2026-01-01 04:33:25 +00:00
dependabot[bot] d48bf240a7 build(deps): bump shell-words from 1.1.0 to 1.1.1
Bumps [shell-words](https://github.com/tmiasko/shell-words) from 1.1.0 to 1.1.1.
- [Commits](https://github.com/tmiasko/shell-words/compare/v1.1.0...v1.1.1)

---
updated-dependencies:
- dependency-name: shell-words
  dependency-version: 1.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-01 04:20:47 +00:00
auto-merge-dependabot-prs[bot] 7dc180eefb Merge pull request #3542 from sharkdp/dependabot/cargo/console-0.16.2
build(deps): bump console from 0.16.1 to 0.16.2
2026-01-01 04:18:01 +00:00
dependabot[bot] 3276e9469a build(deps): bump console from 0.16.1 to 0.16.2
Bumps [console](https://github.com/console-rs/console) from 0.16.1 to 0.16.2.
- [Release notes](https://github.com/console-rs/console/releases)
- [Changelog](https://github.com/console-rs/console/blob/main/CHANGELOG.md)
- [Commits](https://github.com/console-rs/console/compare/0.16.1...0.16.2)

---
updated-dependencies:
- dependency-name: console
  dependency-version: 0.16.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-01 04:03:19 +00:00
auto-merge-dependabot-prs[bot] 60902c796f Merge pull request #3541 from sharkdp/dependabot/cargo/nu-ansi-term-0.50.3
build(deps): bump nu-ansi-term from 0.50.1 to 0.50.3
2026-01-01 04:00:33 +00:00
dependabot[bot] c12cdcace3 build(deps): bump nu-ansi-term from 0.50.1 to 0.50.3
Bumps [nu-ansi-term](https://github.com/nushell/nu-ansi-term) from 0.50.1 to 0.50.3.
- [Release notes](https://github.com/nushell/nu-ansi-term/releases)
- [Changelog](https://github.com/nushell/nu-ansi-term/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nushell/nu-ansi-term/compare/v0.50.1...v0.50.3)

---
updated-dependencies:
- dependency-name: nu-ansi-term
  dependency-version: 0.50.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-01 03:19:08 +00:00
auto-merge-dependabot-prs[bot] 823fd9f5c6 Merge pull request #3539 from sharkdp/dependabot/cargo/tempfile-3.23.0
build(deps): bump tempfile from 3.16.0 to 3.23.0
2026-01-01 03:15:20 +00:00
dependabot[bot] 88d6fd0248 build(deps): bump tempfile from 3.16.0 to 3.23.0
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.16.0 to 3.23.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.16.0...v3.23.0)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-version: 3.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-01 03:02:10 +00:00
Keith Hall 32047346e3 Merge pull request #3534 from ltrzesniewski/windows-clone
Make the repository clone correctly under Windows
2025-12-28 08:02:56 +02:00
Lucas Trzesniewski 56678dc771 Change the Jinja2 fork URL 2025-12-28 07:53:27 +02:00
Lucas Trzesniewski b34a1e0cc2 Make the repository clone correctly under Windows 2025-12-28 07:53:27 +02:00
Keith Hall 41f55bf902 Merge pull request #3535 from ltrzesniewski/windows-build
Fix integration tests on Windows
2025-12-28 07:46:13 +02:00
Lucas Trzesniewski c8514543af Fix integration tests on Windows 2025-12-27 21:17:40 +01:00
Hakil ad608014d9 fix issue #3526 (#3529) 2025-12-23 19:08:38 +02:00
Anchal 782ce71247 Update issue references in CHANGELOG.md 2025-12-16 22:40:35 +05:30
Anchal 8c7fccc8a5 Update changelog for feature #3527 2025-12-16 22:33:44 +05:30
ANCHAL fca5502f21 Fix bat crash with BusyBox less on Windows
- Retrieve less version earlier in src/output.rs.
- Skip -K argument if less is detected as BusyBox version.
- Reuses the version check for the existing --no-init logic.
- Fixes #3518.
2025-12-16 22:25:27 +05:30
Keith Hall 9bf344f760 Merge pull request #3517 from akirk/strip-overstriking
Improve native man pages and command help syntax highlighting by stripping overstriking
2025-12-11 08:36:18 +02:00
Alex Kirk 4db185834b Update changelog 2025-12-11 06:12:44 +01:00
Alex Kirk 4549ab3f22 Move the strip_overstrike check 2025-12-11 06:06:07 +01:00
Alex Kirk 629a8968fc Remove unnecessary code change 2025-12-11 05:54:30 +01:00
Alex Kirk de414ed631 Limit overstrike stripping to man pages and help 2025-12-11 05:49:46 +01:00
Alex Kirk 59c5896902 Simplify MANPAGER guide 2025-12-11 05:49:46 +01:00
Alex Kirk b22fc5db6b Add show-all integration test 2025-12-11 05:49:46 +01:00
Alex Kirk f97f9ebf03 Remove double backspace scan 2025-12-11 05:49:46 +01:00
Alex Kirk 64a4b204a2 Only strip overstrike when a syntax highlighting theme is used 2025-12-11 05:49:46 +01:00
Alex Kirk 5fb8a25c30 Performance optimization 2025-12-11 05:49:46 +01:00
Alex Kirk 80ef6832d3 Add a changelog entry 2025-12-11 05:49:46 +01:00
Alex Kirk 51bdaa5f88 Strip overstriking to better support man pages 2025-12-11 05:49:46 +01:00
Keith Hall eb2a8e29c7 Merge pull request #3524 from sharkdp/help_custom_assets
Support custom assets (themes) when displaying help output
2025-12-10 22:39:51 +02:00
Keith Hall b7dd88eafd Support custom assets (themes) when displaying help output 2025-12-10 22:30:01 +02:00
Keith Hall 79fe5fea63 Merge pull request #3521 from sharkdp/rainbow_csv_strings
[CSV] don't apply string highlighting by default
2025-12-08 20:08:04 +02:00
Keith Hall d15e399fce [CSV] don't apply string highlighting by default 2025-12-07 21:55:05 +02:00
Keith Hall 4d188e45fe Merge pull request #3519 from sorairolake/change-zig-url
chore: Change URL of Zig submodule from GitHub to Codeberg
2025-12-06 13:18:58 +02:00
Shun Sakai abce6ac0d1 chore: Change URL of Zig submodule 2025-12-06 12:00:48 +09:00
Keith Hall 566595f0eb Merge pull request #3516 from sharkdp/fix_help_builtin_pager
Fix --help --pager=builtin
2025-12-05 22:22:22 +02:00
Keith Hall 1796324531 Fix --help --pager=builtin
Previously it still used less
2025-12-04 21:53:45 +02:00
David Peter 2371077352 Update sponsors section (#3514)
Removed Graphite sponsorship information from README.
2025-12-04 09:29:18 +01:00
Keith Hall 7e7ab8a860 Merge pull request #3511 from sharkdp/prepare_changelog
add empty changelog sections ready for future changes
2025-12-03 22:48:16 +02:00
Keith Hall c054541776 add empty changelog sections ready for future changes 2025-12-03 22:37:26 +02:00
auto-merge-dependabot-prs[bot] d6ffe3a9be Merge pull request #3503 from sharkdp/dependabot/cargo/execute-0.2.15
build(deps): bump execute from 0.2.13 to 0.2.15
2025-12-02 22:34:27 +00:00
dependabot[bot] 4a1ceb3ce0 build(deps): bump execute from 0.2.13 to 0.2.15
Bumps [execute](https://github.com/magiclen/execute) from 0.2.13 to 0.2.15.
- [Commits](https://github.com/magiclen/execute/compare/v0.2.13...v0.2.15)

---
updated-dependencies:
- dependency-name: execute
  dependency-version: 0.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 22:24:11 +00:00
auto-merge-dependabot-prs[bot] 45a6ee95d5 Merge pull request #3505 from sharkdp/dependabot/cargo/toml-0.9.8
build(deps): bump toml from 0.9.1 to 0.9.8
2025-12-02 22:21:11 +00:00
dependabot[bot] 3eeaf29675 build(deps): bump toml from 0.9.1 to 0.9.8
Bumps [toml](https://github.com/toml-rs/toml) from 0.9.1 to 0.9.8.
- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.9.1...toml-v0.9.8)

---
updated-dependencies:
- dependency-name: toml
  dependency-version: 0.9.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 22:06:24 +00:00
auto-merge-dependabot-prs[bot] 58d1fa83e9 Merge pull request #3504 from sharkdp/dependabot/cargo/proc-macro2-1.0.103
build(deps): bump proc-macro2 from 1.0.95 to 1.0.103
2025-12-02 22:04:00 +00:00
dependabot[bot] 9d4ca3bc22 build(deps): bump proc-macro2 from 1.0.95 to 1.0.103
Bumps [proc-macro2](https://github.com/dtolnay/proc-macro2) from 1.0.95 to 1.0.103.
- [Release notes](https://github.com/dtolnay/proc-macro2/releases)
- [Commits](https://github.com/dtolnay/proc-macro2/compare/1.0.95...1.0.103)

---
updated-dependencies:
- dependency-name: proc-macro2
  dependency-version: 1.0.103
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 21:48:06 +00:00
auto-merge-dependabot-prs[bot] 9b23b05841 Merge pull request #3502 from sharkdp/dependabot/cargo/console-0.16.1
build(deps): bump console from 0.16.0 to 0.16.1
2025-12-02 21:45:41 +00:00
dependabot[bot] f3e8ffc276 build(deps): bump console from 0.16.0 to 0.16.1
Bumps [console](https://github.com/console-rs/console) from 0.16.0 to 0.16.1.
- [Release notes](https://github.com/console-rs/console/releases)
- [Changelog](https://github.com/console-rs/console/blob/main/CHANGELOG.md)
- [Commits](https://github.com/console-rs/console/compare/0.16.0...0.16.1)

---
updated-dependencies:
- dependency-name: console
  dependency-version: 0.16.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 21:21:35 +00:00
auto-merge-dependabot-prs[bot] 9b73911f2c Merge pull request #3501 from sharkdp/dependabot/cargo/grep-cli-0.1.12
build(deps): bump grep-cli from 0.1.11 to 0.1.12
2025-12-02 21:19:00 +00:00
dependabot[bot] 25bfa9fa81 build(deps): bump grep-cli from 0.1.11 to 0.1.12
Bumps [grep-cli](https://github.com/BurntSushi/ripgrep) from 0.1.11 to 0.1.12.
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/ripgrep/compare/grep-cli-0.1.11...grep-cli-0.1.12)

---
updated-dependencies:
- dependency-name: grep-cli
  dependency-version: 0.1.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-02 20:47:04 +00:00
Keith Hall 979ba22628 Merge pull request #3510 from sharkdp/prepare_release
Prepare for next release
2025-12-02 22:44:14 +02:00
Keith Hall 19ab724a73 Prepare for next release 2025-12-02 22:33:02 +02:00
Keith Hall def49e19a7 Merge pull request #3509 from sharkdp/ksh
Add syntax detection for files with ksh shebang lines
2025-12-02 22:15:48 +02:00
Keith Hall 1fb269a0fb Add syntax detection for files with ksh shebang lines 2025-12-02 22:06:21 +02:00
Keith Hall 0e469634a3 return None for get_pager_executable when builtin pager is used (#3498) 2025-12-01 20:02:55 +00:00
Keith Hall 6dfe471686 Merge pull request #3507 from sharkdp/help_read_theme_from_config
Ensure --help respects valid config file
2025-12-01 21:36:58 +02:00
Keith Hall 2c7fc5f926 update changelog 2025-12-01 06:51:04 +02:00
Keith Hall 579d371378 Ensure --help respects valid config file
While still ignoring ignoring invalid arguments in the config
2025-12-01 05:30:05 +02:00
auto-merge-dependabot-prs[bot] c74ca27075 Merge pull request #3500 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/Idris2-bbfe50e
build(deps): bump assets/syntaxes/02_Extra/Idris2 from `2874f20` to `bbfe50e`
2025-12-01 03:21:57 +00:00
dependabot[bot] e8f7b12bb1 build(deps): bump assets/syntaxes/02_Extra/Idris2
Bumps [assets/syntaxes/02_Extra/Idris2](https://github.com/buzden/sublime-syntax-idris2) from `2874f20` to `bbfe50e`.
- [Commits](https://github.com/buzden/sublime-syntax-idris2/compare/2874f206f56c588a29fd76b88043129471d1454a...bbfe50e023e0edc74f5e0c003eb946528d49279f)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Idris2
  dependency-version: bbfe50e023e0edc74f5e0c003eb946528d49279f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-01 03:06:08 +00:00
Keith Hall e7006b53e3 Merge pull request #3497 from xduugu/quadlet
Add syntax mapping for podman's `artifact` quadlet files
2025-11-30 14:26:53 +02:00
Cedric Staniewski a6e0057c12 Add syntax mapping for podman's artifact quadlet files 2025-11-30 14:18:12 +02:00
Keith Hall 1ffed0c039 Merge pull request #3496 from sharkdp/decorations_auto
Restore expected behavior when piping output with styles configured and auto decorations
2025-11-30 05:14:01 +02:00
Keith Hall 602df893de Add additional test cases for -n in loop through mode 2025-11-30 05:02:13 +02:00
Keith Hall 3755f788ca Improve -n detection to handle combined flags correctly
Updated the logic to correctly handle combined short flags like -pn and -np.
The -n flag is only honored when it's either:
1. A standalone flag (-n or --number)
2. The last flag in a combined form that includes -p (e.g., -pn), or
3. In a combined form without -p (e.g., -An)

This ensures that -np (where -p overrides -n) correctly produces plain output,
while -pn (where -n overrides -p) produces line numbers.
2025-11-30 05:02:13 +02:00
Keith Hall abc7261488 Fix -n flag to show line numbers in loop-through mode
When the -n/--number flag is passed on the command line, bat now shows
line numbers even when piping output to another process (loop-through
mode), similar to how `cat -n` behaves.

This change detects if -n or --number was passed on the CLI (before
merging with config file and environment variables) and disables
loop-through mode in that case, allowing the InteractivePrinter to
add line numbers.

The existing behavior is preserved:
- Styles from config/env are still ignored when piping (unless --decorations=always is set)
- Only the -n flag from CLI enables line numbers in piped mode
- -p and --style options from CLI do not disable loop-through mode
2025-11-30 05:02:13 +02:00
Keith Hall f9c33971d9 Update readme to mention decorations 2025-11-30 05:02:13 +02:00
Keith Hall 7d37325c19 Fix to not show style decorations in auto mode when piping 2025-11-30 05:02:13 +02:00
Keith Hall d17481575a Merge pull request #3495 from sharkdp/powershell_completions
Update PowerShell completions for compatibility with PowerShell v5.1
2025-11-28 22:49:44 +02:00
Keith Hall 1ee1d8fdff update changelog 2025-11-27 21:57:47 +02:00
Keith Hall af8f0626ac Update PowerShell completions for compatibility with PowerShell v5.1
Modified the PowerShell completion script to replace the null-coalescing operator (`??` - a v7 feature) with a conditional statement compatible with PowerShell v5.1. The script now uses an if-else check for null descriptions in the language completion section.
2025-11-27 21:50:17 +02:00
Keith Hall c88353b386 Merge pull request #3476 from sharkdp/docker_syntax_fix
Revert "Bump assets/syntaxes/02_Extra/Docker from `0f6b7bc` to `c001fb2` (#3024)"
2025-11-26 22:19:06 +02:00
Keith Hall 961f367ca8 use newer MacOS runner images
otherwise CI fails due to the brownout https://github.com/actions/runner-images/issues/13046
2025-11-26 22:07:06 +02:00
Keith Hall 8bf3be5e61 Revert "Patch Dockerfile to replace reference to non-existent context"
This reverts commit a4212e99b0.

No longer needed because we reverted the Docker submodule.
2025-11-25 22:43:58 +02:00
Keith Hall f8b6a009cb commit syntax dump to get integration tests to pass 2025-11-24 22:30:34 +02:00
Keith Hall efa9f0e63d add integration test to prove that building the cache finds all contexts 2025-11-24 22:20:44 +02:00
Keith Hall a4212e99b0 Patch Dockerfile to replace reference to non-existent context 2025-11-24 22:05:31 +02:00
Keith Hall 6884a8e7e0 Update changelog 2025-11-24 21:56:05 +02:00
Keith Hall a1b1feb247 Revert "Bump assets/syntaxes/02_Extra/Docker from 0f6b7bc to c001fb2 (#3024)"
This reverts commit 3838766dd4.
2025-11-24 21:56:05 +02:00
Muntasir Mahmud 70ec3fc24e feat: add paging to '-h' and '--help' (#3478)
* feat: add paging to '-h' and '--help'

Fixes #1587
2025-11-23 20:10:56 +00:00
Keith Hall 1e4a4b765f Merge pull request #3457 from abhinavcool42/fix/list-themes-pager-hang
fix: `--list-themes` pagination
2025-11-15 15:49:40 +02:00
Keith Hall cfe49779fa Merge branch 'master' into fix/list-themes-pager-hang 2025-11-15 15:41:07 +02:00
Keith Hall c51cff8961 Merge pull request #3481 from AldanTanneo/master
update Ada syntax gitmodule
2025-11-14 19:46:22 +02:00
AldanTanneo 1abecd2c93 update Ada syntax gitmodule 2025-11-14 11:41:08 +01:00
Keith Hall 3217a7e667 Merge pull request #3484 from cyqsimon/quadlet-update
Update quadlet syntax mapping to include `*.{build,pod}` files
2025-11-13 19:15:28 +02:00
cyqsimon 015cafdbdc Write changelog 2025-11-13 13:50:53 +08:00
cyqsimon f5a934c213 Update quadlet syntax mapping to include *.{build,pod} files 2025-11-13 13:44:24 +08:00
Abhinav Diwakar 24813db49f Merge branch 'master' into fix/list-themes-pager-hang 2025-11-06 23:26:06 +05:30
Benjamin A. Beasley ce856dbba7 Update etcetera to 0.11; no longer depend on home; MSRV 1.87
Release 0.11 of `etcetera` requires MSRV 1.87, in which
`std::env::home_dir` is no longer deprecated,
https://github.com/rust-lang/rust/pull/137327.

Update to that MSRV and to `etcetera`, and drop the dependency on the
`home` crate just as `etcetera` 0.11 did.
2025-11-03 19:06:33 +01:00
abhinavcool42 8b09724420 change imports 2025-11-02 11:55:30 +05:30
abhinavcool42 2af7be1b65 fix prefix 2025-11-02 11:51:00 +05:30
Abhinav Diwakar dac98da526 Merge branch 'master' into fix/list-themes-pager-hang 2025-11-02 11:35:27 +05:30
abhinavcool42 9456f7d8cd list-themes buffer added 2025-11-02 11:31:07 +05:30
auto-merge-dependabot-prs[bot] 3ecbd18e56 Merge pull request #3469 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/typst-syntax-highlight-363f0e7
build(deps): bump assets/syntaxes/02_Extra/typst-syntax-highlight from `4e2e68b` to `363f0e7`
2025-11-01 10:41:09 +00:00
dependabot[bot] 61fbc3fc0c build(deps): bump assets/syntaxes/02_Extra/typst-syntax-highlight
Bumps [assets/syntaxes/02_Extra/typst-syntax-highlight](https://github.com/hyrious/typst-syntax-highlight) from `4e2e68b` to `363f0e7`.
- [Release notes](https://github.com/hyrious/typst-syntax-highlight/releases)
- [Commits](https://github.com/hyrious/typst-syntax-highlight/compare/4e2e68b0a13555720a5ff0c4b32db98ddf490ed1...363f0e767c938c615a14912c302db7936f025fc2)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/typst-syntax-highlight
  dependency-version: 363f0e767c938c615a14912c302db7936f025fc2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 10:24:37 +00:00
auto-merge-dependabot-prs[bot] 5bcbd91943 Merge pull request #3472 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/Zig-c16d871
build(deps): bump assets/syntaxes/02_Extra/Zig from `8a4a3fe` to `c16d871`
2025-11-01 10:21:28 +00:00
dependabot[bot] cfe32fa219 build(deps): bump assets/syntaxes/02_Extra/Zig
Bumps [assets/syntaxes/02_Extra/Zig](https://github.com/ziglang/sublime-zig-language) from `8a4a3fe` to `c16d871`.
- [Release notes](https://github.com/ziglang/sublime-zig-language/releases)
- [Commits](https://github.com/ziglang/sublime-zig-language/compare/8a4a3fe4a051f85c4752b82f586d395cab843c06...c16d871ccccb3749f5a4b824f3fd44b143114565)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Zig
  dependency-version: c16d871ccccb3749f5a4b824f3fd44b143114565
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 10:05:25 +00:00
auto-merge-dependabot-prs[bot] f0f4af864a Merge pull request #3470 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/cmd-help-273cb98
build(deps): bump assets/syntaxes/02_Extra/cmd-help from `c71ba41` to `273cb98`
2025-11-01 10:01:27 +00:00
dependabot[bot] 8bace0e808 build(deps): bump assets/syntaxes/02_Extra/cmd-help
Bumps [assets/syntaxes/02_Extra/cmd-help](https://github.com/victor-gp/cmd-help-sublime-syntax) from `c71ba41` to `273cb98`.
- [Commits](https://github.com/victor-gp/cmd-help-sublime-syntax/compare/c71ba410bdfcc8f627df3219f14e3f2be4fe68ba...273cb988177e96f4187e06008b13fa72ad22ae4d)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/cmd-help
  dependency-version: 273cb988177e96f4187e06008b13fa72ad22ae4d
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 09:40:14 +00:00
auto-merge-dependabot-prs[bot] 2f5cba7f8f Merge pull request #3473 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/SystemVerilog-b340f1c
build(deps): bump assets/syntaxes/02_Extra/SystemVerilog from `7eca705` to `b340f1c`
2025-11-01 09:37:25 +00:00
dependabot[bot] 528aa4fedd build(deps): bump assets/syntaxes/02_Extra/SystemVerilog
Bumps [assets/syntaxes/02_Extra/SystemVerilog](https://github.com/TheClams/SystemVerilog) from `7eca705` to `b340f1c`.
- [Commits](https://github.com/TheClams/SystemVerilog/compare/7eca705e87f87b94478fe222fc91d54d488cc8e3...b340f1c7f6a38d4da9f77be5abd6d455e5da7641)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/SystemVerilog
  dependency-version: b340f1c7f6a38d4da9f77be5abd6d455e5da7641
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 09:27:44 +00:00
auto-merge-dependabot-prs[bot] 490e1580ad Merge pull request #3471 from sharkdp/dependabot/cargo/serde_with-3.15.1
build(deps): bump serde_with from 3.12.0 to 3.15.1
2025-11-01 05:15:10 +00:00
dependabot[bot] cbfbfc8ff3 build(deps): bump serde_with from 3.12.0 to 3.15.1
Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.12.0 to 3.15.1.
- [Release notes](https://github.com/jonasbb/serde_with/releases)
- [Commits](https://github.com/jonasbb/serde_with/compare/v3.12.0...v3.15.1)

---
updated-dependencies:
- dependency-name: serde_with
  dependency-version: 3.15.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 05:03:16 +00:00
auto-merge-dependabot-prs[bot] b6edf7ab0b Merge pull request #3468 from sharkdp/dependabot/cargo/prettyplease-0.2.37
build(deps): bump prettyplease from 0.2.35 to 0.2.37
2025-11-01 05:00:21 +00:00
dependabot[bot] 65e6b4de69 build(deps): bump prettyplease from 0.2.35 to 0.2.37
Bumps [prettyplease](https://github.com/dtolnay/prettyplease) from 0.2.35 to 0.2.37.
- [Release notes](https://github.com/dtolnay/prettyplease/releases)
- [Commits](https://github.com/dtolnay/prettyplease/compare/0.2.35...0.2.37)

---
updated-dependencies:
- dependency-name: prettyplease
  dependency-version: 0.2.37
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 04:42:58 +00:00
auto-merge-dependabot-prs[bot] 2ca62e25f1 Merge pull request #3474 from sharkdp/dependabot/cargo/git2-0.20.2
build(deps): bump git2 from 0.20.0 to 0.20.2
2025-11-01 04:39:53 +00:00
dependabot[bot] 1b2a814478 build(deps): bump git2 from 0.20.0 to 0.20.2
Bumps [git2](https://github.com/rust-lang/git2-rs) from 0.20.0 to 0.20.2.
- [Changelog](https://github.com/rust-lang/git2-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/git2-rs/compare/git2-0.20.0...git2-0.20.2)

---
updated-dependencies:
- dependency-name: git2
  dependency-version: 0.20.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 04:22:33 +00:00
auto-merge-dependabot-prs[bot] e33967aa39 Merge pull request #3467 from sharkdp/dependabot/cargo/regex-1.12.2
build(deps): bump regex from 1.11.1 to 1.12.2
2025-11-01 04:17:04 +00:00
dependabot[bot] a1adefce36 build(deps): bump regex from 1.11.1 to 1.12.2
Bumps [regex](https://github.com/rust-lang/regex) from 1.11.1 to 1.12.2.
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/regex/compare/1.11.1...1.12.2)

---
updated-dependencies:
- dependency-name: regex
  dependency-version: 1.12.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 03:40:47 +00:00
auto-merge-dependabot-prs[bot] 6e87e02e96 Merge pull request #3465 from sharkdp/dependabot/cargo/terminal-colorsaurus-1.0.1
build(deps): bump terminal-colorsaurus from 1.0.0 to 1.0.1
2025-11-01 03:37:12 +00:00
dependabot[bot] ab9cc674d5 build(deps): bump terminal-colorsaurus from 1.0.0 to 1.0.1
Bumps [terminal-colorsaurus](https://github.com/bash/terminal-colorsaurus) from 1.0.0 to 1.0.1.
- [Release notes](https://github.com/bash/terminal-colorsaurus/releases)
- [Changelog](https://github.com/bash/terminal-colorsaurus/blob/main/changelog.md)
- [Commits](https://github.com/bash/terminal-colorsaurus/compare/1.0.0...1.0.1)

---
updated-dependencies:
- dependency-name: terminal-colorsaurus
  dependency-version: 1.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-01 03:02:09 +00:00
Abhinav Diwakar 8e0e13a899 Merge branch 'master' into fix/list-themes-pager-hang 2025-11-01 00:59:59 +05:30
Jack Haden-Enneking 5371426588 alternatives.md: fix emoji & formatting
Could replace all emoji shortcodes (`✔️` & ``) in source with actual emoji. Erred on the side of least change.
2025-10-31 19:32:29 +01:00
abhinavcool42 1852dea96a Fix --list-themes pager init so less stays interactive 2025-10-30 18:42:35 +05:30
abhinavcool42 a8140f91cc changelog 2025-10-28 17:25:43 +05:30
abhinavcool42 2fac9b2740 added changelog 2025-10-28 17:07:12 +05:30
abhinavcool42 6a99915afe fix --list-themes hang 2025-10-28 16:10:32 +05:30
Justin Su 4e13c3eb5b Update CHANGELOG.md
Also fix a typo from the previous release
2025-10-20 19:23:26 +02:00
Justin Su 7e55608975 docs: Clarify that -X/--no-init is not added on modern versions of less 2025-10-20 19:23:26 +02:00
Justin Su 4bd5cbca8e docs: Mention less options by short+long names 2025-10-20 19:23:26 +02:00
Keith Hall 7c3fa7e1ce Merge pull request #3448 from akinomyoga/bash-fullquote
Use `-o fullquote` and `-o noquote` for more robust escaping in Bash completions
2025-10-20 19:55:56 +03:00
Koichi Murase 3188a147d8 Use "-o fullquote" and "-o noquote" to escape Bash completions 2025-10-20 19:38:54 +09:00
Koichi Murase 926fbc4b13 Fix indentation of the Bash completion file 2025-10-20 17:59:48 +09:00
Keith Hall 006d77fa39 Merge pull request #3442 from lmmx/patch-1
fix: allow hyphen values to `-r`/`--line-range`
2025-10-19 23:44:25 +03:00
Louis Maddox 52a792d46f fix: allow hyphen values to -r/--line-range
via #2944
2025-10-19 21:24:59 +01:00
Keith Hall 20db989fb1 Merge pull request #3441 from sharkdp/prepare_changelog
Prepare changelog for future changes
2025-10-19 21:40:50 +03:00
Keith Hall 2c63d3c792 Prepare changelog for future changes 2025-10-19 21:24:54 +03:00
Keith Hall c734087e1d Merge pull request #3440 from sharkdp/prepare_release
Prepare to release v0.26.0
2025-10-19 21:20:43 +03:00
Keith Hall 3331a306c9 Prepare to release v0.26.0 2025-10-19 21:06:26 +03:00
Keith Hall 83ffd1ea09 Merge pull request #3438 from lmmx/pipe-style
feat: make output pipeable with `-n`, non-auto styles
2025-10-18 20:43:57 +03:00
Louis Maddox 200924772f docs: amend man page (style modifies cat-like piping) 2025-10-18 10:29:39 +01:00
Louis Maddox 7eedc0f854 feat(pipe-style): make output pipeable (any style) 2025-10-18 10:29:39 +01:00
suranmiao f1a0d8b3f7 chore: fix some minor issues in the comments (#3439)
Signed-off-by: suranmiao <solsui@outlook.com>
2025-10-18 00:13:18 +03:00
Keith Hall a730eaae0a Merge pull request #3435 from MuntasirSZN/fix/markdown-typescript
feat: add typescript codeblock highlight patches for markdown
2025-10-14 22:22:33 +03:00
Keith Hall 8920c738c5 chore: update highlighted test Markdown with embedded Typescript file 2025-10-14 22:02:16 +03:00
MuntasirSZN 0139c9d9ae chore: add a test typescript file 2025-10-14 15:38:26 +06:00
MuntasirSZN b0fa9e1dfe feat: add typeScript syntax highlighting support for markdown code blocks
- Added TypeScript/ts language support to Markdown.sublime-syntax.patch
- Code blocks with ```typescript or ```ts will now use TypeScript syntax highlighting
- Updated patch hunk headers to reflect added lines
2025-10-13 17:27:50 +06:00
Keith Hall e6a1d40f8d Merge pull request #3410 from sharkdp/bump_syntect
Bump syntect to v5.3.0
2025-10-09 22:00:25 +03:00
Keith Hall d3cf75a36e Update changelog 2025-10-09 21:50:58 +03:00
Keith Hall 8221554865 Bump MSRV to get syntect to compile
https://releases.rs/docs/1.79.0/

> Propagate temporary lifetime extension into if and match expressions.

1.79 was released on: 13 June, 2024
2025-10-09 21:50:58 +03:00
Keith Hall a2eaa6c22c Bump syntect to v5.3.0 2025-10-09 21:50:58 +03:00
dependabot[bot] 5863a57921 build(deps): bump assets/syntaxes/02_Extra/Idris2
Bumps [assets/syntaxes/02_Extra/Idris2](https://github.com/buzden/sublime-syntax-idris2) from `7c1bf44` to `2874f20`.
- [Commits](https://github.com/buzden/sublime-syntax-idris2/compare/7c1bf44c4f9092b7b1e274b1332cf32a089b2b99...2874f206f56c588a29fd76b88043129471d1454a)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Idris2
  dependency-version: 2874f206f56c588a29fd76b88043129471d1454a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 19:45:02 +02:00
dependabot[bot] af365d762f build(deps): bump assets/syntaxes/02_Extra/SublimeJQ
Bumps [assets/syntaxes/02_Extra/SublimeJQ](https://github.com/zogwarg/SublimeJQ) from `b7e53e5` to `84770c5`.
- [Commits](https://github.com/zogwarg/SublimeJQ/compare/b7e53e5d86814f04a48d2e441bcf5f9fdf07e9c1...84770c52bd0d6cea73bd41299a2770ee931320bc)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/SublimeJQ
  dependency-version: 84770c52bd0d6cea73bd41299a2770ee931320bc
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 19:20:15 +02:00
dependabot[bot] 640369d4a1 build(deps): bump assets/syntaxes/02_Extra/Slim
Bumps [assets/syntaxes/02_Extra/Slim](https://github.com/slim-template/ruby-slim.tmbundle) from `3b1441f` to `cad0268`.
- [Commits](https://github.com/slim-template/ruby-slim.tmbundle/compare/3b1441f89fde40678c3c0ada6d75ce46417a35b6...cad02689b6c6e03d67dab8eaadb22cf0fd3b436b)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Slim
  dependency-version: cad02689b6c6e03d67dab8eaadb22cf0fd3b436b
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 18:53:24 +02:00
dependabot[bot] 7a13516d21 build(deps): bump assets/themes/dracula-sublime
Bumps [assets/themes/dracula-sublime](https://github.com/dracula/sublime) from `c2de0ac` to `d490b57`.
- [Commits](https://github.com/dracula/sublime/compare/c2de0acf5af67042393cf70de68013153c043656...d490b57c08f3d110ff61a07ec6edcc1ed9e24a63)

---
updated-dependencies:
- dependency-name: assets/themes/dracula-sublime
  dependency-version: d490b57c08f3d110ff61a07ec6edcc1ed9e24a63
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 18:01:38 +02:00
Keith Hall 01b7ac62c5 Merge pull request #3413 from sharkdp/ansi_theme_json
Update ansi theme to highlight JSON keys separately from string values
2025-10-08 23:31:42 +03:00
Keith Hall aa1c4fb48f update themes.bin to see if integration tests will pass 2025-10-08 23:22:06 +03:00
Keith Hall c0389b0e5c add integration test for ANSI theme with simple JSON 2025-10-08 23:12:39 +03:00
Keith Hall 3e816f08c7 Update ansi theme to highlight JSON keys separately from string values 2025-10-08 23:12:39 +03:00
Keith Hall 6c8929128f Merge pull request #3414 from sharkdp/ignore_invalid_config_for_help_and_version
Fix help/version/diagnostic commands with invalid config
2025-10-08 22:58:05 +03:00
Keith Hall 98b75db115 Update changelog 2025-10-08 22:46:08 +03:00
Keith Hall 2badaf5d99 cargo fmt 2025-10-08 22:45:50 +03:00
Keith Hall 588ff32d18 Fix help/version/diagnostic commands with invalid config 2025-10-08 22:45:50 +03:00
0x61nas 1838e25d2f feat(cargo): add vendored-libgit2 feature (#3426)
* feat(cargo): add vendored-libgit2 feature

this is done to resolve the issues when the host system doesn't have
`libgit2` installed or if its incompatible with the version we expect

see: sharkdp/bat/issues/2939

* docs(changelog): add vendored libgit2 entry
2025-10-08 19:48:25 +02:00
Keith Hall 0e931aadde Merge pull request #3411 from sharkdp/completions
Add missing shell completions for various CLI arguments
2025-10-07 22:42:31 +03:00
Keith Hall 8e90efb2b4 Add missing shell completions for various CLI arguments 2025-10-07 22:30:53 +03:00
Martin Nordholts e3f92c0975 CONTRIBUTING.md: Note that new themes are not desired right now 2025-10-07 20:43:13 +02:00
Keith Hall da23939561 Merge pull request #3412 from sharkdp/dmesg_syntax_mapping
Map /var/log/dmesg to Syslog syntax
2025-10-07 20:24:34 +03:00
Keith Hall d478ba2923 Merge branch 'master' into dmesg_syntax_mapping 2025-10-07 20:12:34 +03:00
dependabot[bot] f558902ad2 build(deps): bump wait-timeout from 0.2.0 to 0.2.1
Bumps [wait-timeout](https://github.com/alexcrichton/wait-timeout) from 0.2.0 to 0.2.1.
- [Commits](https://github.com/alexcrichton/wait-timeout/compare/0.2.0...0.2.1)

---
updated-dependencies:
- dependency-name: wait-timeout
  dependency-version: 0.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-07 19:02:30 +02:00
Keith Hall 3ae23cc57b Merge pull request #3424 from DarkMatter-999/feat/add-gomod-support
Add go.mod and go.sum Syntax Support
2025-10-04 00:18:07 +03:00
DarkMatter-999 7b67981fb9 tests: fix highlights for Go module syntax 2025-10-03 13:26:59 +05:30
DarkMatter-999 7ee6ee385e docs: update CHANGELOG.md 2025-10-03 13:09:57 +05:30
DarkMatter-999 28ab873a3f tests: add syntax tests for go.mod and go.sum 2025-10-03 13:00:09 +05:30
DarkMatter-999 d392cea348 feat: Add Gomod submodule for go.mod / go.sum syntax support 2025-10-03 12:40:59 +05:30
dependabot[bot] 6ece3063ab build(deps): bump itertools from 0.13.0 to 0.14.0
Bumps [itertools](https://github.com/rust-itertools/itertools) from 0.13.0 to 0.14.0.
- [Changelog](https://github.com/rust-itertools/itertools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-itertools/itertools/compare/v0.13.0...v0.14.0)

---
updated-dependencies:
- dependency-name: itertools
  dependency-version: 0.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-02 19:24:54 +02:00
Keith Hall 839bfded39 Map /var/log/dmesg to Syslog syntax 2025-09-27 22:48:13 +03:00
Keith Hall 2c87b9480f Bump jsonnet syntax dependency 2025-09-27 16:41:05 +03:00
Keith Hall 2ae4253577 Merge pull request #3397 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/VimL-fe5bf5e
build(deps): bump assets/syntaxes/02_Extra/VimL from `ee85822` to `fe5bf5e`
2025-09-27 16:12:39 +03:00
dependabot[bot] 0d468b023a build(deps): bump assets/syntaxes/02_Extra/VimL
Bumps [assets/syntaxes/02_Extra/VimL](https://github.com/SalGnt/Sublime-VimL) from `ee85822` to `fe5bf5e`.
- [Release notes](https://github.com/SalGnt/Sublime-VimL/releases)
- [Commits](https://github.com/SalGnt/Sublime-VimL/compare/ee85822cbed17858da1a556dec922b7da2a219bb...fe5bf5ea7055b35035438c64d822aae1f1dfdb41)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/VimL
  dependency-version: fe5bf5ea7055b35035438c64d822aae1f1dfdb41
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-27 15:59:52 +03:00
Viktor 60096d9971 Update README.md 2025-09-27 11:16:01 +02:00
Ritoban Dutta e879f532a7 Mapping .kshrc to bash for syntax highlighting #3361 (#3364)
* Add syntax highlighting support for .kshrc files and update mapping in KornShell syntax #3361
2025-09-23 16:56:52 +00:00
jyn c8b8132228 Only leave space for git diff markers if any line is modified (#3406)
Previously, setting `--style=changes` would always print a 2-space
indent, even if the file was unmodified. This changes the style to only
print an indent if there is at least one +/- git marker in the sidebar.
2025-09-22 07:42:56 +02:00
Keith Hall 9d003dd1b9 Merge pull request #3402 from academician/minus-integration
Add --pager=builtin using the Minus library
2025-09-20 08:43:47 +03:00
Academician c36dbf86f5 Add builtin pager to changelog 2025-09-09 16:26:49 -04:00
Academician c29f1875d3 Add --builtin=pager to readme, completions, and man pages 2025-09-09 16:26:49 -04:00
Daniel Waechter a470cebf32 Add a "builtin" pager using the Minus crate 2025-09-09 16:15:54 -04:00
Keith Hall 929669728c Merge pull request #3396 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/CMake-2560a08
build(deps): bump assets/syntaxes/02_Extra/CMake from `eb40ede` to `2560a08`
2025-09-04 09:34:27 +03:00
dependabot[bot] 4f912fca16 build(deps): bump assets/syntaxes/02_Extra/CMake
Bumps [assets/syntaxes/02_Extra/CMake](https://github.com/zyxar/Sublime-CMakeLists) from `eb40ede` to `2560a08`.
- [Release notes](https://github.com/zyxar/Sublime-CMakeLists/releases)
- [Commits](https://github.com/zyxar/Sublime-CMakeLists/compare/eb40ede56c2d4d5a4a129b2a5bc7095a2df46bb1...2560a080b3b7dcdb05e17ee85b2171776e84b8c1)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/CMake
  dependency-version: 2560a080b3b7dcdb05e17ee85b2171776e84b8c1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-04 09:22:04 +03:00
Keith Hall 93b020bf93 Merge pull request #3400 from CosmicHorrorDev/upd-onig-sys
build(deps): bump onig_sys 69.8.1 to 69.9.1
2025-09-04 09:20:23 +03:00
Cosmic Horror d7f11869ab build(deps): bump onig_sys 69.8.1 to 69.9.1 2025-09-04 00:00:18 -06:00
dependabot[bot] fe4754e9cd build(deps): bump clap from 4.5.24 to 4.5.46
Bumps [clap](https://github.com/clap-rs/clap) from 4.5.24 to 4.5.46.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.24...clap_complete-v4.5.46)

---
updated-dependencies:
- dependency-name: clap
  dependency-version: 4.5.46
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-02 17:27:17 +02:00
dependabot[bot] ff8cd39620 build(deps): bump unicode-width from 0.2.0 to 0.2.1
Bumps [unicode-width](https://github.com/unicode-rs/unicode-width) from 0.2.0 to 0.2.1.
- [Commits](https://github.com/unicode-rs/unicode-width/compare/v0.2.0...v0.2.1)

---
updated-dependencies:
- dependency-name: unicode-width
  dependency-version: 0.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-02 06:42:02 +02:00
dependabot[bot] 8d65d4591b build(deps): bump globset from 0.4.15 to 0.4.16
Bumps [globset](https://github.com/BurntSushi/ripgrep) from 0.4.15 to 0.4.16.
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.15...globset-0.4.16)

---
updated-dependencies:
- dependency-name: globset
  dependency-version: 0.4.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-02 06:26:26 +02:00
dependabot[bot] b4dcc155f0 build(deps): bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 19:23:43 +02:00
Sander f754f43e84 docs: fix command examples
its anoying to copy with the `>` in there
2025-09-01 18:53:15 +02:00
Sorin Sbarnea d291b3e5fa chore: Fix some typos (#3244) 2025-08-28 17:30:50 +00:00
Josef Andersson 6772225477 docs(security): add initial security policy (#3290) 2025-08-27 18:33:50 +00:00
Vedant Mohan Goyal 339e7df0bc Update winget-releaser to latest (#3012) 2025-08-25 05:29:04 +00:00
Keith Hall 297e8280d9 Merge pull request #3376 from eric-menne/fix/ctrl-c_fails_in_powershell
Fix ctrl-c fails in powershell
2025-08-22 17:59:35 +03:00
Eric Menne d397bea6dc Fix typo and clarify description 2025-08-22 17:49:53 +03:00
Eric Menne 3d174b8c09 Updated README.md to include -K option for less 2025-08-22 17:49:53 +03:00
Eric Menne d9dd9729b8 Add flag to less to enable quitting on Ctrl-C 2025-08-22 17:49:53 +03:00
Martin Nordholts c657b18efd README.md: Put some requirements on installation instructions
Adding new installation methods increases risk of supply chain exploits
and increases burden of maintainers. Let's put some requirements on what
installation methods to have in the README.md
2025-08-22 06:24:51 +02:00
Keith Hall c9b41b1df7 Merge pull request #3381 from CalebLarsen/update-docs
docs: added minor theming documentation notes
2025-08-22 07:12:17 +03:00
Caleb Larsen 45efc4117e docs: added minor theming documentation notes
.
2025-08-22 06:04:22 +02:00
Keith Hall 6a74283289 Merge pull request #3382 from CosmicHorrorDev/update-github-theme
deps: Bump assets/themes/github-sublime-theme from `508740b` to `59e525f`
2025-08-20 08:04:30 +03:00
Cosmic Horror 120c39429f deps: Bump assets/themes/github-sublime-theme from 508740b to 59e525f 2025-08-19 21:53:01 -06:00
Keith Hall 1c6ad4d514 Merge pull request #3345 from cavanaug/master
Support context in line ranges
2025-08-20 06:43:36 +03:00
John Cavanaugh 36d25c8642 Merge branch 'master' into master 2025-08-19 20:34:08 -07:00
Yuri Astrakhan caf6fa369f chore: add CI linting
* ensure `cargo clippy` treats all suggestions as errors in CI
* ensure `cargo clippy` runs with the latest stable Rust because Clippy is MSRV-aware, so it will not suggest anything unapplicable. Also note that whenever new release comes out, Clippy might temporarily show new errors - I think this is  better than forgetting to update the version somewhere, and keep running older tools.
* Update actions/checkout to the latest v5
2025-08-19 18:26:24 +02:00
Yuri Astrakhan 503c50b1ec chore: address all cargo clippy lints
* also do a bit of a doc cleanup for the `load_from_folder` fn
2025-08-19 05:22:47 +02:00
Yuri Astrakhan d9fbd18541 inline format arguments
In a few cases, removed the unneeded `&` - this causes a minor slowdown because compiler cannot eliminate those (yet).
2025-08-19 05:07:54 +02:00
Keith Hall 9824090654 Merge pull request #3369 from forkeith/utf16le
Fix the read_line method for utf16le/be input
2025-08-16 15:49:16 +03:00
Keith Hall bdaf25793d cargo fmt 2025-08-16 15:36:45 +03:00
Keith Hall 96ce80d0e2 Apply same fix and tests for UTF16BE 2025-08-16 15:36:45 +03:00
Keith Hall 40c4c8e542 More thorough tests for UTF16LE 2025-08-16 15:35:57 +03:00
Keith Hall 6675153460 Fix the read_line method for utf16le input
to determine the end of the line, instead of reading until \n (0x0A) and then reading until 0x00 and calling it done, read until we find 0x00 preceded by 0x0A.
2025-08-16 15:35:57 +03:00
dependabot[bot] 76e6a49a2e Bump assets/syntaxes/02_Extra/Fish from 98316d4 to ef510fd
Bumps [assets/syntaxes/02_Extra/Fish](https://github.com/Phidica/sublime-fish) from `98316d4` to `ef510fd`.
- [Release notes](https://github.com/Phidica/sublime-fish/releases)
- [Commits](https://github.com/Phidica/sublime-fish/compare/98316d4332936f74babb51cb56161410ae9d6e2c...ef510fd7592186d3c7f6aa066986c047ec29fe81)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Fish
  dependency-version: ef510fd7592186d3c7f6aa066986c047ec29fe81
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 08:26:08 +02:00
joshua! 1bcf760d90 docs: Include GNOME bash script for Dark Mode
Title.  I developed this on Fedora 39 with GNOME. Tested and works on my setup as expected.
2025-08-16 07:52:18 +02:00
dependabot[bot] 94f1035c08 Bump nix from 0.29.0 to 0.30.1
Bumps [nix](https://github.com/nix-rust/nix) from 0.29.0 to 0.30.1.
- [Changelog](https://github.com/nix-rust/nix/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nix-rust/nix/compare/v0.29.0...v0.30.1)

---
updated-dependencies:
- dependency-name: nix
  dependency-version: 0.30.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-16 07:33:52 +02:00
John Cavanaugh 3516a3311a Merge branch 'master' into master 2025-08-15 06:34:33 -07:00
John Cavanaugh f79adaf607 test: 🚨 update tests for truncated multiline.txt
test(tests/examples/multiline.txt): 🚨 trim sample file to 10 lines to match new behavior
test(tests/integration_tests.rs): 🚨 adjust line ranges and expected outputs for 10-line sample; add multi-range context test
2025-08-15 05:57:41 -07:00
alcroito d9ac757b6a Add CI build for windows/ARM64
Fixes: #2644
2025-08-14 17:56:00 +02:00
John Cavanaugh 58bfcd9051 style: 🎨 reformat predicate assertions
style(integration_tests.rs): 🎨 doh, run cargo fmt
2025-08-13 23:31:17 -07:00
John Cavanaugh 67e3e42531 test: 🚨 extend line-range tests
test(tests/examples/multiline.txt): 🚨 add lines 5-20 to sample file for expanded line-range tests
test(tests/integration_tests.rs): 🚨 update expected outputs and add comprehensive context and error tests for line-range feature
2025-08-13 23:29:58 -07:00
John Cavanaugh 3fd3f1def8 Merge branch 'master' into master 2025-08-13 23:27:26 -07:00
Keith Hall 6d849e53d2 Merge pull request #3373 from wcampbell0x2a/add-name-to-x86-asm-sublime-syntax
Add x86_64 Assembly to x86 sublime syntax file
2025-08-13 09:44:13 +03:00
Keith Hall 7fc3d6b588 Update assets/syntaxes/02_Extra/Assembly (x86_64).sublime-syntax 2025-08-13 09:34:59 +03:00
wcampbell 1a931224eb Add x86_64 Assembly to x86 sublime syntax file
* Using ARM Assembly with the bat library works with .language("ARM Assembly"),
  while x86 has no name. Add name to sublime syntax file.
2025-08-13 00:09:31 -04:00
Keith Hall 60833ae5ec Merge pull request #3372 from Nicholas42/master
update gruvbox theme
2025-08-10 19:12:53 +03:00
Nicholas Schwab 183def9569 docs(changelog): update gruvbox theme 2025-08-10 17:52:30 +02:00
Nicholas Schwab 77cfca1aff update gruvbox theme
This fixes https://github.com/sharkdp/bat/issues/2115 for this theme
2025-08-10 17:37:56 +02:00
Keith Hall d9cc01b50c Merge pull request #3370 from qianbinbin/fix/manpager
Make MANPAGER more portable
2025-08-10 06:17:17 +03:00
Binbin Qian 466087156f Update man usage for Chinese docs 2025-08-09 13:53:00 +08:00
Binbin Qian a8d610c6e8 Make MANPAGER more portable 2025-08-09 13:52:34 +08:00
Keith Hall 30b42149aa Merge pull request #3200 from forkeith/add_missing_switches_to_manpage
Add missing command line switches to manpage
2025-08-08 06:35:31 +03:00
Keith Hall c25e005c87 Add missing command line switches to manpage
- `--binary`
- `--completion`
- `--strip-ansi`
2025-08-08 06:21:41 +03:00
Keith Hall c4d7451841 Merge pull request #3365 from deflektor/update/CompletionPwsh
Update ps1 completion
2025-08-08 06:19:29 +03:00
deflektor d4fc07a347 Update _bat.ps1.in 2025-08-08 06:11:04 +03:00
deflektor 0238473868 Update assets/completions/_bat.ps1.in
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-08 06:11:04 +03:00
deflektor 4363ddf0fb Update assets/completions/_bat.ps1.in
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-08 06:11:04 +03:00
deflektor 43c5fef70a Update assets/completions/_bat.ps1.in
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-08 06:11:04 +03:00
deflektor 7e436e307d Update assets/completions/_bat.ps1.in
changed back to Template

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-08 06:11:04 +03:00
deflektor b4d529402a Update ps1 completion;removed shortcuts from completion;added completion for language, theme and options 2025-08-08 06:11:04 +03:00
Keith Hall b47338ec75 Merge pull request #3362 from qianbinbin/fix/batdiff
Make batdiff more portable
2025-08-08 05:51:24 +03:00
Binbin Qian bd782ab228 Make batdiff more portable 2025-08-08 05:43:49 +03:00
Keith Hall 4c2b20fedd Merge pull request #3368 from forkeith/fix_missing_assets
Replace missing asset submodules
2025-08-07 22:55:30 +03:00
Keith Hall 9d3245eebe Replace missing asset submodules 2025-08-07 22:45:22 +03:00
Keith Hall 369ea67ad3 Merge pull request #3359 from sharkdp/dependabot/submodules/assets/syntaxes/02_Extra/typst-syntax-highlight-4e2e68b
Bump assets/syntaxes/02_Extra/typst-syntax-highlight from `3f2561d` to `4e2e68b`
2025-08-01 06:23:46 +03:00
dependabot[bot] c56ce6ad36 Bump assets/syntaxes/02_Extra/typst-syntax-highlight
Bumps [assets/syntaxes/02_Extra/typst-syntax-highlight](https://github.com/hyrious/typst-syntax-highlight) from `3f2561d` to `4e2e68b`.
- [Commits](https://github.com/hyrious/typst-syntax-highlight/compare/3f2561d4d891f9f326fa70f9f06b6e99fda8adc3...4e2e68b0a13555720a5ff0c4b32db98ddf490ed1)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/typst-syntax-highlight
  dependency-version: 4e2e68b0a13555720a5ff0c4b32db98ddf490ed1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-01 02:53:17 +00:00
Keith Hall 4f0a3f5766 Merge pull request #3353 from Ferenc-/linux-ini-formats
Add syntax mapping for flatpakref
2025-07-31 20:26:08 +03:00
Ferenc Géczi bac58be1ee Add entry to CHANGELOG.md
Signed-off-by: Ferenc Géczi <ferenc.gm@gmail.com>
2025-07-31 00:00:00 +00:00
Ferenc Géczi 20caaf26c8 Add syntax mapping for flatpakrepo
Signed-off-by: Ferenc Géczi <ferenc.gm@gmail.com>
2025-07-31 00:00:00 +00:00
Ferenc Géczi 3574118e17 Add syntax mapping for flatpakref
Signed-off-by: Ferenc Géczi <ferenc.gm@gmail.com>
2025-07-31 00:00:00 +00:00
Keith Hall 847b717cdf Merge pull request #3351 from musicinmybrain/console-0.16
Update console dependency from 0.15.10 to 0.16.0
2025-07-23 15:19:11 +03:00
Benjamin A. Beasley 3dfb51b25d Add changelog entry for PR#3351 2025-07-23 08:04:24 -04:00
Benjamin A. Beasley d0b5dd8977 Update Cargo.lock for console 0.16.0 2025-07-23 07:57:07 -04:00
Benjamin A. Beasley 23d97eb4a8 Update console dependency to 0.16.0 2025-07-23 07:56:46 -04:00
Keith Hall 8bc4e76e47 Merge pull request #3347 from bash/terminal-colorsaurus-1.0
Update terminal-colorsaurus to 1.0
2025-07-22 21:19:24 +03:00
Tau Gärtli 38762724f5 Add changelog entry 2025-07-22 07:28:16 +02:00
Tau Gärtli feb0bc1ae6 Update terminal-colorsaurus to 1.0 2025-07-22 07:15:52 +02:00
Keith Hall 872d0baafb Merge pull request #3206 from sharkdp/make_map_syntax_case_insensitive
Make map-syntax target case insensitive
2025-07-17 22:31:54 +03:00
Keith Hall 35c3f065a3 Update changelog 2025-07-17 22:20:42 +03:00
Keith Hall 8b12191bda Make map-syntax target case insensitive 2025-07-17 22:19:54 +03:00
Martin Nordholts 90b2c57951 Stop auto-merge dependabot PRs
Our CI runs a fair amount of unaudited third party code. I'd like to
stop using my Personal Access Token until we have had time to security
harden our CI.
2025-07-17 19:42:34 +02:00
John Cavanaugh f484a9dfce Merge branch 'master' into master 2025-07-16 16:53:14 -07:00
John Cavanaugh b97c275de5 Restore original formatting that my editor decided to "autocorrect" 2025-07-16 16:40:43 -07:00
dependabot[bot] 91c95d8ba7 Bump unicode-width from 0.1.14 to 0.2.0 (#3225)
Bumps [unicode-width](https://github.com/unicode-rs/unicode-width) from 0.1.14 to 0.2.0.
- [Commits](https://github.com/unicode-rs/unicode-width/compare/v0.1.14...v0.2.0)

---
updated-dependencies:
- dependency-name: unicode-width
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-16 17:01:06 +00:00
TR Staake 2015c99e65 Update README.md
Added note about escaping alias when using help aliasing in zsh
2025-07-16 18:44:42 +02:00
John Cavanaugh eadf15d9c0 docs: 📚 correct changelog PR reference
docs(CHANGELOG.md): 📚 correct PR number for context in line ranges entry from #3344 to #3345
2025-07-15 16:43:11 -07:00
John Cavanaugh bb8c5657e1 fix: 🐛 allow three-part range parsing
fix(src/line_range.rs): 🐛 support three-part (start:end:context) syntax, clamp lower at zero and extend upper, and add tests for invalid formats
2025-07-15 16:36:58 -07:00
John Cavanaugh dc2eae08a6 docs: 📚 update changelog for range context support
docs(CHANGELOG.md): 📚 add entry for context in line ranges and normalize list formatting
style(src/line_range.rs): 🎨 trim trailing whitespace in context parsing code
2025-07-15 16:25:28 -07:00
John Cavanaugh 6c13a98f01 feat: add context support to line-range syntax
docs(long-help.txt): 📚 add examples for N::C and N:M:C context syntax
docs(clap_app.rs): 📚 update CLI help text with context syntax examples
feat(line_range.rs):  implement N::C and N:M:C parsing and add tests
2025-07-15 16:17:09 -07:00
Justin Su 1ad294dcd3 Add missing apostrophe in "bats" 2025-07-15 17:30:50 +02:00
Justin Su 806df574e7 Use relative links in README.md 2025-07-15 17:30:50 +02:00
HE7086 9b580c7a98 Update documentation for git diff 2025-07-15 07:49:46 +02:00
anand-dragon 7c8e2324ab [3040]: Add Alias hint on README 2025-07-15 07:04:14 +02:00
cyqsimon 555933315d Only start offload worker thread when there's more than 1 core (#2956)
* Only start offload worker thread when there's more than 1 core

* Write changelog
2025-07-15 05:21:00 +02:00
Stéphane Blondon 9121746f05 test: code coverage for list-languages parameter 2025-07-14 16:40:14 +02:00
Keith Hall f1d45da676 Merge pull request #3333 from SchweGELBin/catppuccin-update
Bump Catppuccin from 19c4453 to ccf194f
2025-07-11 20:41:39 +03:00
SchweGELBin cf147a440e docs(changelog): update catppuccin theme 2025-07-11 20:29:29 +03:00
SchweGELBin a3a23e5759 binary: update to support newer Catppuccin theme 2025-07-11 20:29:29 +03:00
SchweGELBin bc7d1cd44a theme: bump Catppuccin from 19c4453 to ccf194f 2025-07-11 20:29:29 +03:00
Keith Hall 735fb7be0e Merge pull request #3322 from YDX-2147483647/lean
Update Lean.sublime-syntax from Lean 3 to Lean 4
2025-07-11 20:28:18 +03:00
Y.D.X. 4661f22e81 Merge remote-tracking branch 'upstream/master' into lean 2025-07-11 13:03:06 +08:00
Y.D.X. (Gitpod) bfd8776042 chore: Follow Lean upstream 2025-07-11 12:56:46 +08:00
dependabot[bot] e8ff13cd53 Bump toml from 0.8.19 to 0.8.23 (#3332)
---
updated-dependencies:
- dependency-name: toml
  dependency-version: 0.8.23
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-10 21:18:15 +00:00
dependabot[bot] 1771f6da8d Bump flate2 from 1.0.35 to 1.1.2 (#3331)
---
updated-dependencies:
- dependency-name: flate2
  dependency-version: 1.1.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-10 21:02:31 +00:00
Keith Hall e888e968b6 Merge pull request #3340 from cyqsimon/syntax-mapping-build-script-use-quote
Build script: replace string-based codegen with `quote`-based codegen
2025-07-10 23:46:54 +03:00
cyqsimon 68df079c0e Add improvement note on parse + unparse 2025-07-10 23:31:12 +03:00
cyqsimon 563c4c290d Consistent spaces in quote! invocations 2025-07-10 23:31:12 +03:00
cyqsimon ffbcfd53f9 Write changelog 2025-07-10 23:31:12 +03:00
cyqsimon fd12328293 Build script: replace string-based codegen with quote-based codegen 2025-07-10 23:31:12 +03:00
Keith Hall b387abea6b Merge pull request #3342 from krikera/master
docs(man): update --style documentation with priority rules
2025-07-10 23:30:05 +03:00
Krishna Ketan Rai efdd038fa4 docs(man): update --style documentation with priority rules 2025-07-10 02:11:35 +05:30
dependabot[bot] 94b699d8df Bump assets/syntaxes/02_Extra/typst-syntax-highlight (#3330)
Bumps [assets/syntaxes/02_Extra/typst-syntax-highlight](https://github.com/hyrious/typst-syntax-highlight) from `1bde1ea` to `3f2561d`.
- [Commits](https://github.com/hyrious/typst-syntax-highlight/compare/1bde1ea511d86c622a0fd27d9e0db3e047d4094f...3f2561d4d891f9f326fa70f9f06b6e99fda8adc3)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/typst-syntax-highlight
  dependency-version: 3f2561d4d891f9f326fa70f9f06b6e99fda8adc3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-09 19:47:43 +00:00
Keith Hall 226efecdd6 Merge pull request #3337 from JerryImMouse/syntax-vhdl
Add syntax highlighting for VHDL language
2025-07-09 22:31:26 +03:00
Jerry a0b4397ddf Merge branch 'master' into syntax-vhdl 2025-07-09 04:33:36 +05:00
Keith Hall c18f5e054e Merge pull request #3338 from cyqsimon/certbot
Add syntax mapping for certbot certificate configuration
2025-07-08 23:44:37 +03:00
cyqsimon 360d43dd4d Write changelog 2025-07-08 23:33:41 +03:00
cyqsimon e0165a2d6a Add syntax mapping for certbot certificate configuration 2025-07-08 23:33:41 +03:00
Jerry 9776ebfa0f Send errors to stderr (#3336)
* fix: send errors to stderr by default (#2561)

Closes #2561

* chore: add changelog entry

* chore: change PR id

* chore: add github username

* chore: cargo fmt...

* chore: move changelog line to bugfixes
2025-07-08 20:42:22 +02:00
Jerry eda3ecb0b3 Merge branch 'master' into syntax-vhdl 2025-07-08 17:48:10 +05:00
cyqsimon cf7631d469 CICD: replace windows-2019 runners with windows-2025 (#3339)
* CICD: replace windows-2019 runners with windows-2025

See https://github.com/actions/runner-images/issues/12045

* Write changelog
2025-07-08 12:37:06 +02:00
JerryImMouse 185a2f3437 chore: update pr number in changelog 2025-07-07 19:37:06 +05:00
JerryImMouse bdc971eca3 feat(syntax): add syntax highlighting for VHDL 2025-07-07 19:20:23 +05:00
Y.D.X. 288b7e9ca3 docs: Add Lean/LICENSE.md
> Jeremy Avigad:
> Patrick and I decided that it makes sense to release the text of MIL under CC BY 4.0 and the repository code (exercises, solutions, etc.) under Apache 2.0. We'll put the Apache license in the repo and figure out where to at the CC BY notice, but in the meantime, you can take this message as a declaration.

https://leanprover.zulipchat.com/#narrow/channel/113488-general/topic/License.20of.20Mathematics.20in.20Lean.3F/near/523527618
2025-06-11 22:06:52 +08:00
Y.D.X. a9d5880dc8 docs: Update CHANGELOG, allow CC BY 4.0 license, and fix a markdown backquote 2025-06-10 17:44:10 +08:00
Y.D.X. 0918984249 Update Lean.sublime-syntax from Lean 3 to Lean 4
Resolves #3286

1. `lean4.json` → `lean4.tmLanguage`

    1. Download `vscode-lean4/syntaxes/lean4.json` from https://github.com/leanprover/vscode-lean4/pull/623 (now merged).
    2. Install the VS Code extension [TextMate Languages (pedro-w)](https://marketplace.visualstudio.com/items?itemName=pedro-w.tmlanguage).
    3. Open `lean4.json` in VS Code, <kbd>F1</kbd>, and “Convert to tmLanguage PLIST File”.

2. `lean4.tmLanguage` → `lean4.sublime-syntax`

    Open `lean4.tmLanguage` in Sublime text, “Tools → Developer → New Syntax from lean4.tmLanguage…”.
2025-06-10 17:41:33 +08:00
Keith Hall e2aa4bc33c Merge pull request #3320 from krikera/add-mill-syntax-mapping
Add syntax mapping for Mill build tool files to use Scala syntax
2025-06-02 19:50:38 +03:00
krikera 9d3db318e3 Add syntax mapping for Mill build tool files to use Scala syntax 2025-06-01 22:03:54 +05:30
dependabot[bot] 5aa123b4f0 Bump assets/syntaxes/02_Extra/Apache from cf6cefc to c438c35 (#3318)
Bumps [assets/syntaxes/02_Extra/Apache](https://github.com/colinta/ApacheConf.tmLanguage) from `cf6cefc` to `c438c35`.
- [Commits](https://github.com/colinta/ApacheConf.tmLanguage/compare/cf6cefc51ebb46b1b54906433edbae0fe9c71cad...c438c352db7dd59c7bc0849134b1bab9b338a36e)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Apache
  dependency-version: c438c352db7dd59c7bc0849134b1bab9b338a36e
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-01 02:13:57 +00:00
Keith Hall f11d34997a Merge pull request #3317 from SchweGELBin/catppuccin
Themes: Add Catppuccin
2025-05-31 16:50:34 +03:00
SchweGELBin 510814410c docs(changelog): add catppuccin theme 2025-05-31 15:05:44 +02:00
SchweGELBin e4bae61393 binary: update to support Catppuccin 2025-05-31 14:57:44 +02:00
SchweGELBin 4cfc50c358 theme: add Catppuccin 2025-05-31 14:56:10 +02:00
Keith Hall 6886cdaace Merge pull request #3315 from krikera/fix-utf8-bom-syntax-detection
Fix UTF-8 BOM file type detection for first-line syntax patterns
2025-05-31 14:45:50 +03:00
krikera 17e6952ab8 Fix UTF-8 BOM file type detection for first-line syntax patterns - Fixes #3314 2025-05-31 02:58:47 +05:30
Keith Hall 0da4084064 Merge pull request #3300 from cskeeters/syntax_typst
Adds Typst syntax from hyrious/typst-syntax-highlight
2025-05-21 05:47:26 +03:00
Chad Skeeters 4c9a51990c Corrects spelling mistake in syntax-test for Typst 2025-05-20 16:35:47 -05:00
Chad Skeeters 36a86d34e8 Adds changelog entry 2025-05-20 14:50:53 -05:00
Chad Skeeters fb514ca90f Adds Typst syntax from hyrious/typst-syntax-highlight 2025-05-20 14:43:21 -05:00
Keith Hall aa5e28bef5 Merge pull request #3299 from cyqsimon/quadlet
Update quadlet syntax mapping rules to cover quadlets in subdirectories
2025-05-20 21:40:43 +03:00
cyqsimon 5dc3d8c936 Write changelog 2025-05-20 15:33:57 +08:00
cyqsimon a4ffe2fdbf Update quadlet syntax mapping rules to cover quadlets in subdirectories 2025-05-20 15:22:55 +08:00
Keith Hall c32fa662d5 Merge pull request #3298 from ZaneErebos/patch-2
Clarify situation in which man page and shell completions will be accessible when building from source
2025-05-19 04:42:28 +03:00
Zane 0a9588a866 Clarify situation in which man page and shell completions will be accessible when building from source 2025-05-18 21:00:59 -04:00
Jamy Golden 861b868416 Update base16 urls to link to community run version 2025-05-14 19:01:50 +02:00
David Peter b7f9662097 Update README.md 2025-05-05 08:46:01 +02:00
Keith Hall 79ecb11ce2 Add new sponsor Graphite to Readme (#3270)
* Add new sponsor Graphite to Readme

* hide bullet points in sponsors section of readme

* remove bullet points
2025-05-05 08:44:24 +02:00
Integral 4e9bb610b3 docs(README): fix broken link of Visual C++ Redistributable 2025-05-01 13:33:43 +02:00
dependabot[bot] c88faf8cfa Bump assets/themes/zenburn from 9c588eb to 4f21745 (#3277)
Bumps [assets/themes/zenburn](https://github.com/colinta/zenburn) from `9c588eb` to `4f21745`.
- [Commits](https://github.com/colinta/zenburn/compare/9c588ebc11c3e6487b081bd54528af08baa8a09a...4f217457230ff5f31d594b0e20474b69294988d4)

---
updated-dependencies:
- dependency-name: assets/themes/zenburn
  dependency-version: 4f217457230ff5f31d594b0e20474b69294988d4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-01 03:10:48 +00:00
Keith Hall 0b48eab7a6 Merge pull request #3276 from forkeith/livescript_fix
remove LiveScript submodule
2025-04-30 22:42:30 +03:00
Keith Hall ccfbd1ee31 remove LiveScript submodule
the repo has gone away, causing all our CI etc. to break

we can keep the highlighting though because we have a .sublime-syntax file
2025-04-30 22:32:48 +03:00
Keith Hall 98c9a5d948 Merge pull request #3263 from gthb/patch-1
Fix copy-paste mistake in bat.1.in
2025-04-15 21:55:35 +03:00
Keith Hall 96ea42e5f4 Merge branch 'master' into patch-1 2025-04-15 21:25:32 +03:00
Keith Hall 2ff2a818ef Merge pull request #3068 from ajesipow/read-from-tail
Support relative negative line ranges
2025-04-15 21:16:39 +03:00
Keith Hall dd694c266e Merge branch 'master' into patch-1 2025-04-15 21:00:19 +03:00
Keith Hall c4461f7d78 Merge branch 'master' into read-from-tail 2025-04-15 20:59:51 +03:00
Keith Hall 77de5160ac Merge pull request #3266 from sharkdp/fix_ci
use latest Ubuntu for CI jobs now that GitHub deprecated 20.04
2025-04-15 20:59:14 +03:00
Keith Hall b9fcc5ae2d use latest Ubuntu for CI jobs now that GitHub deprecated 20.04 2025-04-15 20:30:56 +03:00
Keith Hall e42883bf2c Merge branch 'master' into read-from-tail 2025-04-15 20:27:26 +03:00
Keith Hall 5c41a45931 Merge branch 'master' into patch-1 2025-04-15 20:09:50 +03:00
dependabot[bot] ba49ba0acd Bump assets/themes/zenburn from 86d4ee7 to 9c588eb (#3251)
Bumps [assets/themes/zenburn](https://github.com/colinta/zenburn) from `86d4ee7` to `9c588eb`.
- [Commits](https://github.com/colinta/zenburn/compare/86d4ee7a1f884851a1d21d66249687f527fced32...9c588ebc11c3e6487b081bd54528af08baa8a09a)

---
updated-dependencies:
- dependency-name: assets/themes/zenburn
  dependency-version: 9c588ebc11c3e6487b081bd54528af08baa8a09a
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-13 10:36:54 +00:00
dependabot[bot] 5d75632c8e Bump assets/syntaxes/02_Extra/PowerShell from c0372a1 to a08b55b (#3252)
Bumps [assets/syntaxes/02_Extra/PowerShell](https://github.com/PowerShell/EditorSyntax) from `c0372a1` to `a08b55b`.
- [Commits](https://github.com/PowerShell/EditorSyntax/compare/c0372a1d2df136ca6b3d1a9f7b85031dedf117f9...a08b55bf1146c210f58e844be53c2aa78fd5e610)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/PowerShell
  dependency-version: a08b55bf1146c210f58e844be53c2aa78fd5e610
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-13 10:14:09 +00:00
dependabot[bot] e202a33ea1 Bump assets/syntaxes/02_Extra/Apache from 163bc03 to cf6cefc (#3253)
Bumps [assets/syntaxes/02_Extra/Apache](https://github.com/colinta/ApacheConf.tmLanguage) from `163bc03` to `cf6cefc`.
- [Commits](https://github.com/colinta/ApacheConf.tmLanguage/compare/163bc03ae8998a237dfb4be353d0aea198ea17f5...cf6cefc51ebb46b1b54906433edbae0fe9c71cad)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Apache
  dependency-version: cf6cefc51ebb46b1b54906433edbae0fe9c71cad
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-13 09:50:51 +00:00
Keith Hall 93be82ebc9 Merge pull request #3236 from chetanjangir0/add-gdscript-support
Add GDScript Syntax Support (#3233)
2025-04-13 12:31:26 +03:00
Chetan Jangir 0bf4753ff1 Update CHANGELOG.md
Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>
2025-04-13 14:51:53 +05:30
Chetan Jangir fbb07a1494 Merge branch 'master' into add-gdscript-support 2025-04-13 10:00:58 +05:30
Keith Hall debb66f8b0 Merge pull request #3262 from AdamGaskins/bash-zsh
Fix syntax highlighting for bash/zsh
2025-04-12 18:21:01 +03:00
Adam Gaskins 45185b36fb Merge branch 'master' into bash-zsh 2025-04-12 11:09:33 -04:00
Adam Gaskins e761d79512 Update CHANGELOG.md
Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>
2025-04-12 11:08:57 -04:00
chetanjangir0 14064dd987 regenerated the highlighted file 2025-04-12 19:14:15 +05:30
chetanjangir0 3eef8590f4 genereated highlighted syntax test file 2025-04-12 18:00:43 +05:30
chetanjangir0 3e7ad18fe3 fixed merge conflicts 2025-04-12 17:22:18 +05:30
Keith Hall 80a38590b8 Merge pull request #3245 from HSM95/fix/multibyte-chars
Fix for multibyte characters in file path
2025-04-12 11:30:28 +03:00
Keith Hall 44a6e29da7 Merge branch 'master' into fix/multibyte-chars 2025-04-12 11:20:48 +03:00
Gunnlaugur Thor Briem a6e847e267 Fix copy-paste mistake in bat.1.in
The `--theme-light` documentation says “dark” in two places where it should say “light” (presumably copy-pasted from the `--theme-dark` documentation)
2025-04-10 10:56:19 +00:00
Martin Nordholts 2f70906665 Cargo.toml: Document that MSRV can be bumped if there is a reason for it
To the best of my knowledge our current MSRV rule is that we can bump
MSRV whenever there is a reason for it. Let's document it.
2025-04-08 05:00:00 +02:00
Adam Gaskins c4c919aa31 Update CHANGELOG.md 2025-04-07 17:43:56 -04:00
Adam Gaskins 51491c3c08 Fix syntax highlighting for bash/zsh 2025-04-07 17:43:56 -04:00
Martin Nordholts ea17f6ad28 Make mention (@ in front of name) in CHANGELOG entry optional 2025-04-07 17:31:12 +02:00
Martin Nordholts 3691c9945a CICD: Stop building for x86_64-pc-windows-gnu which fails
Let's not build for platforms that are broken. If someone fixes the
build we can of course add it back.
2025-04-07 17:31:12 +02:00
Keith Hall 57629bcaca Merge pull request #3239 from einfachIrgendwer0815/feature/page_list_themes
Add paging to `--list-themes`
2025-04-05 09:08:35 +03:00
HSM95 b38ee77628 Merge branch 'master' into fix/multibyte-chars 2025-04-03 00:49:55 -07:00
Haris Mohamedy b5413cc015 Do not split into graphemes if not necessary 2025-04-03 00:49:14 -07:00
einfachIrgendwer0815 5edaa96164 Update CHANGELOG 2025-04-02 11:27:37 +02:00
einfachIrgendwer0815 12a2a451b4 Add paging to --list-themes 2025-04-02 11:27:37 +02:00
Keith Hall fc7dff50b0 Merge pull request #3255 from dan-hipschman/fix-syntax-test-compare-script
Make highlight tests fail when new syntaxes don't have fixtures
2025-04-02 05:21:30 +03:00
Dan Hipschman 9272e09058 Make highlight tests fail when new syntaxes don't have fixtures 2025-04-01 13:08:19 -07:00
dependabot[bot] b13c4d5f8d Bump indexmap from 2.7.0 to 2.8.0 (#3248)
Bumps [indexmap](https://github.com/indexmap-rs/indexmap) from 2.7.0 to 2.8.0.
- [Changelog](https://github.com/indexmap-rs/indexmap/blob/main/RELEASES.md)
- [Commits](https://github.com/indexmap-rs/indexmap/compare/2.7.0...2.8.0)

---
updated-dependencies:
- dependency-name: indexmap
  dependency-version: 2.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 03:39:30 +00:00
dependabot[bot] d7b10b4352 Bump etcetera from 0.8.0 to 0.10.0 (#3247)
Bumps [etcetera](https://github.com/lunacookies/etcetera) from 0.8.0 to 0.10.0.
- [Release notes](https://github.com/lunacookies/etcetera/releases)
- [Commits](https://github.com/lunacookies/etcetera/compare/v0.8.0...v0.10.0)

---
updated-dependencies:
- dependency-name: etcetera
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 03:11:49 +00:00
dependabot[bot] 05cddff72d Bump anyhow from 1.0.95 to 1.0.97 (#3246)
Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.95 to 1.0.97.
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.95...1.0.97)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-version: 1.0.97
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-01 02:44:03 +00:00
Haris Mohamedy a55d23aaa4 Add PR to CHANGELOG 2025-03-31 17:50:23 -07:00
Haris Mohamedy 18b71743c8 Fix for multibyte characters in file path 2025-03-31 17:29:18 -07:00
dependabot[bot] f761ff6824 Bump assets/syntaxes/02_Extra/Org_mode from 4976d8f to bb6e5d8 (#3221)
Bumps [assets/syntaxes/02_Extra/Org_mode](https://github.com/jezcope/Org.tmbundle) from `4976d8f` to `bb6e5d8`.
- [Release notes](https://github.com/jezcope/Org.tmbundle/releases)
- [Commits](https://github.com/jezcope/Org.tmbundle/compare/4976d8f84eeecd94df7da872bf404c125df04c73...bb6e5d848151135ab8f87bdcb997437b2308718a)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Org_mode
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-29 06:55:24 +00:00
dependabot[bot] 8e2d233445 Bump assets/syntaxes/02_Extra/Zig from 1a4a384 to 8a4a3fe (#3220)
Bumps [assets/syntaxes/02_Extra/Zig](https://github.com/ziglang/sublime-zig-language) from `1a4a384` to `8a4a3fe`.
- [Release notes](https://github.com/ziglang/sublime-zig-language/releases)
- [Commits](https://github.com/ziglang/sublime-zig-language/compare/1a4a38445fec495817625bafbeb01e79c44abcba...8a4a3fe4a051f85c4752b82f586d395cab843c06)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Zig
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-29 06:41:10 +00:00
Keith Hall 59b1f362f6 Merge pull request #3241 from chetanjangir0/add-odin-syntax
Add Odin Language Syntax Support
2025-03-29 08:23:52 +02:00
Chetan Jangir a73c641a0f Update CHANGELOG.md
Co-authored-by: Keith Hall <keith-hall@users.noreply.github.com>
2025-03-29 11:43:36 +05:30
Chetan Jangir 3d4c72da0b Merge branch 'master' into add-gdscript-support 2025-03-29 09:44:48 +05:30
Chetan Jangir 71547b3fb3 Merge branch 'master' into add-odin-syntax 2025-03-29 09:44:11 +05:30
Keith Hall ad8da94d2a Merge pull request #3243 from simono/patch-2
Use built-in detection for OS theme in Readme
2025-03-29 05:27:11 +02:00
Simon Olofsson 5ea762a46c Use built-in detection for OS theme in Readme 2025-03-29 05:15:38 +02:00
Keith Hall bbb5829ad9 Merge pull request #3242 from simono/patch-1
Add abbreviations for fish to Readme
2025-03-29 05:13:14 +02:00
Simon Olofsson c00b382f13 Add abbreviations for fish to Readme 2025-03-28 22:01:23 +01:00
Chetan 964e2bdac3 updated changelog for pr number 2025-03-28 12:23:34 +00:00
Chetan 2e7ab99099 Add Odin submodule and syntax test file 2025-03-28 12:17:45 +00:00
Chetan 4175f28979 Update changelog entry for GDScript support (#3233) 2025-03-23 13:53:32 +00:00
Chetan 207f90f01b Add GDScript submodule and syntax test file for GDScript support, see #XXX (@chetanjangir0) 2025-03-23 13:24:30 +00:00
dependabot[bot] 5c43ddb56c Bump assets/syntaxes/02_Extra/cmd-help from 209559b to 68e727b (#3222)
Bumps [assets/syntaxes/02_Extra/cmd-help](https://github.com/victor-gp/cmd-help-sublime-syntax) from `209559b` to `68e727b`.
- [Commits](https://github.com/victor-gp/cmd-help-sublime-syntax/compare/209559b72f7e8848c988828088231b3a4d8b6838...68e727bad437fa8bd8c74c464d0b7ba0e52d2758)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/cmd-help
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 17:23:30 +00:00
dependabot[bot] 3838766dd4 Bump assets/syntaxes/02_Extra/Docker from 0f6b7bc to c001fb2 (#3024)
Bumps [assets/syntaxes/02_Extra/Docker](https://github.com/asbjornenge/Docker.tmbundle) from `0f6b7bc` to `c001fb2`.
- [Release notes](https://github.com/asbjornenge/Docker.tmbundle/releases)
- [Commits](https://github.com/asbjornenge/Docker.tmbundle/compare/0f6b7bc87acf684f7b0790fd480731ffb4615b87...c001fb280561d7c16f0f2837d76af493cf6c3bf8)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Docker
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 16:13:59 +00:00
David Peter a006457a72 Update Warp link 2025-03-09 19:20:02 +01:00
David Peter 0449107230 Update sponsors 2025-03-04 19:30:20 +01:00
dependabot[bot] 75313d886b Bump assets/syntaxes/02_Extra/Nix from 9032bd6 to 48c497c (#3219)
Bumps [assets/syntaxes/02_Extra/Nix](https://github.com/wmertens/sublime-nix) from `9032bd6` to `48c497c`.
- [Release notes](https://github.com/wmertens/sublime-nix/releases)
- [Commits](https://github.com/wmertens/sublime-nix/compare/9032bd613746b9c135223fd6f26a5fa555f18946...48c497c709c66a2fb118c534a8de8e4e1c4c401d)

---
updated-dependencies:
- dependency-name: assets/syntaxes/02_Extra/Nix
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-01 03:25:07 +00:00
Keith Hall 4998f58847 Merge pull request #3215 from sharkdp/debsources
Add debsources syntax
2025-02-25 22:28:09 +02:00
Keith Hall ffc094bd91 Add debsources syntax 2025-02-25 22:17:00 +02:00
Keith Hall 343326eacf Merge pull request #3213 from sharkdp/csproj_xml_mapping
Map various .NET file extensions to XML syntax
2025-02-25 05:09:12 +02:00
Keith Hall d31bc4347a Map various .NET file extensions to XML syntax 2025-02-23 20:20:52 +02:00
Keith Hall adfb951e51 Merge pull request #3209 from sharkdp/ndjson
Add mapping for ndjson file extension to JSON syntax
2025-02-15 12:16:52 +02:00
Keith Hall 2843a2c0e8 Add mapping for ndjson file extension to JSON syntax 2025-02-15 08:46:22 +02:00
Keith Hall 94d3dc254e Merge pull request #3205 from sharkdp/syslog_error_highlighting_fix
Syslog error highlighting fix
2025-02-10 20:46:54 +02:00
Keith Hall 915eb55779 Merge branch 'master' into syslog_error_highlighting_fix 2025-02-09 22:20:14 +02:00
Keith Hall 547bc38118 Merge pull request #3186 from sharkdp/csv_1977
Correctly handle CSV files with a single separator throughout
2025-02-09 20:49:14 +02:00
Keith Hall 93fd013aa1 Update changelog 2025-02-09 20:37:53 +02:00
Keith Hall 512bfde7ce Correctly handle CSV files with a single separator throughout
better auto-detection of CSV delimiter
- files with a tsv extension are automatically detected as tab delimited
- other files parsed as CSV go through the following steps:
  - if the first line contains at least 3 of the same separator, it uses that separator as a delimiter
  - if the first line contains only one supported separator character, it uses that separator as a delimiter
  - otherwise it falls back to treating all supported delimiters as the delimiter

 supported delimiters, in precedence order:
 - comma `,`
 - semi-colon `;`
 - tab `\t`
 - pipe `|`
2025-02-09 20:37:53 +02:00
Keith Hall 27ba45ded7 patch Monokai Extended theme for better Syslog error highlighting 2025-02-09 20:32:48 +02:00
Keith Hall c0898dedb1 fix meta scope ordering to come before constant.numeric scope for times 2025-02-09 20:31:31 +02:00
Keith Hall b82b920420 attempt to fix syslog error highlighting 2025-02-09 20:31:31 +02:00
Keith Hall ac40f7cfd8 Merge pull request #3201 from victor-gp/fix-submodules-for-dependabot
Rename submodule paths to fix Dependabot submodule updates
2025-02-04 05:15:14 +02:00
Víctor González Prieto 330c51de9f Add Changelog entry 2025-02-04 00:15:45 +01:00
Víctor González Prieto 0ed527f0d1 Replace spaces in git submodule paths
To mitigate a bug in the GitHub API that broke the Dependabot action
that updates submodules. See sharkdp/bat#3198.
2025-02-03 22:01:33 +01:00
Keith Hall 7df1dec65c Merge pull request #3196 from odilf/master
Add syntax mapping for `nix`s `flake.lock`
2025-02-02 21:20:33 +02:00
odilf 61d42ee87b Add syntax mapping for nixs flake.lock 2025-02-02 21:10:03 +02:00
Keith Hall a95e65eea1 Merge pull request #3197 from einfachIrgendwer0815/style/fix_lints
Fix clippy lint warnings
2025-02-02 21:05:43 +02:00
einfachIrgendwer0815 71dce0e7f3 Fix clippy::duplicated_attributes warnings 2025-02-02 15:08:16 +01:00
einfachIrgendwer0815 53af1dc32d Fix clippy::unnecessary_filter_map warnings 2025-02-02 15:08:15 +01:00
einfachIrgendwer0815 52252b15d6 Fix clippy::needless_lifetimes warnings 2025-02-02 15:08:15 +01:00
einfachIrgendwer0815 bc24ce9ad4 Fix clippy::needless_update warnings 2025-02-02 15:08:15 +01:00
einfachIrgendwer0815 625e986552 Fix clippy::manual_ignore_case_cmp warnings 2025-02-02 15:08:14 +01:00
einfachIrgendwer0815 095442191c Fix clippy::ptr_arg warnings 2025-02-02 15:08:14 +01:00
einfachIrgendwer0815 cc46282866 Fix clippy::into_iter_on_ref warnings 2025-02-02 15:08:13 +01:00
einfachIrgendwer0815 cbc9c3629d Fix clippy::manual_pattern_char_comparison warnings 2025-02-02 15:08:13 +01:00
einfachIrgendwer0815 2c49d905e4 Fix clippy::legacy_numeric_constants warnings 2025-02-02 15:08:12 +01:00
einfachIrgendwer0815 f0e2f642e0 Fix clippy::redundant_closure warnings 2025-02-02 15:08:12 +01:00
einfachIrgendwer0815 3d0f0c0565 Fix clippy::unnecessary_map_or warnings 2025-02-02 15:08:12 +01:00
einfachIrgendwer0815 3d442cdf98 Fix clippy::needless_borrow warnings 2025-02-02 15:08:11 +01:00
einfachIrgendwer0815 b009fee5ea Fix clippy::needless_return warnings 2025-02-02 15:08:11 +01:00
einfachIrgendwer0815 6cf747678c Fix clippy::needless_borrows_for_generic_args warnings 2025-02-02 15:08:11 +01:00
dependabot[bot] db812e1179 Bump thiserror from 1.0.69 to 2.0.11 (#3195)
Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.69 to 2.0.11.
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/1.0.69...2.0.11)

---
updated-dependencies:
- dependency-name: thiserror
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-01 04:35:19 +00:00
dependabot[bot] 995f23b58f Bump tempfile from 3.15.0 to 3.16.0 (#3192)
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.15.0 to 3.16.0.
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Stebalien/tempfile/compare/v3.15.0...v3.16.0)

---
updated-dependencies:
- dependency-name: tempfile
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-01 04:18:58 +00:00
dependabot[bot] ef3830234d Bump itertools from 0.13.0 to 0.14.0 (#3193)
Bumps [itertools](https://github.com/rust-itertools/itertools) from 0.13.0 to 0.14.0.
- [Changelog](https://github.com/rust-itertools/itertools/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-itertools/itertools/compare/v0.13.0...v0.14.0)

---
updated-dependencies:
- dependency-name: itertools
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-01 03:53:27 +00:00
dependabot[bot] 4fc55cfcec Bump semver from 1.0.24 to 1.0.25 (#3191)
Bumps [semver](https://github.com/dtolnay/semver) from 1.0.24 to 1.0.25.
- [Release notes](https://github.com/dtolnay/semver/releases)
- [Commits](https://github.com/dtolnay/semver/compare/1.0.24...1.0.25)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-01 03:24:58 +00:00
Keith Hall 487ac3bc48 Merge pull request #3150 from buzden/add-idris-syntax
[ new ] Add support for Idris 2 programming language
2025-01-27 23:00:05 +02:00
Denis Buzdalov d6cb3ba747 [ new ] Add support for Idris 2 programming language 2025-01-27 23:47:20 +03:00
Keith Hall a9a2dceb72 Merge pull request #3146 from buzden/fix-readme-translation
Correct and update one readme's translation according to the main english one
2025-01-27 22:35:23 +02:00
Keith Hall bee08e48ae Merge branch 'master' into fix-readme-translation 2025-01-27 22:20:35 +02:00
Keith Hall b14fb9db24 Merge pull request #3189 from einfachIrgendwer0815/fix/list_themes_2
Fix: Don't output default theme info to piped stdout
2025-01-27 21:59:18 +02:00
Keith Hall 91acb0d16f update changelog to mention --list-themes bugfix when stdout is piped 2025-01-27 21:43:57 +02:00
einfachIrgendwer0815 4f161705a3 Fix: Don't output default theme info to piped stdout 2025-01-27 17:11:26 +01:00
Keith Hall f8c6e90647 Merge pull request #3182 from cyqsimon/paru
Add syntax mapping for paru configuration files
2025-01-24 23:21:29 +02:00
cyqsimon dd9dc4f76b Write changelog 2025-01-24 23:02:57 +02:00
cyqsimon 94f49fd99b Add syntax mapping for paru configuration 2025-01-24 23:02:57 +02:00
Keith Hall 498df11a50 Merge pull request #3179 from dtolnay-contrib/vendorbug
Work around `cargo vendor` losing syntax_mapping builtins directory
2025-01-18 09:31:35 +02:00
David Tolnay db7da314e7 Work around cargo vendor losing syntax_mapping builtins directory 2025-01-17 21:30:37 -08:00
David Peter 33aabc696a Move section slightly further down 2025-01-15 08:34:52 +01:00
oliviajohnsto 648bedf290 Add Warp Pack sponsorship 2025-01-15 08:34:52 +01:00
Keith Hall dd3d1b8cdb Merge pull request #3174 from philipp-tailor/patch-1
Fix tiny accidental repetition in README.md
2025-01-10 19:31:42 +02:00
Philipp Schneider b39a156d57 Update README.md
Fixes copy and paste error, where same option was listed twice, instead of the 2 distinct options of `--theme` for different system appearances.
2025-01-10 17:45:26 +01:00
Keith Hall b6158c09b4 Merge pull request #3168 from bash/fix-env-var-names
Fix name of BAT_THEME_{DARK,LIGHT} env vars
2025-01-09 18:50:02 +02:00
Tau Gärtli 8a11a46f66 Add integration tests 2025-01-09 08:20:36 +01:00
Tau Gärtli 4d73c1e511 Add changelog entry 2025-01-09 08:20:36 +01:00
Tau Gärtli 280f3eeb4e Fix name of BAT_THEME_{DARK,LIGHT} env vars 2025-01-09 08:20:36 +01:00
Keith Hall 1321160203 Merge pull request #3169 from branchvincent/git2
Bump git2 to 0.20
2025-01-08 06:52:03 +02:00
Branch Vincent 01680e444b Bump git2 to 0.20 2025-01-07 20:30:27 -08:00
Keith Hall 2435453c33 Merge pull request #3167 from sharkdp/keith-hall-patch-1
Post release steps
2025-01-07 21:51:03 +02:00
Keith Hall 6e466e5ab4 Post release steps
Add new unreleased section at top of change log
2025-01-07 21:30:39 +02:00
Denis Buzdalov 004d2d5122 [ readme ] Correct and update one readme's translation 2024-12-17 13:49:23 +03:00
Alex Jesipow 60b3428ad7 Fix lock file 2024-08-10 11:38:38 +02:00
Alex 571970f8ff Merge branch 'master' into read-from-tail 2024-08-10 11:34:45 +02:00
Alex Jesipow 18a0653ce8 Add changelog entry 2024-08-10 11:27:34 +02:00
Alex Jesipow 569286055c Support relative negative line ranges 2024-08-10 10:37:19 +02:00
202 changed files with 8494 additions and 1757 deletions
+1
View File
@@ -0,0 +1 @@
use flake
@@ -1,23 +0,0 @@
# This workflow triggers auto-merge of any PR that dependabot creates so that
# PRs will be merged automatically without maintainer intervention if CI passes
name: Auto-merge dependabot PRs
on:
pull_request_target:
types: [opened]
jobs:
auto-merge:
if: github.repository == 'sharkdp/bat' && startsWith(github.head_ref, 'dependabot/')
runs-on: ubuntu-latest
environment:
name: auto-merge
url: https://github.com/sharkdp/bat/blob/main/.github/workflows/Auto-merge-dependabot-PRs.yml
env:
GITHUB_TOKEN: ${{ secrets.AUTO_MERGE_GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
- run: |
gh pr review ${{ github.event.pull_request.number }} --comment --body "If CI passes, this dependabot PR will be [auto-merged](https://github.com/sharkdp/bat/blob/main/.github/workflows/Auto-merge-dependabot-PRs.yml) 🚀"
- run: |
gh pr merge --auto --squash ${{ github.event.pull_request.number }}
+36 -41
View File
@@ -20,7 +20,7 @@ jobs:
runs-on: ubuntu-latest
needs:
- crate_metadata
- ensure_cargo_fmt
- lint
- min_version
- license_checks
- test_with_new_syntaxes_and_themes
@@ -35,7 +35,7 @@ jobs:
name: Extract crate metadata
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Extract crate information
id: crate_metadata
run: |
@@ -51,49 +51,46 @@ jobs:
homepage: ${{ steps.crate_metadata.outputs.homepage }}
msrv: ${{ steps.crate_metadata.outputs.msrv }}
ensure_cargo_fmt:
name: Ensure 'cargo fmt' has been run
runs-on: ubuntu-20.04
lint:
name: Ensure code quality
runs-on: ubuntu-latest
steps:
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- uses: actions/checkout@v4
components: rustfmt,clippy
- uses: actions/checkout@v6
- run: cargo fmt -- --check
- run: cargo clippy --locked --all-targets --all-features -- -D warnings
min_version:
name: Minimum supported rust version
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
needs: crate_metadata
steps:
- name: Checkout source code
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Install rust toolchain (v${{ needs.crate_metadata.outputs.msrv }})
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ needs.crate_metadata.outputs.msrv }}
components: clippy
- name: Run clippy (on minimum supported rust version to prevent warnings we can't fix)
run: cargo clippy --locked --all-targets ${{ env.MSRV_FEATURES }}
- name: Run tests
run: cargo test --locked ${{ env.MSRV_FEATURES }}
license_checks:
name: License checks
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
submodules: true # we especially want to perform license checks on submodules
- run: tests/scripts/license-checks.sh
test_with_new_syntaxes_and_themes:
name: Run tests with updated syntaxes and themes
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
steps:
- name: Git checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: true # we need all syntax and theme submodules
- name: Install Rust toolchain
@@ -119,10 +116,10 @@ jobs:
test_with_system_config:
name: Run tests with system wide configuration
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
steps:
- name: Git checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Prepare environment variables
run: |
echo "BAT_SYSTEM_CONFIG_PREFIX=$GITHUB_WORKSPACE/tests/examples/system_config" >> $GITHUB_ENV
@@ -135,10 +132,10 @@ jobs:
documentation:
name: Documentation
runs-on: ubuntu-20.04
runs-on: ubuntu-latest
steps:
- name: Git checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Check documentation
@@ -153,7 +150,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- run: cargo install cargo-audit --locked
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- run: cargo audit
build:
@@ -164,24 +161,24 @@ jobs:
fail-fast: false
matrix:
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: 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: i686-pc-windows-msvc , os: windows-2019, }
- { target: i686-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: i686, use-cross: true }
- { target: i686-unknown-linux-musl , os: ubuntu-20.04, dpkg_arch: musl-linux-i686, use-cross: true }
- { target: x86_64-apple-darwin , os: macos-13, }
- { target: aarch64-apple-darwin , os: macos-14, }
- { target: x86_64-pc-windows-gnu , os: windows-2019, }
- { target: x86_64-pc-windows-msvc , os: windows-2019, }
- { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: amd64, use-cross: true }
- { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, dpkg_arch: musl-linux-amd64, use-cross: true }
- { target: aarch64-unknown-linux-musl , os: ubuntu-latest , dpkg_arch: musl-linux-arm64, use-cross: true }
- { target: aarch64-unknown-linux-gnu , os: ubuntu-latest , dpkg_arch: arm64, use-cross: true }
- { target: arm-unknown-linux-gnueabihf , os: ubuntu-latest , dpkg_arch: armhf, use-cross: true }
- { target: arm-unknown-linux-musleabihf, os: ubuntu-latest , dpkg_arch: musl-linux-armhf, use-cross: true }
- { target: i686-pc-windows-msvc , os: windows-2025 , }
- { target: i686-unknown-linux-gnu , os: ubuntu-latest , dpkg_arch: i386, use-cross: true }
- { target: i686-unknown-linux-musl , os: ubuntu-latest , dpkg_arch: musl-linux-i686, use-cross: true }
- { target: x86_64-apple-darwin , os: macos-15-intel, }
- { target: aarch64-apple-darwin , os: macos-latest , }
- { target: x86_64-pc-windows-msvc , os: windows-2025 , }
- { target: aarch64-pc-windows-msvc , os: windows-11-arm, }
- { target: x86_64-unknown-linux-gnu , os: ubuntu-latest , dpkg_arch: amd64, use-cross: true }
- { target: x86_64-unknown-linux-musl , os: ubuntu-latest , dpkg_arch: musl-linux-amd64, use-cross: true }
env:
BUILD_CMD: cargo
steps:
- name: Checkout source code
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Install prerequisites
shell: bash
@@ -198,9 +195,7 @@ jobs:
- name: Install cross
if: matrix.job.use-cross
uses: taiki-e/install-action@v2
with:
tool: cross
run: cargo install cross --git https://github.com/cross-rs/cross --rev 588b3c99db52b5a9c5906fab96cfadcf1bde7863
- name: Overwrite build command env variable
if: matrix.job.use-cross
@@ -338,7 +333,7 @@ jobs:
DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}
DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }}-musl
case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-musl ; DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }} ;; esac;
case ${{ matrix.job.target }} in *-musl*) DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-musl ; DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }} ;; esac;
DPKG_VERSION=${{ needs.crate_metadata.outputs.version }}
DPKG_ARCH="${{ matrix.job.dpkg_arch }}"
DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb"
@@ -462,7 +457,7 @@ jobs:
needs: build
if: startsWith(github.ref, 'refs/tags/v')
steps:
- uses: vedantmgoyal2009/winget-releaser@v2
- uses: vedantmgoyal9/winget-releaser@19e706d4c9121098010096f9c495a70a7518b30f
with:
identifier: sharkdp.bat
installers-regex: '-pc-windows-msvc\.zip$'
@@ -13,7 +13,7 @@ jobs:
PR_NUMBER: ${{ github.event.number }}
PR_BASE: ${{ github.base_ref }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Fetch PR base
run: git fetch --no-tags --prune --depth=1 origin
@@ -30,4 +30,4 @@ jobs:
echo "Added lines in CHANGELOG.md:"
echo "$ADDED"
echo "Grepping for PR info (see CONTRIBUTING.md):"
grep "#${PR_NUMBER}\\b.*@${PR_SUBMITTER}\\b" <<< "$ADDED"
grep "#${PR_NUMBER}\\b.*${PR_SUBMITTER}\\b" <<< "$ADDED"
+7
View File
@@ -1,6 +1,11 @@
.direnv/
/target/
**/*.rs.bk
# Editors
.idea/
.vscode/
# Generated files
/assets/completions/_bat.ps1
/assets/completions/bat.bash
@@ -8,3 +13,5 @@
/assets/completions/bat.zsh
/assets/manual/bat.1
/assets/metadata.yaml
+36 -18
View File
@@ -65,7 +65,7 @@
path = assets/themes/onehalf
url = https://github.com/sonph/onehalf
[submodule "assets/syntaxes/JavaScript (Babel)"]
path = assets/syntaxes/02_Extra/JavaScript (Babel)
path = assets/syntaxes/02_Extra/JavaScript_(Babel)
url = https://github.com/babel/babel-sublime
[submodule "assets/syntaxes/FSharp"]
path = assets/syntaxes/02_Extra/FSharp
@@ -89,7 +89,7 @@
path = assets/themes/sublime-snazzy
url = https://github.com/greggb/sublime-snazzy
[submodule "assets/syntaxes/Assembly (ARM)"]
path = assets/syntaxes/02_Extra/Assembly (ARM)
path = assets/syntaxes/02_Extra/Assembly_(ARM)
url = https://github.com/tvi/Sublime-ARM-Assembly
[submodule "assets/syntaxes/protobuf-syntax-highlighting"]
path = assets/syntaxes/02_Extra/Protobuf
@@ -108,14 +108,11 @@
path = assets/syntaxes/02_Extra/Fish
url = https://github.com/Phidica/sublime-fish.git
[submodule "assets/syntaxes/Org mode"]
path = assets/syntaxes/02_Extra/Org mode
path = assets/syntaxes/02_Extra/Org_mode
url = https://github.com/jezcope/Org.tmbundle.git
[submodule "assets/syntaxes/DotENV"]
path = assets/syntaxes/02_Extra/DotENV
url = https://github.com/zaynali53/DotENV
[submodule "assets/syntaxes/hosts"]
path = assets/syntaxes/02_Extra/hosts
url = https://github.com/brandonwamboldt/sublime-hosts
[submodule "assets/syntaxes/ssh-config"]
path = assets/syntaxes/02_Extra/ssh-config
url = https://github.com/robballou/sublimetext-sshconfig.git
@@ -133,7 +130,7 @@
url = https://github.com/djuretic/SublimeStrace
[submodule "assets/syntaxes/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"]
path = assets/syntaxes/02_Extra/SLS
url = https://github.com/saltstack/sublime-text
@@ -142,7 +139,7 @@
path = assets/themes/dracula-sublime
url = https://github.com/dracula/sublime.git
[submodule "assets/syntaxes/HTML (Twig)"]
path = assets/syntaxes/02_Extra/HTML (Twig)
path = assets/syntaxes/02_Extra/HTML_(Twig)
url = https://github.com/Anomareh/PHP-Twig.tmbundle.git
[submodule "assets/themes/Nord-sublime"]
path = assets/themes/Nord-sublime
@@ -177,7 +174,7 @@
url = https://github.com/euler0/sublime-glsl
[submodule "assets/syntaxes/02_Extra/Nginx"]
path = assets/syntaxes/02_Extra/Nginx
url = https://github.com/brandonwamboldt/sublime-nginx
url = https://github.com/SublimeText/nginx
[submodule "assets/syntaxes/02_Extra/Apache"]
path = assets/syntaxes/02_Extra/Apache
url = https://github.com/colinta/ApacheConf.tmLanguage
@@ -196,22 +193,16 @@
branch = bat-source
[submodule "assets/syntaxes/02_Extra/Lean"]
path = assets/syntaxes/02_Extra/Lean
url = https://github.com/leanprover/vscode-lean.git
[submodule "assets/syntaxes/02_Extra/LiveScript"]
path = assets/syntaxes/02_Extra/LiveScript
url = https://github.com/paulmillr/LiveScript.tmbundle
url = https://github.com/leanprover/vscode-lean4.git
[submodule "assets/syntaxes/02_Extra/Zig"]
path = assets/syntaxes/02_Extra/Zig
url = https://github.com/ziglang/sublime-zig-language.git
url = https://codeberg.org/ziglang/sublime-zig-language.git
[submodule "assets/syntaxes/02_Extra/gnuplot"]
path = assets/syntaxes/02_Extra/gnuplot
url = https://github.com/hesstobi/sublime_gnuplot
[submodule "assets/syntaxes/02_Extra/SystemVerilog"]
path = assets/syntaxes/02_Extra/SystemVerilog
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"]
path = assets/syntaxes/02_Extra/SublimeEthereum
url = https://github.com/davidhq/SublimeEthereum.git
@@ -249,7 +240,7 @@
url = https://github.com/dertuxmalwieder/SublimeTodoTxt
[submodule "assets/syntaxes/02_Extra/Ada"]
path = assets/syntaxes/02_Extra/Ada
url = https://github.com/wiremoons/ada-sublime-syntax
url = https://github.com/AldanTanneo/ada-sublime-syntax
[submodule "assets/syntaxes/02_Extra/Crontab"]
path = assets/syntaxes/02_Extra/Crontab
@@ -263,3 +254,30 @@
[submodule "assets/syntaxes/02_Extra/CFML"]
path = assets/syntaxes/02_Extra/CFML
url = https://github.com/jcberquist/sublimetext-cfml.git
[submodule "assets/syntaxes/02_Extra/Idris2"]
path = assets/syntaxes/02_Extra/Idris2
url = https://github.com/buzden/sublime-syntax-idris2
[submodule "assets/syntaxes/02_Extra/GDScript-sublime"]
path = assets/syntaxes/02_Extra/GDScript-sublime
url = https://github.com/beefsack/GDScript-sublime
[submodule "assets/syntaxes/02_Extra/sublime-odin"]
path = assets/syntaxes/02_Extra/sublime-odin
url = https://github.com/odin-lang/sublime-odin
[submodule "assets/syntaxes/02_Extra/typst-syntax-highlight"]
path = assets/syntaxes/02_Extra/typst-syntax-highlight
url = https://github.com/hyrious/typst-syntax-highlight
[submodule "assets/themes/Catppuccin"]
path = assets/themes/Catppuccin
url = https://github.com/SchweGELBin/catppuccin-bat-sub.git
[submodule "assets/syntaxes/02_Extra/SmartVHDL"]
path = assets/syntaxes/02_Extra/SmartVHDL
url = https://github.com/TheClams/SmartVHDL
[submodule "assets/syntaxes/02_Extra/hosts"]
path = assets/syntaxes/02_Extra/hosts
url = https://github.com/tijn/hosts.tmLanguage
[submodule "assets/syntaxes/02_Extra/Gomod"]
path = assets/syntaxes/02_Extra/Gomod
url = https://github.com/mitranim/sublime-gomod
[submodule "assets/syntaxes/02_Extra/COBOL"]
path = assets/syntaxes/02_Extra/COBOL
url = https://github.com/adukhan99/sublime_cobol.git
+162
View File
@@ -1,3 +1,165 @@
# unreleased
## Other
- Add instructions for removing fish help abbreviations to README, see #3655 (@claw-explorer). Closes #3536
## Features
- Preserve `--diff` change markers and snip separators when `--plain` is set. Closes #3630, see #3643 (@mvanhorn)
- Added support for `hidden_file_extensions` from `.sublime-syntax` files, see #3613 (@Matei02355)
- Add word wrapping mode via `--wrap=word`, see #3597 (@veeceey)
- Implement `--unbuffered` mode for streaming input, allowing partial lines to display immediately (e.g. `tail -f | bat -u`). Closes #3555, see #3583 (@mainnebula)
- 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)
- Add `--fallback-syntax`/`--fallback-language` to apply syntax highlighting only when auto-detection fails, see #1341 (@Xavrir)
- Map `BUILD` case sensitively to Python (Starlark) for Bazel, see #3576 (@vorburger)
## Bugfixes
- Fix i686 `.deb` package using incorrect architecture name (`i686` instead of `i386`), preventing installation on Debian. Closes #3611, see #3650 (@Sim-hu)
- Fix inconsistent `.deb` MUSL package names (aarch64-musl used `arm64` instead of `musl-linux-arm64`, and `musleabihf` target missed `bat-musl` prefix). Closes #3482, see #3642 (@mvanhorn)
- Fix incorrect text width computation when using `--binary=as-text` with non-printable characters in caret notation, see #3640 and #3631 (@eyupcanakman)
- Fix `BAT_CONFIG_DIR` pointing at system config directory causing duplicate flag errors. Closes #3589, see #3620 (@Xavrir)
- Fix syntax highlighting for symlinked files when the symlink name has no extension but the target does. Closes #1001, see #3621 (@Xavrir)
- Report error when pager is missing instead of silently falling back, see #3588 (@IMaloney)
- Fix `--wrap=never` and `-S` flags being ignored when piping to pager, see #3592 (@IMaloney)
- Fix crash with BusyBox `less` on Windows, see #3527 (@Anchal-T)
- Fix `bat cache --help` failing with 'unexpected argument' error, see #3580 and #3560 (@NORMAL-EX)
- `--help` now correctly honors `--pager=builtin`. See #3516 (@keith-hall)
- `--help` now correctly honors custom themes. See #3524 (@keith-hall)
- Fixed test compatibility with future Cargo build directory changes, see #3550 (@nmacl)
- Fixed bug caused by using `--plain` and `--terminal-width=N` flags simultaneously, see #3529 (@H4k1l)
- Fixed syntax tests path, see #3610 (@foxfromworld)
## Other
- Use git version of cross. See #3533 (@OctopusET)
- Bump MSRV to 1.88, update `time` crate to 0.3.47 to fix RUSTSEC-2026-0009, see #3581 (@NORMAL-EX)
- Allow home and end keys to be used with builtin pager, see #3651 (@keith-hall)
- Builtin syntax mapping: cleanup matcher glob parsing logic #3652 (@cyqsimon)
## Syntaxes
- Change the URL of Zig submodule from GitHub to Codeberg, see #3519 (@sorairolake)
- Don't color strings inside CSV files, to make it easier to tell which column they belong to, see #3521 (@keith-hall)
- Add syntax highlighting support for COBOL, see #3584 (@adukhan99)
- Fixed manpage syntax so that ANSI escape codes don't get incorrectly highlighted and thus broken, see #3586 (@BlueElectivire)
- Map several Google Cloud CLI config files to their appropriate syntax #3635 (@victor-gp)
- Map all ignore dotfiles to Git Ignore syntax #3636 (@victor-gp)
## Themes
- Remove the Visual Studio Dark+ theme, see #3552 (@CosmicHorrorDev)
## `bat` as a library
# v0.26.1
## Features
- Add paging to '-h' and '--help' see PR #3478 (@MuntasirSZN)
## Bugfixes
- Fix hang when using `--list-themes` with an explicit pager, see #3457 (@abhinavcool42)
- Fix negative values of N not being parsed in <N:M> line ranges without `=` flag value separator, see #3442 (@lmmx)
- Fix broken Docker syntax preventing use of custom assets, see #3476 (@keith-hall)
- Fix decorations being applied unexpectedly when piping. Now only line numbers explicitly required on the command line should be applied in auto decorations mode for `cat` compatibility. See #3496 (@keith-hall)
- Fix diagnostics attempting to find the version of an executable named builtin when builtin pager is used. See #3498 (@keith-hall)
- `--help` now correctly reads the config file for theme information etc. See #3507 (@keith-hall)
## Other
- Improve README documentation on pager options passed to less, see #3443 (@injust)
- Make PowerShell completions compatible with PowerShell v5.1, see #3495 (@keith-hall)
- Use more robust approach to escaping in Bash completions, see #3448 (@akinomyoga)
## Syntaxes
- Update quadlet syntax mapping to include *.{build,pod} files #3484 (@cyqsimon)
- Fix inconsistencies in Ada syntax, see #3481 (@AldanTanneo)
- Add syntax mapping for podman's `artifact` quadlet files, see #3497 (@xduugu)
- Highlight Korn Shell scripts (i.e. with a shebang of ...`ksh`) using Bash syntax, see #3509 (@keith-hall)
## Themes
## `bat` as a library
# v0.26.0
## Features
- Add build for windows/ARM64 platform. #3190 (@alcroito)
- Add paging to `--list-themes`, see PR #3239 (@einfachIrgendwer0815)
- Support negative relative line ranges, e.g. `bat -r :-10` / `bat -r='-10:'`, see #3068 (@ajesipow)
- Support context in line ranges, e.g. `bat -r 30::5` / `bat -r 30:40:5`, see #3345 (@cavanaug)
- Add built-in 'minus' pager, e.g. `bat --pager=builtin` see PR #3402 (@academician)
## Bugfixes
- Fix UTF-8 BOM not being stripped for syntax detection, see #3314 (@krikera)
- Fix `BAT_THEME_DARK` and `BAT_THEME_LIGHT` being ignored, see issue #3171 and PR #3168 (@bash)
- Prevent `--list-themes` from outputting default theme info to stdout when it is piped, see #3189 (@einfachIrgendwer0815)
- Rename some submodules to fix Dependabot submodule updates, see issue #3198 and PR #3201 (@victor-gp)
- Make highlight tests fail when new syntaxes don't have fixtures PR #3255 (@dan-hipschman)
- Fix crash for multibyte characters in file path, see issue #3230 and PR #3245 (@HSM95)
- Add missing mappings for various bash/zsh files, see PR #3262 (@AdamGaskins)
- Send all bat errors to stderr by default, see #3336 (@JerryImMouse)
- Make --map-syntax target case insensitive to match --language, see #3206 (@keith-hall)
- Correctly determine the end of the line in UTF16LE/BE input #3369 (@keith-hall)
- `--style=changes` no longer prints a two-space indent when the file is unmodified, see issue #2710 and PR #3406 (@jyn514)
- Add missing shell completions, see #3411 (@keith-hall)
- Execute help/version/diagnostic commands even with invalid config/arguments present, see #3414 (@keith-hall)
- Fixed line numbers (`-n`) and style components not printing when piping output, see issue #2935 and PR #3438 (@lmmx)
## Other
- Update base16 README links to community driven base16 work #2871 (@JamyGolden)
- Work around build failures when building `bat` from vendored sources #3179 (@dtolnay)
- CICD: Stop building for x86_64-pc-windows-gnu which fails #3261 (Enselic)
- CICD: replace windows-2019 runners with windows-2025 #3339 (@cyqsimon)
- Build script: replace string-based codegen with quote-based codegen #3340 (@cyqsimon)
- Improve code coverage of `--list-languages` parameter #2942 (@sblondon)
- Only start offload worker thread when there's more than 1 core #2956 (@cyqsimon)
- Update terminal-colorsaurus (the library used for dark/light detection) to 1.0, see #3347 (@bash)
- Update console dependency to 0.16, see #3351 (@musicinmybrain)
- Fixed some typos #3244 (@ssbarnea)
- Update onig_sys dependency to 69.9.1 to fix a gcc build failure #3400 (@CosmicHorrorDev)
- Add a cargo feature (`vendored-libgit2`) to build with vendored libgit2 version without depending on the system's one #3426 (@0x61nas)
- Update syntect dependency to v5.3.0 to fix a few minor bugs, see #3410 (@keith-hall)
## Syntaxes
- Add syntax mapping for `paru` configuration files #3182 (@cyqsimon)
- Add support for [Idris 2 programming language](https://www.idris-lang.org/) #3150 (@buzden)
- Add syntax mapping for `nix`'s '`flake.lock` lockfiles #3196 (@odilf)
- Improvements to CSV/TSV highlighting, with autodetection of delimiter and support for TSV files, see #3186 (@keith-
- Improve (Sys)log error highlighting, see #3205 (@keith-hall)
- Map `ndjson` extension to JSON syntax, see #3209 (@keith-hall)
- Map files with `csproj`, `vbproj`, `props` and `targets` extensions to XML syntax, see #3213 (@keith-hall)
- Add debsources syntax to highlight `/etc/apt/sources.list` files, see #3215 (@keith-hall)
- Add syntax definition and test file for GDScript highlighting, see #3236 (@chetanjangir0)
- Add syntax test file for Odin highlighting, see #3241 (@chetanjangir0)
- Update quadlet syntax mapping rules to cover quadlets in subdirectories #3299 (@cyqsimon)
- Add syntax Typst #3300 (@cskeeters)
- Map `.mill` files to Scala syntax for Mill build tool configuration files #3311 (@krikera)
- Add syntax highlighting for VHDL, see #3337 (@JerryImMouse)
- Add syntax mapping for certbot certificate configuration #3338 (@cyqsimon)
- Update Lean syntax from Lean 3 to Lean 4 #3322 (@YDX-2147483647)
- Map `.flatpakref` and `.flatpakrepo` files to INI syntax #3353 (@Ferenc-)
- Update hosts syntax #3368 (@keith-hall)
- Map `.kshrc` files to Bash syntax #3364 (@ritoban23)
- Map `/var/log/dmesg` files to Syslog syntax #3412 (@keith-hall)
- Add syntax definition and test file for Go modules(`go.mod` and `go.sum`) highlighting, see #3424 (@DarkMatter-999)
- Syntax highlighting for typescript code blocks within Markdown files, see #3435 (@MuntasirSZN)
## Themes
- Add Catppuccin, see #3317 (@SchweGELBin)
- Updated Catppuccin, see #3333 (@SchweGELBin)
- Updated gruvbox, see #3372 (@Nicholas42)
- Updated GitHub theme, see #3382 (@CosmicHorrorDev)
- Updated ANSI theme to highlight JSON object keys differently from values, see #3413 (@keith-hall)
# v0.25.0
## Features
+31 -1
View File
@@ -63,11 +63,15 @@ Before you make a pull request that adds a new syntax or theme, please read
the [Customization](https://github.com/sharkdp/bat#customization) section
in the README first.
If you really think that a particular syntax or theme should be added for all
If you really think that a particular syntax should be added for all
users, please read the corresponding
[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md)
first.
To map a file name pattern to an existing syntax, read [the documentation here](https://github.com/sharkdp/bat/blob/master/src/syntax_mapping/builtins/README.md).
Note: We are currently not accepting new default themes.
## Regression tests
@@ -89,3 +93,29 @@ To learn how to write regression tests for theme and syntax changes, read the
[Syntax
tests](https://github.com/sharkdp/bat/blob/master/doc/assets.md#syntax-tests)
section in `assets.md`.
### Ensuring bat is available for Syntax tests
The syntax test script (`tests/syntax-tests/update.sh`) calls `bat` from your PATH and regenerates the highlighted output files under
`tests/syntax-tests/highlighted/`. These files are used to verify that syntax highlighting works as expected.
- If you only built the binaries with:
```bash
cargo build --bins
```
you need to add the debug build to your PATH from the bat project root before running the tests.
See also step 5 in [Syntax
tests](https://github.com/sharkdp/bat/blob/master/doc/assets.md#syntax-tests) for related instructions.
```bash
export PATH="$PATH:$(pwd)/target/debug"
```
Otherwise, you will see:
```bash
Error: Could not execute 'bat'. Please make sure that the executable is available on the PATH.
```
- If you installed bat with:
```bash
cargo install --path . --locked
```
then bat will be available in ~/.cargo/bin (usually already in PATH), and the tests will run without issues.
Generated
+897 -457
View File
File diff suppressed because it is too large Load Diff
+42 -32
View File
@@ -6,20 +6,20 @@ homepage = "https://github.com/sharkdp/bat"
license = "MIT OR Apache-2.0"
name = "bat"
repository = "https://github.com/sharkdp/bat"
version = "0.25.0"
version = "0.26.1"
exclude = ["assets/syntaxes/*", "assets/themes/*"]
build = "build/main.rs"
edition = '2021'
rust-version = "1.74"
# You are free to bump MSRV as soon as a reason for bumping emerges.
rust-version = "1.88"
[features]
default = ["application"]
default = ["application", "git"]
# Feature required for bat the application. Should be disabled when depending on
# bat as a library.
application = [
"bugreport",
"build-assets",
"git",
"minimal-application",
]
# Mainly for developers that want to iterate quickly
@@ -32,7 +32,8 @@ minimal-application = [
"wild",
]
git = ["git2"] # Support indicating git modifications
paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
vendored-libgit2 = ["git2/vendored-libgit2"]
paging = [ "shell-words", "grep-cli", "minus"] # Support applying a pager on the output
lessopen = ["execute"] # Support $LESSOPEN preprocessor
build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"]
@@ -41,17 +42,21 @@ regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
[dependencies]
nu-ansi-term = "0.50.0"
nu-ansi-term = "0.50.3"
ansi_colours = "^1.2"
bincode = "1.0"
console = "0.15.10"
flate2 = "1.0"
console = "0.16.2"
flate2 = "1.1"
once_cell = "1.20"
thiserror = "1.0"
thiserror = "2.0"
wild = { version = "2.2", optional = true }
content_inspector = "0.2.4"
shell-words = { version = "1.1.0", optional = true }
unicode-width = "0.1.13"
shell-words = { version = "1.1.1", optional = true }
minus = { version = "5.6", optional = true, features = [
"dynamic_output",
"search",
] }
unicode-width = "0.2.1"
globset = "0.4"
serde = "1.0"
serde_derive = "1.0"
@@ -60,60 +65,65 @@ semver = "1.0"
path_abs = { version = "0.5", default-features = false }
clircle = { version = "0.6.1", default-features = false }
bugreport = { version = "0.5.0", optional = true }
etcetera = { version = "0.8.0", optional = true }
grep-cli = { version = "0.1.11", optional = true }
regex = { version = "1.10.6", optional = true }
etcetera = { version = "0.11.0", optional = true }
grep-cli = { version = "0.1.12", optional = true }
regex = { version = "1.12.2", optional = true }
walkdir = { version = "2.5", optional = true }
bytesize = { version = "1.3.0" }
bytesize = { version = "2.3.1" }
encoding_rs = "0.8.35"
execute = { version = "0.2.13", optional = true }
terminal-colorsaurus = "0.4"
execute = { version = "0.2.15", optional = true }
terminal-colorsaurus = "1.0"
unicode-segmentation = "1.12.0"
itertools = "0.14.0"
[dependencies.git2]
version = "0.19"
version = "0.20"
optional = true
default-features = false
[dependencies.syntect]
version = "5.2.0"
version = "5.3.0"
default-features = false
features = ["parsing"]
[dependencies.clap]
version = "4.4.12"
version = "4.5.60"
optional = true
features = ["wrap_help", "cargo"]
[target.'cfg(target_os = "macos")'.dependencies]
home = "0.5.9"
plist = "1.7.0"
[dev-dependencies]
assert_cmd = "2.0.12"
assert_cmd = "2.0.16"
expect-test = "1.5.0"
serial_test = { version = "2.0.0", default-features = false }
predicates = "3.1.3"
wait-timeout = "0.2.0"
tempfile = "3.8.1"
wait-timeout = "0.2.1"
tempfile = "3.23.0"
serde = { version = "1.0", features = ["derive"] }
[target.'cfg(unix)'.dev-dependencies]
nix = { version = "0.29", default-features = false, features = ["term"] }
nix = { version = "0.31", default-features = false, features = ["term"] }
[build-dependencies]
anyhow = "1.0.86"
indexmap = { version = "2.3.0", features = ["serde"] }
itertools = "0.13.0"
anyhow = "1.0.97"
indexmap = { version = "2.13.0", features = ["serde"] }
itertools = "0.14.0"
once_cell = "1.20"
regex = "1.10.6"
prettyplease = "0.2.37"
proc-macro2 = "1.0.106"
quote = "1.0.40"
regex = "1.12.2"
serde = "1.0"
serde_derive = "1.0"
serde_with = { version = "3.12.0", default-features = false, features = ["macros"] }
toml = { version = "0.8.19", features = ["preserve_order"] }
serde_with = { version = "3.17.0", default-features = false, features = ["macros"] }
syn = { version = "2.0.104", features = ["full"] }
toml = { version = "0.9.8", features = ["preserve_order"] }
walkdir = "2.5"
[build-dependencies.clap]
version = "4.4.12"
version = "4.5.60"
optional = true
features = ["wrap_help", "cargo"]
+142 -94
View File
@@ -22,25 +22,16 @@
### Sponsors
A special *thank you* goes to our biggest <a href="doc/sponsors.md">sponsors</a>:<br>
<a href="https://workos.com/?utm_campaign=github_repo&utm_medium=referral&utm_content=bat&utm_source=github">
<img src="doc/sponsors/workos-logo-white-bg.svg" width="200" alt="WorkOS">
<br>
<strong>Your app, enterprise-ready.</strong>
<br>
<sub>Start selling to enterprise customers with just a few lines of code.</sub>
<br>
<sup>Add Single Sign-On (and more) in minutes instead of months.</sup>
</a>
<a href="https://www.warp.dev/?utm_source=github&utm_medium=referral&utm_campaign=bat_20231001">
<p>
<a href="https://www.warp.dev/bat">
<img src="doc/sponsors/warp-logo.png" width="200" alt="Warp">
<br>
<strong>Warp, the intelligent terminal</strong>
<br>
<sub>Run commands like a power user with AI and your dev teams</sub>
<br>
<sup>knowledge in one fast, intuitive terminal. For MacOS or Linux.</sup>
<sub>Available on MacOS, Linux, Windows</sub>
</a>
</p>
### Syntax highlighting
@@ -52,7 +43,7 @@ languages:
### Git integration
`bat` communicates with `git` to show modifications with respect to the index
(see left side bar):
(see left sidebar):
![Git integration example](https://i.imgur.com/2lSW4RE.png)
@@ -79,13 +70,13 @@ Whenever `bat` detects a non-interactive terminal (i.e. when you pipe into anoth
Display a single file on the terminal
```bash
> bat README.md
bat README.md
```
Display multiple files at once
```bash
> bat src/*.rs
bat src/*.rs
```
Read from stdin, determine the syntax automatically (note, highlighting will
@@ -93,18 +84,18 @@ only work if the syntax can be determined from the first line of the file,
usually through a shebang such as `#!/bin/sh`)
```bash
> curl -s https://sh.rustup.rs | bat
curl -s https://sh.rustup.rs | bat
```
Read from stdin, specify the language explicitly
```bash
> yaml2json .travis.yml | json_pp | bat -l json
yaml2json .travis.yml | json_pp | bat -l json
```
Show and highlight non-printable characters:
```bash
> bat -A /etc/hosts
bat -A /etc/hosts
```
Use it as a `cat` replacement:
@@ -124,7 +115,7 @@ bat f - g # output 'f', then stdin, then 'g'.
#### `fzf`
You can use `bat` as a previewer for [`fzf`](https://github.com/junegunn/fzf). To do this,
use `bat`s `--color=always` option to force colorized output. You can also use `--line-range`
use `bat`'s `--color=always` option to force colorized output. You can also use `--line-range`
option to restrict the load times for long files:
```bash
@@ -181,7 +172,7 @@ You can combine `bat` with `git diff` to view lines around code changes with pro
highlighting:
```bash
batdiff() {
git diff --name-only --relative --diff-filter=d | xargs bat --diff
git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff
}
```
If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras).
@@ -204,24 +195,25 @@ bat main.cpp | xclip
`MANPAGER` environment variable:
```bash
export MANPAGER="sh -c 'sed -u -e \"s/\\x1B\[[0-9;]*m//g; s/.\\x08//g\" | bat -p -lman'"
export MANPAGER="bat -plman"
man 2 select
```
(replace `bat` with `batcat` if you are on Debian or Ubuntu)
(on some older Debian or Ubuntu releases, the executable is named `batcat` instead of `bat`)
If you prefer to have this bundled in a new command, you can also use [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md).
> [!WARNING]
> This will [not work](https://github.com/sharkdp/bat/issues/1145) out of the box with Mandoc's `man` implementation.
>
> Please either use `batman`, or convert the shell script to a [shebang executable](https://en.wikipedia.org/wiki/Shebang_(Unix)) and point `MANPAGER` to that.
Note that the [Manpage syntax](assets/syntaxes/02_Extra/Manpage.sublime-syntax) is developed in this repository and still needs some work.
#### `prettier` / `shfmt` / `rustfmt`
The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) script is a wrapper that will format code and print it with `bat`.
#### `Warp`
<a href="https://app.warp.dev/drive/folder/-Bat-Warp-Pack-lxhe7HrEwgwpG17mvrFSz1">
<img src="doc/sponsors/warp-pack-header.png" alt="Warp">
</a>
#### Highlighting `--help` messages
You can use `bat` to colorize help text: `$ cp --help | bat -plhelp`
@@ -245,15 +237,40 @@ alias -g -- -h='-h 2>&1 | bat --language=help --style=plain'
alias -g -- --help='--help 2>&1 | bat --language=help --style=plain'
```
For `fish`, you can use abbreviations:
```fish
abbr -a --position anywhere -- --help '--help | bat -plhelp'
abbr -a --position anywhere -- -h '-h | bat -plhelp'
```
This way, you can keep on using `cp --help`, but get colorized help pages.
Be aware that in some cases, `-h` may not be a shorthand of `--help` (for example with `ls`).
> [!TIP]
> To remove these abbreviations later, run:
> ```fish
> abbr -e -- --help
> abbr -e -- -h
> ```
> The `--` before the abbreviation name is required because `--help` and `-h` start with dashes, which would otherwise be interpreted as flags to `abbr` itself.
Be aware that in some cases, `-h` may not be a shorthand of `--help` (for example with `ls`). In cases where you need to use `-h`
as a command argument you can prepend `\` to the argument (eg. `ls \-h`) to escape the aliasing defined above.
Please report any issues with the help syntax in [this repository](https://github.com/victor-gp/cmd-help-sublime-syntax).
## Installation
<!--
Installation instructions need to:
* be for widely used systems
* be non-obvious
* be from somewhat official sources
-->
[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg?columns=3&exclude_unsupported=1)](https://repology.org/project/bat-cat/versions)
### On Ubuntu (using `apt`)
@@ -267,13 +284,18 @@ If your Ubuntu/Debian installation is new enough you can simply run:
sudo apt install bat
```
**Important**: If you install `bat` this way, please note that the executable may be installed as `batcat` instead of `bat` (due to [a name
clash with another package](https://github.com/sharkdp/bat/issues/982)). You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions:
**Important**: On some older Ubuntu/Debian releases, the executable is installed as `batcat` instead of `bat` (due to [a name
clash with another package](https://github.com/sharkdp/bat/issues/982)). On newer releases, the executable is available as `bat`. If `bat --version` does not work after installation, try `batcat --version` instead. You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions:
``` bash
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
```
an example alias for `batcat` as `bat`:
```bash
alias bat="batcat"
```
### On Ubuntu (using most recent `.deb` packages)
*... and other Debian-based Linux distributions.*
@@ -311,14 +333,6 @@ You can install [the `bat` package](https://koji.fedoraproject.org/koji/packagei
dnf install bat
```
### On Funtoo Linux
You can install [the `bat` package](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat) from dev-kit.
```bash
emerge sys-apps/bat
```
### On Gentoo Linux
You can install [the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat)
@@ -328,20 +342,6 @@ from the official sources:
emerge sys-apps/bat
```
### On Void Linux
You can install `bat` via xbps-install:
```bash
xbps-install -S bat
```
### On Termux
You can install `bat` via pkg:
```bash
pkg install bat
```
### On FreeBSD
You can install a precompiled [`bat` package](https://www.freshports.org/textproc/bat) with pkg:
@@ -373,14 +373,6 @@ You can install `bat` using the [nix package manager](https://nixos.org/nix):
nix-env -i bat
```
### Via flox
You can install `bat` using [Flox](https://flox.dev)
```bash
flox install bat
```
### On openSUSE
You can install `bat` with zypper:
@@ -417,7 +409,7 @@ take a look at the ["Using `bat` on Windows"](#using-bat-on-windows) section.
#### Prerequisites
You will need to install the [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) package.
You will need to install the [Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist#latest-microsoft-visual-c-redistributable-version)
#### With WinGet
@@ -455,17 +447,28 @@ binaries are also available: look for archives with `musl` in the file name.
### From source
If you want to build `bat` from source, you need Rust 1.74.0 or
If you want to build `bat` from source, you need Rust 1.79.0 or
higher. You can then use `cargo` to build everything:
#### From local source
```bash
cargo install --path . --locked
```
> [!NOTE]
> The `--path .` above specifies the directory of the source code and NOT where `bat` will be installed.
> For more information see the docs for [`cargo install`](https://doc.rust-lang.org/cargo/commands/cargo-install.html).
#### From `crates.io`
```bash
cargo install --locked bat
```
Note that additional files like the man page or shell completion
files can not be installed in this way. They will be generated by `cargo` and should be available in the cargo target folder (under `build`).
files can not be installed automatically in both these ways.
If installing from a local source, they will be generated by `cargo`
and should be available in the cargo target folder under `build`.
Shell completions are also available by running:
Furthermore, shell completions are also available by running:
```bash
bat --completion <shell>
# see --help for supported shells
@@ -476,11 +479,12 @@ bat --completion <shell>
### Highlighting theme
Use `bat --list-themes` to get a list of all available themes for syntax
highlighting. To select the `TwoDark` theme, call `bat` with the
`--theme=TwoDark` option or set the `BAT_THEME` environment variable to
highlighting. By default, `bat` uses `Monokai Extended` or `Monokai Extended Light`
for dark and light themes respectively. To select the `TwoDark` theme, call `bat`
with the `--theme=TwoDark` option or set the `BAT_THEME` environment variable to
`TwoDark`. Use `export BAT_THEME="TwoDark"` in your shell's startup file to
make the change permanent. Alternatively, use `bat`s
[configuration file](https://github.com/sharkdp/bat#configuration-file).
make the change permanent. Alternatively, use `bat`'s
[configuration file](#configuration-file).
If you want to preview the different themes on a custom file, you can use
the following command (you need [`fzf`](https://github.com/junegunn/fzf) for this):
@@ -489,11 +493,11 @@ bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
```
`bat` automatically picks a fitting theme depending on your terminal's background color.
You can use the `--theme-light` / `--theme-light` options or the `BAT_THEME_DARK` / `BAT_THEME_LIGHT` environment variables
You can use the `--theme-dark` / `--theme-light` options or the `BAT_THEME_DARK` / `BAT_THEME_LIGHT` environment variables
to customize the themes used. This is especially useful if you frequently switch between dark and light mode.
You can also use a custom theme by following the
['Adding new themes' section below](https://github.com/sharkdp/bat#adding-new-themes).
['Adding new themes' section below](#adding-new-themes).
### 8-bit themes
@@ -502,12 +506,12 @@ even when truecolor support is available:
- `ansi` looks decent on any terminal. It uses 3-bit colors: black, red, green,
yellow, blue, magenta, cyan, and white.
- `base16` is designed for [base16](https://github.com/chriskempson/base16) terminal themes. It uses
- `base16` is designed for [base16](https://github.com/tinted-theming/home) terminal themes. It uses
4-bit colors (3-bit colors plus bright variants) in accordance with the
[base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md).
- `base16-256` is designed for [base16-shell](https://github.com/chriskempson/base16-shell).
[base16 styling guidelines](https://github.com/tinted-theming/home/blob/main/styling.md).
- `base16-256` is designed for [tinted-shell](https://github.com/tinted-theming/tinted-shell).
It replaces certain bright colors with 8-bit colors from 16 to 21. **Do not** use this simply
because you have a 256-color terminal but are not using base16-shell.
because you have a 256-color terminal but are not using tinted-shell.
Although these themes are more restricted, they have three advantages over truecolor themes. They:
@@ -517,11 +521,11 @@ Although these themes are more restricted, they have three advantages over truec
### Output style
You can use the `--style` option to control the appearance of `bat`s output.
You can use the `--style` option to control the appearance of `bat`'s output.
You can use `--style=numbers,changes`, for example, to show only Git changes
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
[configuration file](https://github.com/sharkdp/bat#configuration-file).
variable to make these changes permanent or use `bat`'s
[configuration file](#configuration-file).
>[!tip]
> If you specify a default style in `bat`'s config file, you can change which components
@@ -533,6 +537,12 @@ variable to make these changes permanent or use `bat`s
> Or, if you want to override the styles completely, you use `--style=numbers` to
> only show the line numbers.
### Decorations
By default, `bat` only shows decorations (such as line numbers, file headers, grid borders, etc.) when outputting to an interactive terminal. You can control this behavior with the `--decorations` option. Use `--decorations=always` to show decorations even when piping output to another command, or `--decorations=never` to disable them entirely. Possible values are `auto` (default), `never`, and `always`.
There is also the `--force-colorization` option, which is an alias for `--decorations=always --color=always`. This is useful if you want to keep colorization and decorations when piping `bat`'s output to another program.
### Adding new syntaxes / language definitions
Should you find that a particular syntax is not available within `bat`, you can follow these
@@ -578,6 +588,9 @@ syntax:
### Adding new themes
This works very similar to how we add new syntax definitions.
> [!NOTE]
> Custom themes must be stored in [`.tmTheme` files](https://www.sublimetext.com/docs/color_schemes_tmtheme.html).
> Newer `.sublime-color-scheme` files are currently not supported.
First, create a folder with the new syntax highlighting themes:
```bash
@@ -592,6 +605,8 @@ bat cache --build
```
Finally, use `bat --list-themes` to check if the new themes are available.
> [!NOTE]
> `bat` uses the name of the `.tmTheme` file for the theme's name.
### Adding or changing file type associations
@@ -624,9 +639,11 @@ syntax, use (this mapping is already built in):
### Using a different pager
`bat` uses the pager that is specified in the `PAGER` environment variable. If this variable is not
set, `less` is used by default. If you want to use a different pager, you can either modify the
`PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in
`PAGER`.
set, `less` is used by default. You can also use bat's built-in pager with `--pager=builtin` or
by setting the `BAT_PAGER` environment variable to "builtin".
If you want to use a different pager, you can either modify the `PAGER` variable or set the
`BAT_PAGER` environment variable to override what is specified in `PAGER`.
>[!NOTE]
> If `PAGER` is `more` or `most`, `bat` will silently use `less` instead to ensure support for colors.
@@ -635,17 +652,17 @@ If you want to pass command-line arguments to the pager, you can also set them v
`PAGER`/`BAT_PAGER` variables:
```bash
export BAT_PAGER="less -RF"
export BAT_PAGER="less -RFK"
```
Instead of using environment variables, you can also use `bat`s [configuration file](https://github.com/sharkdp/bat#configuration-file) to configure the pager (`--pager` option).
Instead of using environment variables, you can also use `bat`'s [configuration file](#configuration-file) to configure the pager (`--pager` option).
### Using `less` as a pager
When using `less` as a pager, `bat` will automatically pass extra options along to `less`
to improve the experience. Specifically, `-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen`,
and under certain conditions, `-X`/`--no-init` and/or `-S`/`--chop-long-lines`.
`-K`/`--quit-on-intr` and under certain conditions, `-X`/`--no-init` and/or `-S`/`--chop-long-lines`.
>[!IMPORTANT]
> These options will not be added if:
@@ -657,19 +674,22 @@ and under certain conditions, `-X`/`--no-init` and/or `-S`/`--chop-long-lines`.
> - The `--paging=always` argument is used.
> - The `BAT_PAGING` environment is set to `always`.
The `-R` option is needed to interpret ANSI colors correctly.
The `-R`/`--RAW-CONTROL-CHARS` option is needed to interpret ANSI colors correctly.
The `-F` option instructs `less` to exit immediately if the output size is smaller than
The `-F`/`--quit-if-one-screen` option instructs `less` to exit immediately if the output size is smaller than
the vertical size of the terminal. This is convenient for small files because you do not
have to press `q` to quit the pager.
The `-X` option is needed to fix a bug with the `--quit-if-one-screen` feature in versions
of `less` older than version 530. Unfortunately, it also breaks mouse-wheel support in `less`.
The `-K`/`--quit-on-intr` option instructs `less` to exit immediately when an interrupt signal is received.
This is useful to ensure that `less` quits together with `bat` on SIGINT.
The `-X`/`--no-init` option is added to versions of `less` older than version 530 (older than 558 on Windows) to
fix a bug with the `-F`/`--quit-if-one-screen` feature. Unfortunately, it also breaks mouse-wheel support in `less`.
If you want to enable mouse-wheel scrolling on older versions of `less` and do not mind losing
the quit-if-one-screen feature, you can set the pager (via `--pager` or `BAT_PAGER`) to `less -R`.
For `less` 530 or newer, it should work out of the box.
The `-S` option is added when `bat`'s `-S`/`--chop-long-lines` option is used. This tells `less`
The `-S`/`--chop-long-lines` option is added when `bat`'s `-S`/`--chop-long-lines` option is used. This tells `less`
to truncate any lines larger than the terminal width.
### Indentation
@@ -684,12 +704,40 @@ sidebar. Calling `bat` with `--tabs=0` will override it and let tabs be consumed
### Dark mode
If you make use of the dark mode feature in macOS, you might want to configure `bat` to use a different
If you make use of the dark mode feature in **macOS**, you might want to configure `bat` to use a different
theme based on the OS theme. The following snippet uses the `default` theme when in the _dark mode_
and the `GitHub` theme when in the _light mode_.
```bash
alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
alias cat="bat --theme auto:system --theme-dark default --theme-light GitHub"
```
The same dark mode feature is now available in **GNOME** and affects the `org.gnome.desktop.interface color-scheme` setting. The following code converts the above to use said setting.
```bash
# .bashrc
sys_color_scheme_is_dark() {
condition=$(gsettings get org.gnome.desktop.interface color-scheme)
condition=$(echo "$condition" | tr -d "[:space:]'")
if [ $condition == "prefer-dark" ]; then
return 0
else
return 1
fi
}
bat_alias_wrapper() {
#get color scheme
sys_color_scheme_is_dark
if [[ $? -eq 0 ]]; then
# bat command with dark color scheme
bat --theme=default "$@"
else
# bat command with light color scheme
bat --theme=GitHub "$@"
fi
}
alias cat='bat_alias_wrapper'
```
@@ -845,7 +893,7 @@ bash assets/create.sh
cargo install --path . --locked --force
```
If you want to build an application that uses `bat`s pretty-printing
If you want to build an application that uses `bat`'s pretty-printing
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.
@@ -863,7 +911,7 @@ Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide.
## Security vulnerabilities
Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`.
See [`SECURITY.md`](SECURITY.md).
## Project goals and alternatives
@@ -878,7 +926,7 @@ There are a lot of alternatives, if you are looking for similar programs. See
[this document](doc/alternatives.md) for a comparison.
## License
Copyright (c) 2018-2023 [bat-developers](https://github.com/sharkdp/bat).
Copyright (c) 2018-2025 [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.
+3
View File
@@ -0,0 +1,3 @@
# Security Vulnerabilities
To report a security vulnerability, please contact [David Peter](https://david-peter.de/) via email.
BIN
View File
Binary file not shown.
+172 -69
View File
@@ -5,6 +5,24 @@ using namespace System.Management.Automation.Language
Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -ScriptBlock {
param($wordToComplete, $commandAst, $cursorPosition)
$ArrayStyle = @('default', 'auto', 'full', 'plain', 'changes', 'header', 'header-filename', 'header-filesize', 'grid', 'rule', 'numbers', 'snip')
$ArrayCompletion = @('bash', 'fish', 'zsh', 'ps1')
$ArrayWhen = @('auto', 'never', 'always')
$ArrayYesNo = @('never', 'always')
$ArrayWrap = @('always', 'never', 'character', 'word')
$ArrayBinary = @('no-printing', 'as-text')
$ArrayPrint = @('unicode', 'caret')
function Get-MyThemes(){
$themes = {{PROJECT_EXECUTABLE}} --list-themes | ForEach-Object {$_ -replace "^(.*)$", '''$1'''} | select-object
return $themes
}
function Get-MyLanguages(){
$themes = {{PROJECT_EXECUTABLE}} --list-languages | ForEach-Object{[pscustomobject]@{MyParameter=$_.Substring(0,$_.IndexOf(":")).Trim();MyDescription=$_.Substring($_.IndexOf(":")+1)}} | select-object
return $themes
}
$commandElements = $commandAst.CommandElements
$command = @(
'{{PROJECT_EXECUTABLE}}'
@@ -12,86 +30,171 @@ Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -Script
$element = $commandElements[$i]
if ($element -isnot [StringConstantExpressionAst] -or
$element.StringConstantType -ne [StringConstantType]::BareWord -or
$element.Value.StartsWith('-')) {
#$element.Value.StartsWith('-') -or
$element.Value -eq $wordToComplete) {
break
}
$element.Value
}) -join ';'
$completions = @(switch ($command) {
'{{PROJECT_EXECUTABLE}}' {
[CompletionResult]::new('-l', 'l', [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.')
[CompletionResult]::new('--language', 'language', [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.')
[CompletionResult]::new('-H', 'H', [CompletionResultType]::ParameterName, 'Highlight lines N through M.')
[CompletionResult]::new('--highlight-line', 'highlight-line', [CompletionResultType]::ParameterName, 'Highlight lines N through M.')
[CompletionResult]::new('--file-name', 'file-name', [CompletionResultType]::ParameterName, 'Specify the name to display for a file.')
[CompletionResult]::new('--diff-context', 'diff-context', [CompletionResultType]::ParameterName, 'diff-context')
[CompletionResult]::new('--tabs', 'tabs', [CompletionResultType]::ParameterName, 'Set the tab width to T spaces.')
[CompletionResult]::new('--wrap', 'wrap', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (*auto*, never, character).')
[CompletionResult]::new('--terminal-width', 'terminal-width', [CompletionResultType]::ParameterName, 'Explicitly set the width of the terminal instead of determining it automatically. If prefixed with ''+'' or ''-'', the value will be treated as an offset to the actual terminal width. See also: ''--wrap''.')
[CompletionResult]::new('--color', 'color', [CompletionResultType]::ParameterName, 'When to use colors (*auto*, never, always).')
[CompletionResult]::new('--italic-text', 'italic-text', [CompletionResultType]::ParameterName, 'Use italics in output (always, *never*)')
[CompletionResult]::new('--decorations', 'decorations', [CompletionResultType]::ParameterName, 'When to show the decorations (*auto*, never, always).')
[CompletionResult]::new('--paging', 'paging', [CompletionResultType]::ParameterName, 'Specify when to use the pager, or use `-P` to disable (*auto*, never, always).')
[CompletionResult]::new('--pager', 'pager', [CompletionResultType]::ParameterName, 'Determine which pager to use.')
[CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
[CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
[CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
[CompletionResult]::new('--theme-dark', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting for dark backgrounds.')
[CompletionResult]::new('--theme-light', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting for light backgrounds.')
[CompletionResult]::new('--style', 'style', [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).')
[CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
[CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
[CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
[CompletionResult]::new('--show-all', 'show-all', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
[CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').')
[CompletionResult]::new('--plain', 'plain', [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').')
[CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.')
[CompletionResult]::new('--diff', 'diff', [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.')
[CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').')
[CompletionResult]::new('--number', 'number', [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').')
[CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'f')
[CompletionResult]::new('--force-colorization', 'force-colorization', [CompletionResultType]::ParameterName, 'force-colorization')
[CompletionResult]::new('-P', 'P', [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''')
[CompletionResult]::new('--no-paging', 'no-paging', [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''')
[CompletionResult]::new('--list-themes', 'list-themes', [CompletionResultType]::ParameterName, 'Display all supported highlighting themes.')
[CompletionResult]::new('-L', 'L', [CompletionResultType]::ParameterName, 'Display all supported languages.')
[CompletionResult]::new('--list-languages', 'list-languages', [CompletionResultType]::ParameterName, 'Display all supported languages.')
[CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'u')
[CompletionResult]::new('--unbuffered', 'unbuffered', [CompletionResultType]::ParameterName, 'unbuffered')
[CompletionResult]::new('--no-config', 'no-config', [CompletionResultType]::ParameterName, 'Do not use the configuration file')
[CompletionResult]::new('--no-custom-assets', 'no-custom-assets', [CompletionResultType]::ParameterName, 'Do not load custom assets')
[CompletionResult]::new('--lessopen', 'lessopen', [CompletionResultType]::ParameterName, 'Enable the $LESSOPEN preprocessor')
[CompletionResult]::new('--no-lessopen', 'no-lessopen', [CompletionResultType]::ParameterName, 'Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)')
[CompletionResult]::new('--config-file', 'config-file', [CompletionResultType]::ParameterName, 'Show path to the configuration file.')
[CompletionResult]::new('--generate-config-file', 'generate-config-file', [CompletionResultType]::ParameterName, 'Generates a default configuration file.')
[CompletionResult]::new('--config-dir', 'config-dir', [CompletionResultType]::ParameterName, 'Show bat''s configuration directory.')
[CompletionResult]::new('--cache-dir', 'cache-dir', [CompletionResultType]::ParameterName, 'Show bat''s cache directory.')
[CompletionResult]::new('--diagnostic', 'diagnostic', [CompletionResultType]::ParameterName, 'Show diagnostic information for bug reports.')
[CompletionResult]::new('-h', 'h', [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('--version', 'version', [CompletionResultType]::ParameterName, 'Show version information.')
## Completion of the 'cache' command itself is removed for better UX
## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802
$completions = @(switch -Wildcard ($command) {
'*;--help' {
break
}
'*;--version' {
break
}
'*;--acknowledgements' {
break
}
'*;--language' {
Get-MyLanguages |
ForEach-Object {
$desc = if ($null -eq $_.MyDescription) { '_no value_' } else { $_.MyDescription }
[CompletionResult]::new(($_.MyParameter -replace "^(.*)$", '''$1'''), $_.MyParameter, [CompletionResultType]::ParameterName, $desc)
}
break
}
'*;--theme' {
Get-MyThemes |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterName, $_)}
break
}
'*;--binary' {
$ArrayBinary |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--style' {
$ArrayStyle |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--wrap' {
$ArrayWrap |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--color' {
$ArrayWhen |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--italic-text' {
$ArrayYesNo |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--paging' {
$ArrayWhen |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--decorations' {
$ArrayWhen |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--completion' {
$ArrayCompletion |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--strip-ansi' {
$ArrayWhen |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--nonprintable-notation' {
$ArrayPrint |
ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, [CompletionResultType]::ParameterValue, $_)}
break
}
'*;--generate-config-file' {
break
}
'{{PROJECT_EXECUTABLE}};cache' {
[CompletionResult]::new('--source', 'source', [CompletionResultType]::ParameterName, 'Use a different directory to load syntaxes and themes from.')
[CompletionResult]::new('--target', 'target', [CompletionResultType]::ParameterName, 'Use a different directory to store the cached syntax and theme set.')
[CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.')
[CompletionResult]::new('--build', 'build', [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.')
[CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.')
[CompletionResult]::new('--clear', 'clear', [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.')
[CompletionResult]::new('--blank', 'blank', [CompletionResultType]::ParameterName, 'Create completely new syntax and theme sets (instead of appending to the default sets).')
[CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information')
[CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information')
[CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information')
[CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information')
[CompletionResult]::new('--source' , 'source' , [CompletionResultType]::ParameterName, 'Use a different directory to load syntaxes and themes from.')
[CompletionResult]::new('--target' , 'target' , [CompletionResultType]::ParameterName, 'Use a different directory to store the cached syntax and theme set.')
# [CompletionResult]::new('-b' , 'b' , [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.')
[CompletionResult]::new('--build' , 'build' , [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.')
# [CompletionResult]::new('-c' , 'c' , [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.')
[CompletionResult]::new('--clear' , 'clear' , [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.')
[CompletionResult]::new('--blank' , 'blank' , [CompletionResultType]::ParameterName, 'Create completely new syntax and theme sets (instead of appending to the default sets).')
# [CompletionResult]::new('-h' , 'h' , [CompletionResultType]::ParameterName, 'Prints help information')
[CompletionResult]::new('--help' , 'help' , [CompletionResultType]::ParameterName, 'Prints help information')
# [CompletionResult]::new('-V' , 'V' , [CompletionResultType]::ParameterName, 'Prints version information')
# [CompletionResult]::new('--version' , 'version' , [CompletionResultType]::ParameterName, 'Prints version information')
break
}
default {
# [CompletionResult]::new('-l' , 'l' , [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.')
[CompletionResult]::new('--language' , 'language' , [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.')
# [CompletionResult]::new('-H' , 'H' , [CompletionResultType]::ParameterName, 'Highlight lines N through M.')
[CompletionResult]::new('--highlight-line' , 'highlight-line' , [CompletionResultType]::ParameterName, 'Highlight lines N through M.')
[CompletionResult]::new('--file-name' , 'file-name' , [CompletionResultType]::ParameterName, 'Specify the name to display for a file.')
[CompletionResult]::new('--diff-context' , 'diff-context' , [CompletionResultType]::ParameterName, 'diff-context')
[CompletionResult]::new('--tabs' , 'tabs' , [CompletionResultType]::ParameterName, 'Set the tab width to T spaces.')
[CompletionResult]::new('--wrap' , 'wrap' , [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (*auto*, never, character, word).')
[CompletionResult]::new('--terminal-width' , 'terminal-width' , [CompletionResultType]::ParameterName, 'Explicitly set the width of the terminal instead of determining it automatically. If prefixed with ''+'' or ''-'', the value will be treated as an offset to the actual terminal width. See also: ''--wrap''.')
[CompletionResult]::new('--color' , 'color' , [CompletionResultType]::ParameterName, 'When to use colors (*auto*, never, always).')
[CompletionResult]::new('--italic-text' , 'italic-text' , [CompletionResultType]::ParameterName, 'Use italics in output (always, *never*)')
[CompletionResult]::new('--decorations' , 'decorations' , [CompletionResultType]::ParameterName, 'When to show the decorations (*auto*, never, always).')
[CompletionResult]::new('--paging' , 'paging' , [CompletionResultType]::ParameterName, 'Specify when to use the pager, or use ''-P'' to disable (*auto*, never, always).')
[CompletionResult]::new('--pager' , 'pager' , [CompletionResultType]::ParameterName, 'Determine which pager to use.')
# [CompletionResult]::new('-m' , 'm' , [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
[CompletionResult]::new('--map-syntax' , 'map-syntax' , [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').')
[CompletionResult]::new('--theme' , 'theme' , [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.')
[CompletionResult]::new('--theme-dark' , 'themedark' , [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting for dark backgrounds.')
[CompletionResult]::new('--theme-light' , 'themelight' , [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting for light backgrounds.')
[CompletionResult]::new('--style' , 'style' , [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).')
# [CompletionResult]::new('-r' , 'r' , [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
[CompletionResult]::new('--line-range' , 'line-range' , [CompletionResultType]::ParameterName, 'Only print the lines from N to M.')
# [CompletionResult]::new('-A' , 'A' , [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
[CompletionResult]::new('--show-all' , 'show-all' , [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).')
[CompletionResult]::new('--nonprintable-notation' , 'nonprintable-notation' , [CompletionResultType]::ParameterName, 'Set notation for non-printable characters. (unicode, caret)')
[CompletionResult]::new('--chop-long-lines' , 'chop-long-lines' , [CompletionResultType]::ParameterName, 'Truncate all lines longer than screen width. Alias for ''--wrap=never''.')
[CompletionResult]::new('--binary' , 'binary' , [CompletionResultType]::ParameterName, 'How to treat binary content. (*no-printing*, as-text)')
[CompletionResult]::new('--ignored-suffix' , 'ignored-suffix' , [CompletionResultType]::ParameterName, 'Ignore extension. For example: ''bat --ignored-suffix ".dev" my_file.json.dev'' will use JSON syntax, and ignore ''.dev''')
[CompletionResult]::new('--squeeze-blank' , 'squeeze-blank' , [CompletionResultType]::ParameterName, 'Squeeze consecutive empty lines into a single empty line.')
[CompletionResult]::new('--squeeze-limit' , 'squeeze-limit' , [CompletionResultType]::ParameterName, 'Set the maximum number of consecutive empty lines to be printed.')
[CompletionResult]::new('--strip-ansi' , 'strip-ansi' , [CompletionResultType]::ParameterName, '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. (auto, always, *never*).')
# [CompletionResult]::new('-p' , 'p' , [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').')
[CompletionResult]::new('--plain' , 'plain' , [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').')
# [CompletionResult]::new('-d' , 'd' , [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.')
[CompletionResult]::new('--diff' , 'diff' , [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.')
# [CompletionResult]::new('-n' , 'n' , [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').')
[CompletionResult]::new('--number' , 'number' , [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').')
# [CompletionResult]::new('-f' , 'f' , [CompletionResultType]::ParameterName, 'f')
[CompletionResult]::new('--force-colorization' , 'force-colorization' , [CompletionResultType]::ParameterName, 'force-colorization')
# [CompletionResult]::new('-P' , 'P' , [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''')
[CompletionResult]::new('--no-paging' , 'no-paging' , [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''')
[CompletionResult]::new('--list-themes' , 'list-themes' , [CompletionResultType]::ParameterName, 'Display all supported highlighting themes.')
# [CompletionResult]::new('-L' , 'L' , [CompletionResultType]::ParameterName, 'Display all supported languages.')
[CompletionResult]::new('--list-languages' , 'list-languages' , [CompletionResultType]::ParameterName, 'Display all supported languages.')
# [CompletionResult]::new('-u' , 'u' , [CompletionResultType]::ParameterName, 'u')
[CompletionResult]::new('--unbuffered' , 'unbuffered' , [CompletionResultType]::ParameterName, 'Enable unbuffered input reading for streaming use cases')
[CompletionResult]::new('--completion' , 'completion' , [CompletionResultType]::ParameterName, 'Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]')
[CompletionResult]::new('--no-config' , 'no-config' , [CompletionResultType]::ParameterName, 'Do not use the configuration file')
[CompletionResult]::new('--no-custom-assets' , 'no-custom-assets' , [CompletionResultType]::ParameterName, 'Do not load custom assets')
[CompletionResult]::new('--lessopen' , 'lessopen' , [CompletionResultType]::ParameterName, 'Enable the $LESSOPEN preprocessor')
[CompletionResult]::new('--no-lessopen' , 'no-lessopen' , [CompletionResultType]::ParameterName, 'Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)')
[CompletionResult]::new('--config-file' , 'config-file' , [CompletionResultType]::ParameterName, 'Show path to the configuration file.')
[CompletionResult]::new('--generate-config-file' , 'generate-config-file' , [CompletionResultType]::ParameterName, 'Generates a default configuration file.')
[CompletionResult]::new('--config-dir' , 'config-dir' , [CompletionResultType]::ParameterName, 'Show bat''s configuration directory.')
[CompletionResult]::new('--cache-dir' , 'cache-dir' , [CompletionResultType]::ParameterName, 'Show bat''s cache directory.')
[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('--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('--help' , 'help' , [CompletionResultType]::ParameterName, 'Print this help message.')
# [CompletionResult]::new('-V' , 'V' , [CompletionResultType]::ParameterName, 'Show version information.')
[CompletionResult]::new('--version' , 'version' , [CompletionResultType]::ParameterName, 'Show version information.')
break
}
})
$completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
Sort-Object -Property ListItemText
Sort-Object -Property CompletionText
}
+56 -14
View File
@@ -14,18 +14,36 @@ __bat_escape_completions()
{
# Do not escape if completing a quoted value.
[[ $cur == [\"\']* ]] && return 0
# printf -v to an array index is available in bash >= 4.1.
# Use it if available, as -o filenames is semantically incorrect if
# we are not actually completing filenames, and it has side effects
# (e.g. adds trailing slash to candidates matching present dirs).
if ((
BASH_VERSINFO[0] > 5 || \
BASH_VERSINFO[0] == 5 && BASH_VERSINFO[1] >= 3
)); then
# bash >= 5.3 has "compopt -o fullquote", which exactly does
# what this function tries to do.
compopt -o fullquote
elif ((
BASH_VERSINFO[0] > 4 || \
BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] > 0
)); then
# printf -v to an array index is available in bash >= 4.1.
# Use it if available, as -o filenames is semantically
# incorrect if we are not actually completing filenames, and it
# has side effects (e.g. adds trailing slash to candidates
# matching present dirs).
local i
for i in ${!COMPREPLY[*]}; do
printf -v "COMPREPLY[i]" %q "${COMPREPLY[i]}"
done
# We can use "compopt -o noquote" available in bash >= 4.3 to
# prevent further quoting by the shell, which would be
# unexpectedly applied when a quoted result matches a filename.
if ((
BASH_VERSINFO[0] > 4 || \
BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 3
)); then
compopt -o noquote
fi
else
compopt -o filenames
fi
@@ -66,7 +84,7 @@ _bat() {
printf "%s\n" "$lang"
done
)" -- "$cur"))
__bat_escape_completions
__bat_escape_completions
return 0
;;
-H | --highlight-line | \
@@ -80,7 +98,9 @@ _bat() {
--line-range | \
-L | --list-languages | \
--lessopen | \
--no-paging | \
--diagnostic | \
--quiet-empty | \
--acknowledgements | \
-h | --help | \
-V | --version | \
@@ -97,7 +117,23 @@ _bat() {
return 0
;;
--wrap)
COMPREPLY=($(compgen -W "auto never character" -- "$cur"))
COMPREPLY=($(compgen -W "auto never character word" -- "$cur"))
return 0
;;
--binary)
COMPREPLY=($(compgen -W "no-printing as-text" -- "$cur"))
return 0
;;
--nonprintable-notation)
COMPREPLY=($(compgen -W "unicode caret" -- "$cur"))
return 0
;;
--strip-ansi)
COMPREPLY=($(compgen -W "auto never always" -- "$cur"))
return 0
;;
--completion)
COMPREPLY=($(compgen -W "bash fish zsh ps1" -- "$cur"))
return 0
;;
--color | --decorations | --paging)
@@ -113,16 +149,16 @@ _bat() {
return 0
;;
--theme)
local IFS=$'\n'
COMPREPLY=($(compgen -W "auto${IFS}auto:always${IFS}auto:system${IFS}dark${IFS}light${IFS}$("$1" --list-themes)" -- "$cur"))
__bat_escape_completions
return 0
;;
local IFS=$'\n'
COMPREPLY=($(compgen -W "auto${IFS}auto:always${IFS}auto:system${IFS}dark${IFS}light${IFS}$("$1" --list-themes)" -- "$cur"))
__bat_escape_completions
return 0
;;
--theme-dark | \
--theme-light)
local IFS=$'\n'
COMPREPLY=($(compgen -W "$("$1" --list-themes)" -- "$cur"))
__bat_escape_completions
__bat_escape_completions
return 0
;;
--style)
@@ -141,7 +177,7 @@ _bat() {
numbers
snip
)
# shellcheck disable=SC2016
# shellcheck disable=SC2016
if declare -F _comp_delimited >/dev/null 2>&1; then
# bash-completion > 2.11
_comp_delimited , -W '"${styles[@]}"'
@@ -154,9 +190,11 @@ _bat() {
$split && return 0
if [[ $cur == -* ]]; then
# --unbuffered excluded intentionally (no-op)
COMPREPLY=($(compgen -W "
--unbuffered
--show-all
--nonprintable-notation
--binary
--plain
--language
--highlight-line
@@ -173,6 +211,7 @@ _bat() {
--decorations
--force-colorization
--paging
--no-paging
--pager
--map-syntax
--ignored-suffix
@@ -182,11 +221,14 @@ _bat() {
--list-themes
--squeeze-blank
--squeeze-limit
--strip-ansi
--style
--line-range
--list-languages
--lessopen
--completion
--diagnostic
--quiet-empty
--acknowledgements
--set-terminal-title
--help
+28 -3
View File
@@ -61,7 +61,7 @@ function __bat_no_excl_args
-s V -l version \
-l acknowledgements \
-l config-dir -l config-file \
-l diagnostic \
-l diagnostic -l quiet-empty \
-l list-languages -l list-themes
end
@@ -106,6 +106,7 @@ set -l pager_opts '
less\ -FR\t
more\t
vimpager\t
builtin\t
'
set -l italic_text_opts '
@@ -117,6 +118,7 @@ set -l wrap_opts '
auto\tdefault
never\t
character\t
word\t
'
# While --tabs theoretically takes any number, most people should be OK with these.
@@ -141,10 +143,16 @@ set -l special_themes '
complete -c $bat -l acknowledgements -d "Print acknowledgements" -n __fish_is_first_arg
complete -c $bat -l binary -x -a "no-printing as-text" -d "How to treat binary content" -n __bat_no_excl_args
complete -c $bat -l cache-dir -f -d "Show bat's cache directory" -n __fish_is_first_arg
complete -c $bat -s c -l chop-long-lines -d "Truncate all lines longer than screen width" -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 completion -x -a "bash fish zsh ps1" -d "Show shell completion for a certain shell" -n __fish_is_first_arg
complete -c $bat -l config-dir -f -d "Display location of configuration directory" -n __fish_is_first_arg
complete -c $bat -l config-file -f -d "Display location of configuration file" -n __fish_is_first_arg
@@ -152,6 +160,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 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
@@ -191,20 +200,34 @@ complete -c $bat -l no-custom-assets -d "Do not load custom assets"
complete -c $bat -l no-lessopen -d "Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)"
complete -c $bat -l nonprintable-notation -x -a "unicode caret" -d "Set notation for non-printable characters" -n __bat_no_excl_args
complete -c $bat -s n -l number -d "Only show line numbers, no other decorations" -n __bat_no_excl_args
complete -c $bat -l no-paging -d "Alias for --paging=never" -n __bat_no_excl_args
complete -c $bat -l pager -x -a "$pager_opts" -d "Which pager to use" -n __bat_no_excl_args
complete -c $bat -l paging -x -a "$paging_opts" -d "When to use the pager" -n __bat_no_excl_args
complete -c $bat -s p -l plain -d "Show plain style" -n __bat_no_excl_args
complete -c $bat -l set-terminal-title -d "Sets terminal title to filenames when using a pager" -n __bat_no_excl_args
complete -c $bat -s A -l show-all -d "Show non-printable characters" -n __bat_no_excl_args
complete -c $bat -s s -l squeeze-blank -d "Squeeze consecutive empty lines into a single empty line" -n __bat_no_excl_args
complete -c $bat -l squeeze-limit -x -d "Set the maximum number of consecutive empty lines to be printed" -n __bat_no_excl_args
complete -c $bat -l strip-ansi -x -a "auto never always" -d "Specify when to strip ANSI escape sequences from the input" -n __bat_no_excl_args
complete -c $bat -s p -l plain -d "Disable decorations" -n __bat_no_excl_args
complete -c $bat -o pp -d "Disable decorations and paging" -n __bat_no_excl_args
complete -c $bat -s P -d "Disable paging" -n __bat_no_excl_args
complete -c $bat -s A -l show-all -d "Show non-printable characters" -n __bat_no_excl_args
complete -c $bat -l style -x -k -a "(__fish_complete_list , __bat_style_opts)" -d "Specify which non-content elements to display" -n __bat_no_excl_args
complete -c $bat -l tabs -x -a "$tabs_opts" -d "Set tab width" -n __bat_no_excl_args
@@ -217,6 +240,8 @@ complete -c $bat -l theme-dark -x -a "(command $bat --list-themes | command cat)
complete -c $bat -l theme-light -x -a "(command $bat --list-themes | command cat)" -d "Set the syntax highlighting theme for light backgrounds" -n __bat_no_excl_args
complete -c $bat -s u -l unbuffered -d "Enable unbuffered input reading for streaming use cases" -n __bat_no_excl_args
complete -c $bat -s V -l version -f -d "Show version information" -n __fish_is_first_arg
complete -c $bat -l wrap -x -a "$wrap_opts" -d "Text-wrapping mode" -n __bat_no_excl_args
+14 -1
View File
@@ -26,6 +26,7 @@ _{{PROJECT_EXECUTABLE}}_main() {
args=(
'(-A --show-all)'{-A,--show-all}'[show non-printable characters (space, tab, newline, ..)]'
--nonprintable-notation='[specify how to display non-printable characters when using --show-all]:notation:(caret unicode)'
--binary='[specify how to treat binary content]:behavior:(no-printing as-text)'
\*{-p,--plain}'[show plain style (alias for `--style=plain`), repeat twice to disable automatic paging (alias for `--paging=never`)]'
'(-l --language)'{-l+,--language=}'[set the language for syntax highlighting]:language:->languages'
\*{-H+,--highlight-line=}'[highlight specified block of lines]:start\:end'
@@ -33,23 +34,35 @@ _{{PROJECT_EXECUTABLE}}_main() {
'(-d --diff)'--diff'[only show lines that have been added/removed/modified]'
--diff-context='[specify lines of context around added/removed/modified lines when using `--diff`]:lines'
--tabs='[set the tab width]:tab width [4]'
--wrap='[specify the text-wrapping mode]:mode [auto]:(auto never character)'
--wrap='[specify the text-wrapping mode]:mode [auto]:(auto never character word)'
'!(--wrap)'{-S,--chop-long-lines}
--terminal-width='[explicitly set the width of the terminal instead of determining it automatically]:width'
'(-n --number --diff --diff-context)'{-n,--number}'[show line numbers]'
--color='[specify when to use colors]:when:(auto never always)'
--italic-text='[use italics in output]:when:(always never)'
--decorations='[specify when to show the decorations]:when:(auto never always)'
'(-f --force-colorization)'--force-colorization'[force colorization and decorations]'
--paging='[specify when to use the pager]:when:(auto never always)'
'(-P --no-paging)'--no-paging'[alias for --paging=never]'
--pager='[determine which pager to use]:command:'
'(-m --map-syntax)'{-m+,--map-syntax=}'[map a glob pattern to an existing syntax name]: :->syntax-maps'
--ignored-suffix='[ignore extension]:suffix:'
'(--theme)'--theme='[set the color theme for syntax highlighting]:theme:->theme_preferences'
'(--theme-dark)'--theme-dark='[set the color theme for syntax highlighting for dark backgrounds]:theme:->themes'
'(--theme-light)'--theme-light='[set the color theme for syntax highlighting for light backgrounds]:theme:->themes'
'(: --list-themes --list-languages -L)'--list-themes'[show all supported highlighting themes]'
--squeeze-blank'[squeeze consecutive empty lines into a single empty line]'
--squeeze-limit='[set the maximum number of consecutive empty lines]:limit:'
--strip-ansi='[specify when to strip ANSI escape sequences]:when:(auto never always)'
--style='[comma-separated list of style elements to display]: : _values "style [default]"
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'
'(* -)'{-L,--list-languages}'[display all supported languages]'
'(-u --unbuffered)'--unbuffered'[enable unbuffered input reading for streaming use cases]'
--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]'
--diagnostic'[show diagnostic information for bug reports]'
--quiet-empty'[do not produce any output when the input is empty]'
-P'[disable paging]'
"--no-config[don't use the configuration file]"
"--no-custom-assets[don't load custom assets]"
+56 -12
View File
@@ -14,7 +14,8 @@ It also communicates with git(1) to show modifications with respect to the git i
Whenever the output of {{PROJECT_EXECUTABLE}} goes to a non-interactive terminal, i.e. when the
output is piped into another process or into a file, {{PROJECT_EXECUTABLE}} will act as a drop-in
replacement for cat(1) and fall back to printing the plain file contents.
replacement for cat(1) and fall back to printing the plain file contents,
unless an explicit style is requested.
.SH "OPTIONS"
General remarks: Command-line options like '-l'/'--language' that take values can be specified as
@@ -37,6 +38,23 @@ Use character sequences like ^G, ^J, ^@, .. to identify non-printable characters
Use special Unicode code points to identify non-printable characters
.RE
.HP
\fB\-\-binary\fR <behavior>
.IP
How to treat binary content.
Possible values:
.RS
.IP "no\-printing"
Do not print any binary content (default)
.IP "as\-text"
Treat binary content as normal text
.RE
.HP
\fB\-\-completion\fR <SHELL>
.IP
Show shell completion for a certain shell.
Possible values: bash, fish, zsh, ps1
.HP
\fB\-p\fR, \fB\-\-plain\fR
.IP
Only show plain style, no decorations. This is an alias for
@@ -84,8 +102,10 @@ Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
.HP
\fB\-\-wrap\fR <mode>
.IP
Specify the text\-wrapping mode (*auto*, never, character). The '\-\-terminal\-width' option
can be used in addition to control the output width.
Specify the text\-wrapping mode (*auto*, never, character, word). The '\-\-terminal\-width' option
can be used in addition to control the output width. In \fBword\fR mode, lines are broken at
whitespace boundaries. If a single word exceeds the terminal width, it falls back to
character wrapping.
.HP
\fB\-S\fR, \fB\-\-chop\-long\-lines\fR
.IP
@@ -114,7 +134,8 @@ always, *never*.
\fB\-\-decorations\fR <when>
.IP
Specify when to use the decorations that have been specified via '\-\-style'. The
automatic mode only enables decorations if an interactive terminal is detected. Possible
automatic mode only enables decorations if an interactive terminal is detected. The
always mode will show decorations even when piping output. Possible
values: *auto*, never, always.
.HP
\fB\-f\fR, \fB\-\-force\-colorization\fR
@@ -132,8 +153,9 @@ which pager is used, see the '\-\-pager' option. Possible values: *auto*, never,
\fB\-\-pager\fR <command>
.IP
Determine which pager is used. This option will override the PAGER and BAT_PAGER
environment variables. The default pager is 'less'. To control when the pager is used, see
the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'.
environment variables. The default pager is 'less'. If you provide '\-\-pager=builtin', use
the built-in 'minus' pager. To control when the pager is used, see the '\-\-paging' option.
Example: '\-\-pager "less \fB\-RF\fR"'.
Note: By default, if the pager is set to 'less' (and no command-line options are specified), 'bat' will pass the following command line options to the pager: '-R'/'--RAW-CONTROL-CHARS', '-F'/'--quit-if-one-screen' and '-X'/'--no-init'. The last option ('-X') is only used for 'less' versions older than 530. The '-R' option is needed to interpret ANSI colors correctly. The second option ('-F') instructs less to exit immediately if the output size is smaller than the vertical size of the terminal. This is convenient for small files because you do not have to press 'q' to quit the pager. The third option ('-X') is needed to fix a bug with the '--quit-if-one-screen' feature in old versions of 'less'. Unfortunately, it also breaks mouse-wheel support in 'less'. If you want to enable mouse-wheel scrolling on older versions of 'less', you can pass just '-R' (as in the example above, this will disable the quit-if-one-screen feature). For less 530 or newer, it should work out of the box.
.HP
@@ -180,8 +202,8 @@ This option only has an effect when \fB\-\-theme\fP option is set to \fBauto\fR
.HP
\fB\-\-theme\-light\fR <theme>
.IP
Sets the theme name for syntax highlighting used when the terminal uses a dark background.
To set a default theme, add the \fB\-\-theme-dark="..."\fP option to the configuration file or
Sets the theme name for syntax highlighting used when the terminal uses a light background.
To set a default theme, add the \fB\-\-theme-light="..."\fP option to the configuration file or
export the \fBBAT_THEME_LIGHT\fP environment variable (e.g. \fBexport BAT_THEME_LIGHT="..."\fP).
This option only has an effect when \fB\-\-theme\fP option is set to \fBauto\fR or \fBlight\fR.
.HP
@@ -197,14 +219,30 @@ Squeeze consecutive empty lines into a single empty line.
.IP
Set the maximum number of consecutive empty lines to be printed.
.HP
\fB\-\-strip\-ansi\fR <when>
.IP
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*.
.HP
\fB\-\-style\fR <style\-components>
.IP
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 components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
To set a default style, add the '\-\-style=".."' option to the configuration file or
export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
values: *default*, full, auto, plain, changes, header, header-filename, header-filesize, grid,
export the BAT_STYLE environment variable (e.g.: export BAT_STYLE="..").
.IP
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.
.IP
By default, the following components are enabled:
changes, grid, header\-filename, numbers, snip
.IP
Possible values: *default*, full, auto, plain, changes, header, header-filename, header-filesize, grid,
rule, numbers, snip.
.HP
\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
@@ -227,8 +265,10 @@ Display a list of supported languages for syntax highlighting.
.HP
\fB\-u\fR, \fB\-\-unbuffered\fR
.IP
This option exists for POSIX\-compliance reasons ('u' is for 'unbuffered'). The output is
always unbuffered \- this option is simply ignored.
Enable unbuffered input reading. When this flag is set, bat will display data as soon as it
is available, without waiting for a complete line. This is useful for streaming use cases like
\&'tail \-f logfile | bat \-u \-\-paging=never'. Note that line numbers are automatically disabled
in unbuffered mode, and syntax highlighting may be imperfect on partial lines.
.HP
\fB\-\-no\-custom\-assets\fR
.IP
@@ -246,6 +286,10 @@ Show bat's cache directory.
.IP
Show diagnostic information for bug reports.
.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
.IP
Show acknowledgements.
+17 -2
View File
@@ -166,7 +166,7 @@ index 19dc685d..3a45ea05 100644
- match: ^\s*$\n?
scope: invalid.illegal.non-terminated.bold-italic.markdown
pop: true
@@ -1073,6 +1031,21 @@ contexts:
@@ -1073,6 +1031,36 @@ contexts:
escape: '{{code_fence_escape}}'
escape_captures:
0: meta.code-fence.definition.end.python.markdown-gfm
@@ -185,10 +185,25 @@ index 19dc685d..3a45ea05 100644
+ escape: '{{code_fence_escape}}'
+ escape_captures:
+ 0: meta.code-fence.definition.end.puppet.markdown-gfm
+ 1: punctuation.definition.raw.code-fence.end.markdown
+ - match: |-
+ (?x)
+ {{fenced_code_block_start}}
+ ((?i:typescript|ts))
+ {{fenced_code_block_trailing_infostring_characters}}
+ captures:
+ 0: meta.code-fence.definition.begin.typescript.markdown-gfm
+ 2: punctuation.definition.raw.code-fence.begin.markdown
+ 5: constant.other.language-name.markdown
+ embed: scope:source.ts
+ embed_scope: markup.raw.code-fence.typescript.markdown-gfm
+ escape: '{{code_fence_escape}}'
+ escape_captures:
+ 0: meta.code-fence.definition.end.typescript.markdown-gfm
1: punctuation.definition.raw.code-fence.end.markdown
- match: |-
(?x)
@@ -1152,7 +1125,7 @@ contexts:
@@ -1152,7 +1155,7 @@ contexts:
- match: |-
(?x)
{{fenced_code_block_start}}
+17 -2
View File
@@ -21,11 +21,26 @@ index 9c2aa3e..180cbbf 100644
<string>Invalid</string>
<key>scope</key>
- <string>invalid</string>
+ <string>invalid, markup.error</string>
+ <string>invalid, meta.annotation.error-line</string>
<key>settings</key>
<dict>
<key>background</key>
@@ -1042,7 +1042,7 @@
@@ -1038,11 +1038,22 @@
<string>#f8f8f0</string>
</dict>
</dict>
+ <dict>
+ <key>name</key>
+ <string>Error</string>
+ <key>scope</key>
+ <string>markup.error</string>
+ <key>settings</key>
+ <dict>
+ <key>foreground</key>
+ <string>#dd2020</string>
+ </dict>
+ </dict>
<dict>
<key>name</key>
<string>Invalid deprecated</string>
<key>scope</key>
+1 -1
View File
@@ -14,7 +14,7 @@ index e973e319..07c170a7 100644
first_line_match: |
(?x)
- ^\#! .* \b(bash|zsh|sh|tcsh|ash)\b
+ ^\#! .* \b(bash|zsh|sh|tcsh|ash|dash)\b
+ ^\#! .* \b(bash|zsh|sh|tcsh|ash|dash|ksh)\b
| ^\# \s* -\*- [^*]* mode: \s* shell-script [^*]* -\*-
#-------------------------------------------------------------------------------
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,6 @@
%YAML 1.2
---
name: x86_64 Assembly
file_extensions: [yasm, nasm, asm, inc, mac]
scope: source.asm.x86_64
@@ -1364,4 +1365,3 @@ contexts:
scope: invalid.keyword.operator.word.mnemonic.sse5.packed-arithmetic
- match: '(?i)\b(pcmov|permp[ds]|pperm|prot[bdqw]|psh[al][bdqw])\b'
scope: invalid.keyword.operator.word.mnemonic.sse5.simd-integer
...
@@ -2,20 +2,21 @@
---
# See http://www.sublimetext.com/docs/3/syntax.html
name: Comma Separated Values
file_extensions:
- csv
- tsv
scope: text.csv
scope: text.csv.comma
variables:
field_separator: (?:[,;|\t])
field_separator: (?:,)
record_separator: (?:$\n?)
contexts:
prototype:
- match: (?={{record_separator}})
pop: true
main:
- match: '^'
push: fields
fields:
- match: ""
- include: record_separator
- match: ''
push:
- field_or_record_separator
- field5
- field_or_record_separator
- field4
- field_or_record_separator
@@ -24,54 +25,55 @@ contexts:
- field2
- field_or_record_separator
- field1
main:
record_separator_pop:
- match: (?={{record_separator}})
pop: true
record_separator:
- meta_include_prototype: false
- match: "^"
set: fields
- match: '{{record_separator}}'
scope: punctuation.terminator.record.csv
pop: true
field_or_record_separator:
- meta_include_prototype: false
- match: "{{record_separator}}"
scope: punctuation.terminator.record.csv
pop: true
- match: "{{field_separator}}"
- include: record_separator_pop
- match: '{{field_separator}}'
scope: punctuation.separator.sequence.csv
pop: true
field_contents:
- match: '"'
scope: punctuation.definition.string.begin.csv
push: double_quoted_string
push: scope:text.csv#double_quoted_string
- match: (?={{field_separator}}|{{record_separator}})
pop: true
double_quoted_string:
- meta_include_prototype: false
- meta_scope: string.quoted.double.csv
- match: '""'
scope: constant.character.escape.csv
- match: '"'
scope: punctuation.definition.string.end.csv
- include: record_separator_pop
- match: (?={{field_separator}})
pop: true
field1:
- match: ""
- match: ''
set:
- meta_content_scope: meta.field-1.csv support.type
- meta_content_scope: meta.field-1.csv variable.parameter
- include: field_contents
field2:
- match: ""
- match: ''
set:
- meta_content_scope: meta.field-2.csv support.function
- include: field_contents
field3:
- match: ""
- match: ''
set:
- meta_content_scope: meta.field-3.csv constant.numeric
- include: field_contents
field4:
- match: ""
- match: ''
set:
- meta_content_scope: meta.field-4.csv keyword.operator
- include: field_contents
field5:
- match: ''
set:
- meta_content_scope: meta.field-5.csv string.unquoted
- include: field_contents
+80
View File
@@ -0,0 +1,80 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
name: Pipe Separated Values
scope: text.csv.pipe
variables:
field_separator: (?:\|)
record_separator: (?:$\n?)
contexts:
main:
- match: '^'
push: fields
fields:
- include: record_separator
- match: ''
push:
- field_or_record_separator
- field5
- field_or_record_separator
- field4
- field_or_record_separator
- field3
- field_or_record_separator
- field2
- field_or_record_separator
- field1
record_separator_pop:
- match: (?={{record_separator}})
pop: true
record_separator:
- meta_include_prototype: false
- match: '{{record_separator}}'
scope: punctuation.terminator.record.csv
pop: true
field_or_record_separator:
- meta_include_prototype: false
- include: record_separator_pop
- match: '{{field_separator}}'
scope: punctuation.separator.sequence.csv
pop: true
field_contents:
- match: '"'
scope: punctuation.definition.string.begin.csv
push: scope:text.csv#double_quoted_string
- include: record_separator_pop
- match: (?={{field_separator}})
pop: true
field1:
- match: ''
set:
- meta_content_scope: meta.field-1.csv variable.parameter
- include: field_contents
field2:
- match: ''
set:
- meta_content_scope: meta.field-2.csv support.function
- include: field_contents
field3:
- match: ''
set:
- meta_content_scope: meta.field-3.csv constant.numeric
- include: field_contents
field4:
- match: ''
set:
- meta_content_scope: meta.field-4.csv keyword.operator
- include: field_contents
field5:
- match: ''
set:
- meta_content_scope: meta.field-5.csv string.unquoted
- include: field_contents
@@ -0,0 +1,79 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
name: Semi-Colon Separated Values
scope: text.csv.semi-colon
variables:
field_separator: (?:;)
record_separator: (?:$\n?)
contexts:
main:
- match: '^'
push: fields
fields:
- include: record_separator
- match: ''
push:
- field_or_record_separator
- field5
- field_or_record_separator
- field4
- field_or_record_separator
- field3
- field_or_record_separator
- field2
- field_or_record_separator
- field1
record_separator_pop:
- match: (?={{record_separator}})
pop: true
record_separator:
- meta_include_prototype: false
- match: '{{record_separator}}'
scope: punctuation.terminator.record.csv
pop: true
field_or_record_separator:
- meta_include_prototype: false
- include: record_separator_pop
- match: '{{field_separator}}'
scope: punctuation.separator.sequence.csv
pop: true
field_contents:
- match: '"'
scope: punctuation.definition.string.begin.csv
push: scope:text.csv#double_quoted_string
- include: record_separator_pop
- match: (?={{field_separator}})
pop: true
field1:
- match: ''
set:
- meta_content_scope: meta.field-1.csv variable.parameter
- include: field_contents
field2:
- match: ''
set:
- meta_content_scope: meta.field-2.csv support.function
- include: field_contents
field3:
- match: ''
set:
- meta_content_scope: meta.field-3.csv constant.numeric
- include: field_contents
field4:
- match: ''
set:
- meta_content_scope: meta.field-4.csv keyword.operator
- include: field_contents
field5:
- match: ''
set:
- meta_content_scope: meta.field-5.csv string.unquoted
- include: field_contents
+113
View File
@@ -0,0 +1,113 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
name: Separated Values
file_extensions:
- csv
scope: text.csv
variables:
field_separator_chars: ',;\t|'
field_separator: (?:[{{field_separator_chars}}])
record_separator: (?:$\n?)
contexts:
main:
- meta_include_prototype: false
- include: three_field_separators
- include: single_separator_type_on_line
- match: '^'
push: unknown-separated-main
three_field_separators:
- match: ^(?=(?:[^,]*,){3})
set: scope:text.csv.comma
- match: ^(?=(?:[^;]*;){3})
set: scope:text.csv.semi-colon
- match: ^(?=(?:[^\t]*\t){3})
set: scope:text.csv.tab
- match: ^(?=(?:[^|]*\|){3})
set: scope:text.csv.pipe
single_separator_type_on_line:
- match: ^(?=[^{{field_separator_chars}}]*,[^;\t|]*$)
set: scope:text.csv.comma
- match: ^(?=[^{{field_separator_chars}}]*;[^,\t|]*$)
set: scope:text.csv.semi-colon
- match: ^(?=[^{{field_separator_chars}}]*\t[^,;|]*$)
set: scope:text.csv.tab
- match: ^(?=[^{{field_separator_chars}}]*\|[^,;\t]*$)
set: scope:text.csv.pipe
unknown-separated-main:
- include: record_separator
- match: ''
push:
- field_or_record_separator
- field5
- field_or_record_separator
- field4
- field_or_record_separator
- field3
- field_or_record_separator
- field2
- field_or_record_separator
- field1
record_separator_pop:
- match: (?={{record_separator}})
pop: true
record_separator:
- meta_include_prototype: false
- match: '{{record_separator}}'
scope: punctuation.terminator.record.csv
field_or_record_separator:
- meta_include_prototype: false
- include: record_separator_pop
- match: '{{field_separator}}'
scope: punctuation.separator.sequence.csv
pop: true
field_contents:
- match: '"'
scope: punctuation.definition.string.begin.csv
push: double_quoted_string
- include: record_separator_pop
- match: (?={{field_separator}})
pop: true
double_quoted_string:
- meta_include_prototype: false
- meta_scope: meta.string.quoted.double.csv
- match: '""'
scope: constant.character.escape.csv
- match: '"'
scope: punctuation.definition.string.end.csv
pop: true
field1:
- match: ''
set:
- meta_content_scope: meta.field-1.csv variable.parameter
- include: field_contents
field2:
- match: ''
set:
- meta_content_scope: meta.field-2.csv support.function
- include: field_contents
field3:
- match: ''
set:
- meta_content_scope: meta.field-3.csv constant.numeric
- include: field_contents
field4:
- match: ''
set:
- meta_content_scope: meta.field-4.csv keyword.operator
- include: field_contents
field5:
- match: ''
set:
- meta_content_scope: meta.field-5.csv string.unquoted
- include: field_contents
+83
View File
@@ -0,0 +1,83 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
name: Tab Separated Values
scope: text.csv.tab
file_extensions:
- tsv
variables:
field_separator: (?:\t)
record_separator: (?:$\n?)
contexts:
main:
- match: '^'
push: fields
fields:
- include: record_separator
- match: ''
push:
- field_or_record_separator
- field5
- field_or_record_separator
- field4
- field_or_record_separator
- field3
- field_or_record_separator
- field2
- field_or_record_separator
- field1
record_separator_pop:
- match: (?={{record_separator}})
pop: true
record_separator:
- meta_include_prototype: false
- match: '{{record_separator}}'
scope: punctuation.terminator.record.csv
pop: true
field_or_record_separator:
- meta_include_prototype: false
- include: record_separator_pop
- match: '{{field_separator}}'
scope: punctuation.separator.sequence.csv
pop: true
field_contents:
- match: '"'
scope: punctuation.definition.string.begin.csv
push: scope:text.csv#double_quoted_string
- include: record_separator_pop
- match: (?={{field_separator}})
pop: true
field1:
- match: ''
set:
- meta_content_scope: meta.field-1.csv variable.parameter
- include: field_contents
field2:
- match: ''
set:
- meta_content_scope: meta.field-2.csv support.function
- include: field_contents
field3:
- match: ''
set:
- meta_content_scope: meta.field-3.csv constant.numeric
- include: field_contents
field4:
- match: ''
set:
- meta_content_scope: meta.field-4.csv keyword.operator
- include: field_contents
field5:
- match: ''
set:
- meta_content_scope: meta.field-5.csv string.unquoted
- include: field_contents
-23
View File
@@ -1,23 +0,0 @@
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: hosts
file_extensions:
- hosts
scope: source.hosts
contexts:
main:
- scope: comment.line.number-sign
match: \#.*
comment: comment
- match: ^\s*([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|[0-9a-f:]+)
comment: ipaddress
scope: constant.numeric.ipaddress
- match: \s(localhost|ip6-loopback|ip6-localhost|ip6-localnet|ip6-mcastprefix|ip6-allnodes|ip6-allrouters|ip6-allhosts|broadcasthost)\b
scope: keyword.host.predefined}
comment: prefdfined
+75 -70
View File
@@ -1,125 +1,130 @@
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: Lean
# http://www.sublimetext.com/docs/syntax.html
name: Lean 4
file_extensions:
- lean
scope: source.lean
scope: source.lean4
contexts:
main:
- include: comments
- match: '\b(?<!\.)(inductive|coinductive|structure|theorem|axiom|axioms|abbreviation|lemma|definition|def|instance|class|constant)\b\s+(\{[^}]*\})?'
- match: \b(Prop|Type|Sort)\b
scope: storage.type.lean4
- match: '\battribute\b\s*\[[^\]]*\]'
scope: storage.modifier.lean4
- match: '@\[[^\]]*\]'
scope: storage.modifier.lean4
- match: \b(?<!\.)(global|local|scoped|partial|unsafe|private|protected|noncomputable)(?!\.)\b
scope: storage.modifier.lean4
- match: \b(sorry|admit|stop)\b
scope: invalid.illegal.lean4
- match: '#(print|eval|reduce|check|check_failure)\b'
scope: keyword.other.lean4
- match: \bderiving\s+instance\b
scope: keyword.other.command.lean4
- match: '\b(?<!\.)(inductive|coinductive|structure|theorem|axiom|abbrev|lemma|def|instance|class|constant)\b\s+(\{[^}]*\})?'
captures:
1: keyword.other.definitioncommand.lean
1: keyword.other.definitioncommand.lean4
push:
- meta_scope: meta.definitioncommand.lean
- match: '(?=\bwith\b|\bextends\b|[:\|\(\[\{⦃<>])'
- meta_scope: meta.definitioncommand.lean4
- match: '(?=\bwith\b|\bextends\b|\bwhere\b|[:\|\(\[\{⦃<>])'
pop: true
- include: comments
- include: definitionName
- match: ","
- match: \b(Prop|Type|Sort)\b
scope: storage.type.lean
- match: '\battribute\b\s*\[[^\]]*\]'
scope: storage.modifier.lean
- match: '@\[[^\]]*\]'
scope: storage.modifier.lean
- match: \b(?<!\.)(private|meta|mutual|protected|noncomputable)\b
scope: keyword.control.definition.modifier.lean
- match: \b(sorry)\b
scope: invalid.illegal.lean
- match: '#print\s+(def|definition|inductive|instance|structure|axiom|axioms|class)\b'
scope: keyword.other.command.lean
- match: '#(print|eval|reduce|check|help|exit|find|where)\b'
scope: keyword.other.command.lean
- match: \b(?<!\.)(import|export|prelude|theory|definition|def|abbreviation|instance|renaming|hiding|exposing|parameter|parameters|begin|constant|constants|lemma|variable|variables|theorem|example|open|axiom|inductive|coinductive|with|structure|universe|universes|alias|precedence|reserve|postfix|prefix|infix|infixl|infixr|notation|end|using|namespace|section|local|set_option|extends|include|omit|class|classes|instances|raw|run_cmd|restate_axiom)(?!\.)\b
scope: keyword.other.lean
- match: \b(?<!\.)(calc|have|this|match|do|suffices|show|by|in|at|let|forall|fun|exists|assume|from|obtain|haveI|λ)(?!\.)\b
scope: keyword.other.lean
- match: ','
- match: \b(?<!\.)(theorem|show|have|from|suffices|nomatch|def|class|structure|instance|set_option|initialize|builtin_initialize|example|inductive|coinductive|axiom|constant|universe|universes|variable|variables|import|open|export|theory|prelude|renaming|hiding|exposing|do|by|let|extends|mutual|mut|where|rec|syntax|macro_rules|macro|deriving|fun|section|namespace|end|infix|infixl|infixr|postfix|prefix|notation|abbrev|if|then|else|calc|match|with|for|in|unless|try|catch|finally|return|continue|break)(?!\.)\b
scope: keyword.other.lean4
- match: «
push:
- meta_content_scope: entity.name.lean
- meta_content_scope: entity.name.lean4
- match: »
pop: true
- match: \b(?<!\.)(if|then|else)\b
scope: keyword.control.lean
- match: '"'
- match: (s!)"
captures:
0: punctuation.definition.string.begin.lean
1: keyword.other.lean4
push:
- meta_scope: string.quoted.double.lean
- meta_scope: string.interpolated.lean4
- match: '"'
captures:
0: punctuation.definition.string.end.lean
pop: true
- match: '\\[\\"nt'']'
scope: constant.character.escape.lean
- match: '(\{)'
captures:
1: keyword.other.lean4
push:
- match: '(\})'
captures:
1: keyword.other.lean4
pop: true
- include: main
- match: '\\[\\"ntr'']'
scope: constant.character.escape.lean4
- match: '\\x[0-9A-Fa-f][0-9A-Fa-f]'
scope: constant.character.escape.lean
scope: constant.character.escape.lean4
- match: '\\u[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]'
scope: constant.character.escape.lean
scope: constant.character.escape.lean4
- match: '"'
push:
- meta_scope: string.quoted.double.lean4
- match: '"'
pop: true
- match: '\\[\\"ntr'']'
scope: constant.character.escape.lean4
- match: '\\x[0-9A-Fa-f][0-9A-Fa-f]'
scope: constant.character.escape.lean4
- match: '\\u[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]'
scope: constant.character.escape.lean4
- match: \b(true|false)\b
scope: constant.language.lean4
- match: '''[^\\'']'''
scope: string.quoted.single.lean
- match: '''(\\(x..|u....|.))'''
scope: string.quoted.single.lean
scope: string.quoted.single.lean4
- match: '''(\\(x[0-9A-Fa-f][0-9A-Fa-f]|u[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]|.))'''
scope: string.quoted.single.lean4
captures:
1: constant.character.escape.lean
1: constant.character.escape.lean4
- match: '`+[^\[(]\S+'
scope: entity.name.lean
- match: '\b([0-9]+|0([xX][0-9a-fA-F]+))\b'
scope: constant.numeric.lean
scope: entity.name.lean4
- match: '\b([0-9]+|0([xX][0-9a-fA-F]+)|[-]?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?)\b'
scope: constant.numeric.lean4
blockComment:
- match: /-
push:
- meta_scope: comment.block.lean
- match: "-/"
- meta_scope: comment.block.lean4
- match: '-/'
pop: true
- include: scope:source.lean.markdown
- include: scope:source.lean4.markdown
- include: blockComment
comments:
- include: dashComment
- include: docComment
- include: stringBlock
- include: modDocComment
- include: blockComment
dashComment:
- match: (--)
captures:
0: punctuation.definition.comment.lean
- match: '--'
push:
- meta_scope: comment.line.double-dash.lean
- meta_scope: comment.line.double-dash.lean4
- match: $
pop: true
- include: scope:source.lean.markdown
- include: scope:source.lean4.markdown
definitionName:
- match: '\b[^:«»\(\)\{\}[:space:]=→λ∀?][^:«»\(\)\{\}[:space:]]*'
scope: entity.name.function.lean
scope: entity.name.function.lean4
- match: «
push:
- meta_content_scope: entity.name.function.lean
- meta_content_scope: entity.name.function.lean4
- match: »
pop: true
docComment:
- match: /--
push:
- meta_scope: comment.block.documentation.lean
- match: "-/"
- meta_scope: comment.block.documentation.lean4
- match: '-/'
pop: true
- include: scope:source.lean.markdown
- include: scope:source.lean4.markdown
- include: blockComment
modDocComment:
- match: /-!
push:
- meta_scope: comment.block.documentation.lean
- match: "-/"
- meta_scope: comment.block.documentation.lean4
- match: '-/'
pop: true
- include: scope:source.lean.markdown
- include: blockComment
stringBlock:
- match: /-"
push:
- meta_scope: comment.block.string.lean
- match: '"-/'
pop: true
- include: scope:source.lean.markdown
- include: scope:source.lean4.markdown
- include: blockComment
+2 -1
View File
@@ -9,6 +9,7 @@ scope: source.man
variables:
section_heading: '^(?!#)\S.*$'
command_line_option: '(--?[A-Za-z0-9][_A-Za-z0-9-]*)'
ansi_escape_sequence: '\e\[[\?=]?(?:\d+;?)*[A-Za-z]'
contexts:
prototype:
@@ -69,7 +70,7 @@ contexts:
escape: '(?={{section_heading}})'
function-call:
- match: '\b([A-Za-z0-9_\-]+\.)?([A-Za-z0-9_\-]+)(\()([^)]*)(\))'
- match: '(?<!\e\[)(?:\b|\s)(?:{{ansi_escape_sequence}})?([A-Za-z0-9_\-]+\.)?([A-Za-z0-9_\-]+)(?:{{ansi_escape_sequence}})?(\()([^)]*)(\))'
captures:
1: entity.name.function.man
2: entity.name.function.man
+42
View File
@@ -0,0 +1,42 @@
%YAML 1.2
---
# See http://www.sublimetext.com/docs/syntax.html
name: debsources
file_extensions:
- sources.list
scope: text.apt-source-list
contexts:
main:
- include: comments
- match: ^[\w-]+
scope: constant.language.apt-source-list
- match: \w+://\S+
scope: markup.underline.link.apt-source-list
push: distribution
- match: \bmain\b
scope: support.class.apt-source-list
- match: \buniverse\b
scope: support.constant.apt-source-list
- match: \brestricted\b
scope: storage.modifier.apt-source-list
- match: \bmultiverse\b
scope: keyword.other.apt-source-list
- match: '[\w-]+'
scope: constant.other.apt-source-list
comments:
- match: '#'
scope: punctuation.definition.comment.apt-source-list
push: line_comment
line_comment:
- meta_scope: comment.line.apt-source-list
- match: $
pop: true
distribution:
- match: \S+
scope: support.type.apt-source-list
pop: 1
- match: $
pop: 1
+12 -12
View File
@@ -38,21 +38,21 @@ contexts:
scope: markup.underline.link.scheme.log
push: url-host
log_level_lines:
- match: ^(?=.*{{error}})
- match: (?=.*{{error}})
push:
- error_line
- error_line_meta
- main_pop_at_eol
- match: ^(?=.*{{warning}})
- match: (?=.*{{warning}})
push:
- warning_line
- warning_line_meta
- main_pop_at_eol
- match: ^(?=.*{{info}})
- match: (?=.*{{info}})
push:
- info_line
- info_line_meta
- main_pop_at_eol
- match: ^(?=.*{{debug}})
- match: (?=.*{{debug}})
push:
- debug_line
- debug_line_meta
- main_pop_at_eol
log_levels:
- match: '{{error}}'
@@ -63,16 +63,16 @@ contexts:
scope: markup.info.log
- match: '{{debug}}'
scope: markup.info.log
error_line:
error_line_meta:
- meta_scope: meta.annotation.error-line.log
- include: immediately_pop
warning_line:
warning_line_meta:
- meta_scope: meta.annotation.warning-line.log
- include: immediately_pop
info_line:
info_line_meta:
- meta_scope: meta.annotation.info-line.log
- include: immediately_pop
debug_line:
debug_line_meta:
- meta_scope: meta.annotation.debug-line.log
- include: immediately_pop
immediately_pop:
+19 -17
View File
@@ -8,10 +8,10 @@ scope: text.log.syslog
contexts:
main:
- match: ^(\w+\s+\d+)\s+(\d{2}:\d{2}:\d{2})
scope: meta.datetime.syslog constant.numeric.syslog
scope: meta.datetime.syslog
captures:
1: meta.date.syslog
2: meta.time.syslog
1: meta.date.syslog constant.numeric.syslog
2: meta.time.syslog constant.numeric.syslog
push: loghost
- match: ^
push: text
@@ -31,22 +31,24 @@ contexts:
structured-data:
- match: '\['
scope: punctuation.section.mapping.begin.syslog
push:
- match: \]
scope: punctuation.section.mapping.end.syslog
pop: true
- match: \w+
scope: variable.parameter.syslog
- match: =
scope: keyword.operator.assignment.syslog
push:
- match: '[^\s\]]+'
scope: constant.other.syslog
pop: true
- match: (?=\])
pop: true
push: structured-data-contents
- match: (?=\S)
set: text
structured-data-contents:
- match: \]
scope: punctuation.section.mapping.end.syslog
pop: true
- match: \w+
scope: variable.parameter.syslog
- match: =
scope: keyword.operator.assignment.syslog
push: structured-data-assignment
structured-data-assignment:
- match: '[^\s\]]+'
scope: constant.other.syslog
pop: true
- match: (?=\])
pop: true
text:
- match: $
pop: true
+1 -1
View File
@@ -1,5 +1,5 @@
// Output the square of a number.
fn print_square(num: f64) {
let result = f64::powf(num, 2.0);
println!("The square of {:.2} is {:.2}.", num, result);
println!("The square of {num:.2} is {result:.2}.");
}
BIN
View File
Binary file not shown.
Vendored Submodule
+1
+1 -1
View File
@@ -234,7 +234,7 @@
<key>name</key>
<string>Headings</string>
<key>scope</key>
<string>markup.heading punctuation.definition.heading, entity.name.section, markup.heading - text.html.markdown</string>
<string>markup.heading punctuation.definition.heading, entity.name.section, markup.heading - text.html.markdown, meta.mapping.key string.quoted.double</string>
<key>settings</key>
<dict>
<key>fontStyle</key>
+166 -92
View File
@@ -9,6 +9,8 @@ use anyhow::{anyhow, bail};
use indexmap::IndexMap;
use itertools::Itertools;
use once_cell::sync::Lazy;
use proc_macro2::TokenStream;
use quote::{quote, ToTokens, TokenStreamExt};
use regex::Regex;
use serde_derive::Deserialize;
use serde_with::DeserializeFromStr;
@@ -34,22 +36,60 @@ impl FromStr for MappingTarget {
}
}
}
impl MappingTarget {
fn codegen(&self) -> String {
match self {
Self::MapTo(syntax) => format!(r###"MappingTarget::MapTo(r#"{syntax}"#)"###),
Self::MapToUnknown => "MappingTarget::MapToUnknown".into(),
Self::MapExtensionToUnknown => "MappingTarget::MapExtensionToUnknown".into(),
}
impl ToTokens for MappingTarget {
fn to_tokens(&self, tokens: &mut TokenStream) {
let t = match self {
Self::MapTo(syntax) => quote! { MappingTarget::MapTo(#syntax) },
Self::MapToUnknown => quote! { MappingTarget::MapToUnknown },
Self::MapExtensionToUnknown => quote! { MappingTarget::MapExtensionToUnknown },
};
tokens.append_all(t);
}
}
/// Helper type for deserializing a `Matcher` from either a plain string or a
/// `{ glob = "...", case_sensitive = true }` struct.
#[derive(Deserialize)]
#[serde(untagged)]
enum RawMatcher {
Simple(String),
Full {
glob: String,
case_sensitive: Option<bool>,
},
}
/// Whether a glob pattern should be matched case-sensitively or case-insensitively.
///
/// Mirrors the runtime `Case` type in `src/syntax_mapping.rs`.
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
enum Case {
Sensitive,
Insensitive,
}
impl ToTokens for Case {
fn to_tokens(&self, tokens: &mut TokenStream) {
let t = match self {
Self::Sensitive => quote! { Case::Sensitive },
Self::Insensitive => quote! { Case::Insensitive },
};
tokens.append_all(t);
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, DeserializeFromStr)]
/// A single matcher.
///
/// Codegen converts this into a `Lazy<Option<GlobMatcher>>`.
struct Matcher(Vec<MatcherSegment>);
/// Parse a matcher.
#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize)]
#[serde(try_from = "RawMatcher")]
struct Matcher {
segments: Vec<MatcherSegment>,
/// Whether the glob pattern should be matched case-sensitively.
///
/// Defaults to `Case::Insensitive` for backwards compatibility.
case: Case,
}
/// Parse the glob pattern of a matcher.
///
/// Note that this implementation is rather strict: it will greedily interpret
/// every valid environment variable replacement as such, then immediately
@@ -63,75 +103,97 @@ struct Matcher(Vec<MatcherSegment>);
///
/// Revision history:
/// - 2024-02-20: allow `{` and `}` (glob brace expansion)
impl FromStr for Matcher {
type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
use MatcherSegment as Seg;
static VAR_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"\$\{([\w\d_]+)\}").unwrap());
fn parse_glob(s: &str) -> Result<Vec<MatcherSegment>, anyhow::Error> {
use MatcherSegment as Seg;
static VAR_REGEX: Lazy<Regex> = Lazy::new(|| Regex::new(r"\$\{([\w\d_]+)\}").unwrap());
let mut segments = vec![];
let mut text_start = 0;
for capture in VAR_REGEX.captures_iter(s) {
let match_0 = capture.get(0).unwrap();
let mut segments = vec![];
let mut text_start = 0;
for capture in VAR_REGEX.captures_iter(s) {
let match_0 = capture.get(0).unwrap();
// text before this var
let text_end = match_0.start();
segments.push(Seg::Text(s[text_start..text_end].into()));
text_start = match_0.end();
// text before this var
let text_end = match_0.start();
segments.push(Seg::Text(s[text_start..text_end].into()));
text_start = match_0.end();
// this var
segments.push(Seg::Env(capture.get(1).unwrap().as_str().into()));
// this var
segments.push(Seg::Env(capture.get(1).unwrap().as_str().into()));
}
// possible trailing text
segments.push(Seg::Text(s[text_start..].into()));
// cleanup empty text segments
let non_empty_segments = segments
.into_iter()
.filter(|seg| seg.text().map(|t| !t.is_empty()).unwrap_or(true))
.collect_vec();
// sanity check
if non_empty_segments
.windows(2)
.any(|segs| segs[0].is_text() && segs[1].is_text())
{
unreachable!("Parsed into consecutive text segments: {non_empty_segments:?}");
}
// guard empty case
if non_empty_segments.is_empty() {
bail!(r#"Parsed an empty matcher: "{s}""#);
}
// guard variable syntax leftover fragments
if non_empty_segments
.iter()
.filter_map(Seg::text)
.any(|t| t.contains('$'))
{
bail!(r#"Invalid matcher: "{s}""#);
}
Ok(non_empty_segments)
}
impl TryFrom<RawMatcher> for Matcher {
type Error = anyhow::Error;
fn try_from(raw: RawMatcher) -> Result<Self, Self::Error> {
const DEFAULT_CASE: Case = Case::Insensitive;
match &raw {
RawMatcher::Simple(s) => {
let segments = parse_glob(s)?;
Ok(Self {
segments,
case: DEFAULT_CASE,
})
}
RawMatcher::Full {
glob,
case_sensitive,
} => {
let segments = parse_glob(glob)?;
let case = match case_sensitive {
None => DEFAULT_CASE,
Some(false) => Case::Insensitive,
Some(true) => Case::Sensitive,
};
Ok(Self { segments, case })
}
}
// possible trailing text
segments.push(Seg::Text(s[text_start..].into()));
// cleanup empty text segments
let non_empty_segments = segments
.into_iter()
.filter(|seg| seg.text().map(|t| !t.is_empty()).unwrap_or(true))
.collect_vec();
// sanity check
if non_empty_segments
.windows(2)
.any(|segs| segs[0].is_text() && segs[1].is_text())
{
unreachable!("Parsed into consecutive text segments: {non_empty_segments:?}");
}
// guard empty case
if non_empty_segments.is_empty() {
bail!(r#"Parsed an empty matcher: "{s}""#);
}
// guard variable syntax leftover fragments
if non_empty_segments
.iter()
.filter_map(Seg::text)
.any(|t| t.contains('$'))
{
bail!(r#"Invalid matcher: "{s}""#);
}
Ok(Self(non_empty_segments))
}
}
impl Matcher {
fn codegen(&self) -> String {
match self.0.len() {
0 => unreachable!("0-length matcher should never be created"),
// if-let guard would be ideal here
// see: https://github.com/rust-lang/rust/issues/51114
1 if self.0[0].is_text() => {
let s = self.0[0].text().unwrap();
format!(r###"Lazy::new(|| Some(build_matcher_fixed(r#"{s}"#)))"###)
impl ToTokens for Matcher {
fn to_tokens(&self, tokens: &mut TokenStream) {
let case = &self.case;
let t = match self.segments.as_slice() {
[] => unreachable!("0-length matcher should never be created"),
[MatcherSegment::Text(text)] => {
quote! { Lazy::new(|| Some(build_matcher_fixed(#text, #case))) }
}
// parser logic ensures that this case can only happen when there are dynamic segments
_ => {
let segs = self.0.iter().map(MatcherSegment::codegen).join(", ");
format!(r###"Lazy::new(|| build_matcher_dynamic(&[{segs}]))"###)
segs @ [_, ..] => {
quote! { Lazy::new(|| build_matcher_dynamic(&[ #(#segs),* ], #case)) }
}
}
};
tokens.append_all(t);
}
}
@@ -143,6 +205,15 @@ enum MatcherSegment {
Text(String),
Env(String),
}
impl ToTokens for MatcherSegment {
fn to_tokens(&self, tokens: &mut TokenStream) {
let t = match self {
Self::Text(text) => quote! { MatcherSegment::Text(#text) },
Self::Env(env) => quote! { MatcherSegment::Env(#env) },
};
tokens.append_all(t);
}
}
#[allow(dead_code)]
impl MatcherSegment {
fn is_text(&self) -> bool {
@@ -163,17 +234,12 @@ impl MatcherSegment {
Self::Env(t) => Some(t),
}
}
fn codegen(&self) -> String {
match self {
Self::Text(s) => format!(r###"MatcherSegment::Text(r#"{s}"#)"###),
Self::Env(s) => format!(r###"MatcherSegment::Env(r#"{s}"#)"###),
}
}
}
/// A struct that models a single .toml file in /src/syntax_mapping/builtins/.
#[derive(Clone, Debug, Deserialize)]
struct MappingDefModel {
#[serde(default)]
mappings: IndexMap<MappingTarget, Vec<Matcher>>,
}
impl MappingDefModel {
@@ -194,22 +260,19 @@ impl MappingDefModel {
#[derive(Clone, Debug)]
struct MappingList(Vec<(Matcher, MappingTarget)>);
impl MappingList {
fn codegen(&self) -> String {
let array_items: Vec<_> = self
impl ToTokens for MappingList {
fn to_tokens(&self, tokens: &mut TokenStream) {
let len = self.0.len();
let array_items = self
.0
.iter()
.map(|(matcher, target)| {
format!("({m}, {t})", m = matcher.codegen(), t = target.codegen())
})
.collect();
let len = array_items.len();
.map(|(matcher, target)| quote! { (#matcher, #target) });
format!(
"/// Generated by build script from /src/syntax_mapping/builtins/.\n\
pub(crate) static BUILTIN_MAPPINGS: [(Lazy<Option<GlobMatcher>>, MappingTarget); {len}] = [\n{items}\n];",
items = array_items.join(",\n")
)
let t = quote! {
/// Generated by build script from /src/syntax_mapping/builtins/.
pub(crate) static BUILTIN_MAPPINGS: [(Lazy<Option<GlobMatcher>>, MappingTarget); #len] = [#(#array_items),*];
};
tokens.append_all(t);
}
}
@@ -236,8 +299,14 @@ fn get_def_paths() -> anyhow::Result<Vec<PathBuf>> {
];
let mut toml_paths = vec![];
for subdir in source_subdirs {
let wd = WalkDir::new(Path::new("src/syntax_mapping/builtins").join(subdir));
for subdir_name in source_subdirs {
let subdir = Path::new("src/syntax_mapping/builtins").join(subdir_name);
if !subdir.try_exists()? {
// Directory might not exist due to this `cargo vendor` bug:
// https://github.com/rust-lang/cargo/issues/15080
continue;
}
let wd = WalkDir::new(subdir);
let paths = wd
.into_iter()
.filter_map_ok(|entry| {
@@ -285,10 +354,15 @@ pub fn build_static_mappings() -> anyhow::Result<()> {
let mappings = read_all_mappings()?;
// IMPRV: parse + unparse is a bit cringe, but there seems to be no better
// option given the limited APIs of `prettyplease`
let rs_src = syn::parse_file(&mappings.to_token_stream().to_string())?;
let rs_src_pretty = prettyplease::unparse(&rs_src);
let codegen_path = Path::new(&env::var_os("OUT_DIR").ok_or(anyhow!("OUT_DIR is unset"))?)
.join("codegen_static_syntax_mappings.rs");
fs::write(codegen_path, mappings.codegen())?;
fs::write(codegen_path, rs_src_pretty)?;
Ok(())
}
+1 -1
View File
@@ -366,7 +366,7 @@ ansible-galaxy install aeimer.install_bat
### From source
`bat` をソースからビルドしたいならば、Rust 1.74.0 以上の環境が必要です。
`bat` をソースからビルドしたいならば、Rust 1.79.0 以上の環境が必要です。
`cargo` を使用してビルドすることができます:
```bash
+5 -5
View File
@@ -163,7 +163,7 @@ git show v0.6.0:src/main.rs | bat -l rs
볼 수 있습니다:
```bash
batdiff() {
git diff --name-only --diff-filter=d | xargs bat --diff
git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff
}
```
이것을 별도의 도구로 쓰고 싶다면
@@ -416,7 +416,7 @@ scoop install bat
### 소스에서
`bat`의 소스를 빌드하기 위해서는, Rust 1.74.0 이상이 필요합니다.
`bat`의 소스를 빌드하기 위해서는, Rust 1.79.0 이상이 필요합니다.
`cargo`를 이용해 전부 빌드할 수 있습니다:
```bash
@@ -461,11 +461,11 @@ bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
- `ansi`는 어떤 터미널에서도 무난하게 보입니다. 이는 3비트 색상을 사용합니다:
검정, 빨강, 녹색, 노랑, 파랑, 마젠타, 시안, 하양.
- `base16`은 [base16](https://github.com/chriskempson/base16) 터미널 테마를 위해
- `base16`은 [base16](https://github.com/tinted-theming/home) 터미널 테마를 위해
디자인되었습니다.
이는 [base16 스타일 가이드라인](https://github.com/chriskempson/base16/blob/master/styling.md)에
이는 [base16 스타일 가이드라인](https://github.com/tinted-theming/home/blob/main/styling.md)에
따라 4비트 색상(3비트 색상에 밝은 변형 추가)을 사용합니다.
- `base16-256`는 [base16-shell](https://github.com/chriskempson/base16-shell)을
- `base16-256`는 [base16-shell](https://github.com/tinted-theming/base16-shell)을
위해 디자인되었습니다.
이는 16부터 21의 일부 밝은 색상을 8비트 색상으로 대치합니다.
단지 256-색상 터미널을 쓰지만 base16-shell을 쓰지 않는다고 해서 이것을
+116 -63
View File
@@ -3,11 +3,11 @@
<a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD"><img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"></a>
<img src="https://img.shields.io/crates/l/bat.svg" alt="license">
<a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
Клон утилиты <i>cat(1)</i> с поддержкой выделения синтаксиса и Git
Клон утилиты <i>cat(1)</i> с поддержкой подсветки синтаксиса и Git
</p>
<p align="center">
<a href="#выделение-синтаксиса">Ключевые возможности</a> •
<a href="#подсветка-синтаксиса">Ключевые возможности</a> •
<a href="#как-использовать">Использование</a> •
<a href="#установка">Установка</a> •
<a href="#кастомизация">Кастомизация</a> •
@@ -19,11 +19,11 @@
[Русский]
</p>
### Выделение синтаксиса
### Подсветка синтаксиса
`bat` поддерживает выделение синтаксиса для огромного количества языков программирования и разметки:
`bat` поддерживает подсветку синтаксиса для огромного количества языков программирования и разметки:
![Пример выделения синтаксиса](https://i.imgur.com/3FGy5tW.png)
![Пример подсветки синтаксиса](https://i.imgur.com/3FGy5tW.png)
### Интеграция с Git
`bat` использует `git`, чтобы показать изменения в коде
@@ -31,15 +31,17 @@
![Пример интеграции с Git](https://i.imgur.com/azUAzdx.png)
### Показать непечатаемые символы
### Показ непечатных символов
Вы можете использовать `-A` / `--show-all` флаг, чтобы показать символы, которые невозможно напечатать:
Вы можете использовать флаг `-A` / `--show-all`, чтобы показать непечатные символы:
![Строка с неотображемыми символами](https://i.imgur.com/X0orYY9.png)
### Автоматическое разделение текста
### Автоматический пейджинг терминала
`bat` умеет перенаправлять вывод в `less`, если вывод не помещается на экране полностью.
`bat` умеет перенаправлять вывод в пейджер терминала (например, в `less`), если вывод не помещается на экране полностью.
Если вы хотите, чтобы `bat` работал как `cat` всё время, вы можете установить опцию `--paging=never` в командной строке или в конфигурационном файле.
Если вы намерены использовать `bat` в качестве алиаса для `cat`, вы можете установить `alias cat='bat --paging=never'`, чтобы сохранить изначальное поведение.
### Объединение файлов
@@ -86,11 +88,23 @@ bat header.md content.md footer.md > document.md
bat -n main.rs # показываем только количество строк
bat f - g # выводит 'f' в stdin, а потом 'g'.
bat f - g # выводит 'f', потом stdin, а потом 'g'.
```
### Интеграция с другими утилитами
#### `fzf`
Вы можете использовать `bat` как просмотрщик для [`fzf`](https://github.com/junegunn/fzf).
Чтобы это заработало, используйте опцию `--color=always`, чтобы вывод был всегда цветным.
Вы можете также использовать опцию `--line-range`, чтобы уменьшить время загрузки для больших файлов:
```bash
fzf --preview "bat --color=always --style=numbers --line-range=:500 {}"
```
Больше деталей смотрите в [`README` программы `fzf`](https://github.com/junegunn/fzf#preview-window).
#### `find` или `fd`
Вы можете использовать флаг `-exec` в `find`, чтобы посмотреть превью всех файлов в `bat`
@@ -121,12 +135,22 @@ tail -f /var/log/pacman.log | bat --paging=never -l log
#### `git`
Вы можете использовать `bat` с `git show`, чтобы просмотреть старую версию файла с выделением синтаксиса:
Вы можете использовать `bat` с `git show`, чтобы просмотреть старую версию файла с подсветкой синтаксиса:
```bash
git show v0.6.0:src/main.rs | bat -l rs
```
Обратите внимание, что выделение синтаксиса не работает в `git diff` на данный момент. Если вам это нужно, посмотрите [`delta`](https://github.com/dandavison/delta).
#### `git diff`
Вы можете использовать `bat` с `git diff` для просмотра строк кода вокруг изменений с подсветкой синтаксиса:
```bash
batdiff() {
git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff
}
```
Если вы хотите использовать это как отдельную программу, посмотрите `batdiff` из [`bat-extras`](https://github.com/eth-p/bat-extras).
Если вам это нужна более полная поддержка для операций с git и diff, посмотрите [`delta`](https://github.com/dandavison/delta).
#### `xclip`
@@ -135,17 +159,18 @@ git show v0.6.0:src/main.rs | bat -l rs
```bash
bat main.cpp | xclip
```
`bat` обнаружит перенаправление вывода и выведет обычный текст без выделения синтаксиса.
`bat` обнаружит перенаправление вывода и выведет обычный текст без подсветки синтаксиса.
#### `man`
`bat` может быть использован в виде выделения цвета для `man`, для этого установите переменную окружения
`bat` может быть использован для раскрашивания вывода `man`, для этого установите переменную окружения
`MANPAGER`:
```bash
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man 2 select
```
(замените `bat` на `batcat`, если у вас Debian или Ubuntu)
Возможно вам понадобится также установить `MANROFFOPT="-c"`, если у вас есть проблемы с форматированием.
@@ -153,10 +178,40 @@ man 2 select
Обратите внимание, что [синтаксис manpage](assets/syntaxes/02_Extra/Manpage.sublime-syntax) разрабатывается в этом репозитории и все еще находится в разработке.
Также заметьте, что это [не заработает](https://github.com/sharkdp/bat/issues/1145) с реализацией `man` через Mandocs.
#### `prettier` / `shfmt` / `rustfmt`
[`Prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) — скрипт, который форматирует код и выводит его с помощью `bat`.
#### Подсветка сообщений `--help`
Вы можете использовать `bat`, чтобы подсвечивать текст справки комманд: `$ cp --help | bat -plhelp`
Вы можете сделать такую вспомогательную команду для этого:
```bash
# in your .bashrc/.zshrc/*rc
alias bathelp='bat --plain --language=help'
help() {
"$@" --help 2>&1 | bathelp
}
```
В этом случае, вы можете просто писать `$ help cp` или `$ help git commit`.
Если вы используете `zsh`, вы можете объявить глобальные алиасы для `-h` и `--help`:
```bash
alias -g -- -h='-h 2>&1 | bat --language=help --style=plain'
alias -g -- --help='--help 2>&1 | bat --language=help --style=plain'
```
В этом случае, вы можете продолжать использовать `cp --help`, но при этом получать подцвеченный вывод.
Обратите внимание, что не всегда опция `-h` является краткой формы опции `--help` (например, у `ls`).
Пожалуйста, сообщайте о проблемах с подсветкой справки в [этот репозиторий](https://github.com/victor-gp/cmd-help-sublime-syntax).
## Установка
@@ -165,8 +220,7 @@ man 2 select
### Ubuntu (с помощью `apt`)
*... и другие дистрибутивы основанные на Debian.*
`bat` есть в репозиториях [Ubuntu](https://packages.ubuntu.com/eoan/bat) и
[Debian](https://packages.debian.org/sid/bat) и доступен начиная с Ubuntu Eoan 19.10. На Debian `bat` пока что доступен только с нестабильной веткой "Sid".
`bat` доступен на [Ubuntu since 20.04 ("Focal")](https://packages.ubuntu.com/search?keywords=bat&exact=1) и [Debian since August 2021 (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat).
Если ваша версия Ubuntu/Debian достаточно новая, вы можете установить `bat` так:
@@ -245,6 +299,14 @@ cd /usr/ports/textproc/bat
make install
```
### On OpenBSD
Вы можете установить `bat` с помощью [`pkg_add(1)`](https://man.openbsd.org/pkg_add.1):
```bash
pkg_add bat
```
### С помощью nix
Вы можете установить `bat`, используя [nix package manager](https://nixos.org/nix):
@@ -253,6 +315,14 @@ make install
nix-env -i bat
```
### Через flox
Вы можете установить `bat` используя [Flox](https://flox.dev)
```bash
flox install bat
```
### openSUSE
Вы можете установить `bat` с помощью `zypper`:
@@ -261,7 +331,7 @@ nix-env -i bat
zypper install bat
```
### macOS
### На macOS (или Linux) через Homebrew
Вы можете установить `bat` с помощью [Homebrew](http://braumeister.org/formula/bat):
@@ -269,6 +339,8 @@ zypper install bat
brew install bat
```
### На macOS через MacPorts
Или же установить его с помощью [MacPorts](https://ports.macports.org/port/bat/summary):
```bash
@@ -277,7 +349,19 @@ port install bat
### Windows
Есть несколько способов установить `bat`. Как только вы установили его, посмотрите на секцию ["Использование `bat` в Windows"](#using-bat-on-windows).
Есть несколько способов установить `bat`. Как только вы установили его, посмотрите на секцию ["Использование `bat` в Windows"](#использование-bat-в-windows).
#### Пререквитизы
Вам нужно установить пакет [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
#### С помощью WinGet
Вы можете установить `bat` через [WinGet](https://learn.microsoft.com/en-us/windows/package-manager/winget):
```bash
winget install sharkdp.bat
```
#### С помощью Chocolatey
@@ -293,50 +377,10 @@ choco install bat
scoop install bat
```
Для этого у вас должен быть установлен [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
#### Из заранее скомпилированных файлов:
Их вы можете скачать на [странице релизов](https://github.com/sharkdp/bat/releases).
Для этого у вас должен быть установлен [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
### С помощью Docker
Вы можете использовать [Docker image](https://hub.docker.com/r/danlynn/bat/), чтобы запустить `bat` в контейнере:
```bash
docker pull danlynn/bat
alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat'
```
### С помощью Ansible
Вы можете установить `bat` с [Ansible](https://www.ansible.com/):
```bash
# Устанавливаем роль на устройстве
ansible-galaxy install aeimer.install_bat
```
```yaml
---
# Playbook для установки bat
- host: all
roles:
- aeimer.install_bat
```
- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat)
- [GitHub](https://github.com/aeimer/ansible-install-bat)
Этот способ должен сработать со следующими дистрибутивами:
- Debian/Ubuntu
- ARM (например Raspberry PI)
- Arch Linux
- Void Linux
- FreeBSD
- macOS
### Из скомпилированных файлов
Перейдите на [страницу релизов](https://github.com/sharkdp/bat/releases) для
@@ -344,15 +388,24 @@ ansible-galaxy install aeimer.install_bat
### Из исходников
Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.74.0 или выше. После этого используйте `cargo`, чтобы все скомпилировать:
Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.79.0 или выше. После этого используйте `cargo`, чтобы всё скомпилировать:
```bash
cargo install --locked bat
```
Заметьте, что дополнительные файлы, такие как документация man и подсказки командной строки, не могут быть установлены таким способом.
Они будут сгенерированы командой `cargo` должны быть доступны в папке сборки (в `build`).
Подсказки командной строки также доступны при таком запуске:
```bash
bat --completion <shell>
# see --help for supported shells
```
## Кастомизация
### Темы для выделения текста
### Темы для подсветки синтаксиса
Используйте `bat --list-themes`, чтобы вывести список всех доступных тем. Для выбора темы `TwoDark` используйте `bat` с флагом
`--theme=TwoDark` или выставьте переменную окружения `BAT_THEME` в `TwoDark`. Используйте `export BAT_THEME="TwoDark"` в конфигурационном файле вашей оболочки, чтобы изменить ее навсегда. Или же используйте [конфигурационный файл](https://github.com/sharkdp/bat#configuration-file) `bat`.
@@ -372,7 +425,7 @@ bat --list-themes | fzf --preview="bat --theme={} --color=always /путь/к/ф
### Добавление новых синтаксисов
`bat` использует [`syntect`](https://github.com/trishume/syntect/) для выделения синтаксиса. `syntect` может читать
`bat` использует [`syntect`](https://github.com/trishume/syntect/) для подсветки синтаксиса. `syntect` может читать
[файл `.sublime-syntax`](https://www.sublimetext.com/docs/3/syntax.html)
и темы. Чтобы добавить новый синтаксис, сделайте следующее:
@@ -403,7 +456,7 @@ bat cache --clear
### Добавление новых тем
Это работает похожим образом, так же как и добавление новых тем выделения синтаксиса
Это работает похожим образом, так же как и добавление новых тем подсветки синтаксиса
Во-первых, создайте каталог с новыми темами для синтаксиса:
```bash
@@ -590,7 +643,7 @@ cargo install --locked --force
Есть очень много альтернатив `bat`. Смотрите [этот документ](doc/alternatives.md) для сравнения.
## Лицензия
Copyright (c) 2018-2021 [Разработчики bat](https://github.com/sharkdp/bat).
Copyright (c) 2018-2024 [Разработчики bat](https://github.com/sharkdp/bat).
`bat` распространяется под лицензиями MIT License и Apache License 2.0 (на выбор пользователя).
+12 -9
View File
@@ -150,7 +150,7 @@ git show v0.6.0:src/main.rs | bat -l rs
```bash
batdiff() {
git diff --name-only --diff-filter=d | xargs bat --diff
git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff
}
```
@@ -170,20 +170,23 @@ bat main.cpp | xclip
#### `man`
`bat`也能给`man`的输出上色。这需要设置`MANPAGER`环境变量:
`bat` 可以通过设置 `MANPAGER` 环境变量,用作 `man` 的彩色分页器
```bash
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
export MANPAGER="sh -c 'awk '\''{ gsub(/\x1B\[[0-9;]*m/, \"\", \$0); gsub(/.\x08/, \"\", \$0); print }'\'' | bat -p -lman'"
man 2 select
```
(如果你使用的是 Debian 或 Ubuntu使用`batcat`替换`bat`
(如果你使用 Debian 或 Ubuntu请将 `batcat` 替换`bat`
如果你遇到格式化问题,设置`MANROFFOPT="-c"`也许会有帮助
如果你希望将其打包为一个新的命令,也可以使用 [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)
`batman`能提供类似功能——作为一个独立的命令。
> [!WARNING]
> 在使用 Mandoc 的 `man` 实现时,这[无法](https://github.com/sharkdp/bat/issues/1145)直接工作。
>
> 请使用 `batman`,或将此 Shell 脚本包装为 [Shebang 可执行文件](https://en.wikipedia.org/wiki/Shebang_(Unix)),并将 `MANPAGER` 指向该文件。
注意[man page 语法](assets/syntaxes/02_Extra/Manpage.sublime-syntax) 还需要完善。在使用特定的`man`实现时该功能[无法正常工作](https://github.com/sharkdp/bat/issues/1145)
注意[Manpage 语法](assets/syntaxes/02_Extra/Manpage.sublime-syntax)是在此仓库中开发的,仍需一些改进
#### `prettier` / `shfmt` / `rustfmt`
@@ -401,8 +404,8 @@ bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
`bat` 自带三个 [8-bit 色彩](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 主题:
- `ansi` 适应于大部分终端。它使用 3-bit 色彩:黑红绿黄蓝洋红靛青白。
- `base16`专为 [base16](https://github.com/chriskempson/base16) 终端设计。它使用 4-bit 色彩(带有亮度的 3-bit 色彩)。根据 [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md) 制作。
- `base16-25`专为 [base16-shell](https://github.com/chriskempson/base16-shell) 设计。它把部分亮色替换为 8-bit 色彩。请不要直接使用该主题,除非你清楚你的256色终端是否使用 base16-shell。
- `base16`专为 [base16](https://github.com/tinted-theming/home) 终端设计。它使用 4-bit 色彩(带有亮度的 3-bit 色彩)。根据 [base16 styling guidelines](https://github.com/tinted-theming/home/blob/main/styling.md) 制作。
- `base16-25`专为 [base16-shell](https://github.com/tinted-theming/base16-shell) 设计。它把部分亮色替换为 8-bit 色彩。请不要直接使用该主题,除非你清楚你的256色终端是否使用 base16-shell。
尽管这些主题具有诸多限制,但具有一些 truecolor 主题不具有的三个优点:
+3 -3
View File
@@ -6,12 +6,12 @@ if you are not looking for a program like `bat`, this comparison might not be fo
| | bat | [pygments](http://pygments.org/) | [highlight](http://www.andre-simon.de/doku/highlight/highlight.php) | [ccat](https://github.com/jingweno/ccat) | [source-highlight](https://www.gnu.org/software/src-highlite/) | [hicat](https://github.com/rstacruz/hicat) | [coderay](https://github.com/rubychan/coderay) | [rouge](https://github.com/jneen/rouge) | [clp](https://github.com/jpe90/clp) |
|----------------------------------------------|---------------------------------------------------------------------|----------------------------------|---------------------------------------------------------------------|------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|
| Drop-in `cat` replacement | :heavy_check_mark: [*](https://github.com/sharkdp/bat/issues/134) | :x: | :x: | (:heavy_check_mark:) | :x: | :x: [*](https://github.com/rstacruz/hicat/issues/6) | :x: | :x: | :x: |
| Drop-in `cat` replacement | :heavy_check_mark:&nbsp;[*](https://github.com/sharkdp/bat/issues/134) | :x: | :x: | (✔️) | :x: | :x:&nbsp;[*](https://github.com/rstacruz/hicat/issues/6) | :x: | :x: | :x: |
| Git integration | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
| Automatic paging | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: |
| Languages (circa) | 150 | 300 | 200 | 7 | 80 | 130 | 30 | 130 | 150 |
| Extensible (languages, themes) | :heavy_check_mark: | (:heavy_check_mark:) | (:heavy_check_mark:) | :x: | (:heavy_check_mark:) | :x: | :x: | :x: | :heavy_check_mark: |
| Advanced highlighting (e.g. nested syntaxes) | :heavy_check_mark: | :heavy_check_mark: | (:heavy_check_mark:) ? | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Extensible (languages, themes) | :heavy_check_mark: | (✔️) | (✔️) | :x: | (✔️) | :x: | :x: | :x: | :heavy_check_mark: |
| Advanced highlighting (e.g. nested syntaxes) | :heavy_check_mark: | :heavy_check_mark: | (✔️) ? | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
| Execution time [ms] (`jquery-3.3.1.js`) | 422 | 455 | 299 | 39 | 208 | 287 | 128 | 740 | 22 |
| Execution time [ms] (`miniz.c`) | 27 | 169 | 19 | 4 | 36 | 131 | 58 | 231 | 4 |
| Execution time [ms] (957 kB XML file) | 215 | 296 | 236 | 165 | 83 | 412 | 135 | 386 | 127 |
+2 -2
View File
@@ -26,7 +26,7 @@ in the `.sublime-syntax` format.
4. Re-compile `bat`. At compilation time, the `syntaxes.bin` file will be stored inside the
`bat` binary.
5. Use `bat --list-languages` to check if the new languages are available.
5. Use `bat --list-languages` to check if the new languages are available. You may want to do something like ``export PATH="`pwd`/target/debug:$PATH"`` to ensure the locally compiled version is the one being used.
6. Add a syntax test for the new language. See [below](#Syntax-tests) for details.
@@ -102,4 +102,4 @@ The following files have been manually modified after converting from a `.tmLang
https://github.com/seanjames777/SML-Language-Definition/blob/master/sml.tmLanguage
* `Cabal.sublime_syntax` has been added manually from
https://github.com/SublimeHaskell/SublimeHaskell/ - we don't want to include the whole submodule because it includes other syntaxes ("Haskell improved") as well.
* `Lean.sublime-syntax` has been added manually from https://github.com/leanprover/vscode-lean/blob/master/syntaxes/lean.json via conversion.
* `Lean.sublime-syntax` has been added manually from https://github.com/leanprover/vscode-lean4/blob/master/vscode-lean4/syntaxes/lean4.json via conversion.
+27 -9
View File
@@ -37,6 +37,13 @@ Options:
name (like 'C++' or 'LaTeX') or possible file extension (like 'cpp', 'hpp' or 'md'). Use
'--list-languages' to show all supported language names and file extensions.
--fallback-syntax <fallback-syntax>
Set a fallback language for syntax highlighting when auto-detection fails. Unlike
'--language', this is only used when no syntax could be detected from filename, custom
syntax mappings, or first-line detection.
[aliases: --fallback-language]
-H, --highlight-line <N:M>
Highlight the specified line ranges with a different background color For example:
'--highlight-line 40' highlights line 40
@@ -61,8 +68,8 @@ Options:
Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
--wrap <mode>
Specify the text-wrapping mode (*auto*, never, character). The '--terminal-width' option
can be used in addition to control the output width.
Specify the text-wrapping mode (*auto*, never, character, word). The '--terminal-width'
option can be used in addition to control the output width.
-S, --chop-long-lines
Truncate all lines longer than screen width. Alias for '--wrap=never'.
@@ -87,22 +94,23 @@ Options:
--decorations <when>
Specify when to use the decorations that have been specified via '--style'. The automatic
mode only enables decorations if an interactive terminal is detected. Possible values:
*auto*, never, always.
mode only enables decorations if an interactive terminal is detected. The always mode will
show decorations even when piping output. Possible values: *auto*, never, always.
-f, --force-colorization
Alias for '--decorations=always --color=always'. This is useful if the output of bat is
piped to another program, but you want to keep the colorization/decorations.
--paging <when>
Specify when to use the pager. To disable the pager, use --paging=never' or its
Specify when to use the pager. To disable the pager, use '--paging=never' or its
alias,'-P'. To disable the pager permanently, set BAT_PAGING to 'never'. To control which
pager is used, see the '--pager' option. Possible values: *auto*, never, always.
--pager <command>
Determine which pager is used. This option will override the PAGER and BAT_PAGER
environment variables. The default pager is 'less'. To control when the pager is used, see
the '--paging' option. Example: '--pager "less -RF"'.
environment variables. The default pager is 'less'. If you provide '--pager=builtin', use
the built-in 'minus' pager. To control when the pager is used, see the '--paging' option.
Example: '--pager "less -RF"'.
-m, --map-syntax <glob:syntax>
Map a glob pattern to an existing syntax name. The glob pattern is matched on the full
@@ -193,14 +201,20 @@ Options:
'--line-range :40' prints lines 1 to 40
'--line-range 40:' prints lines 40 to the end of the file
'--line-range 40' only prints line 40
'--line-range -10:' prints the last 10 lines
'--line-range 30:+10' prints lines 30 to 40
'--line-range 35::5' prints lines 30 to 40 (line 35 with 5 lines of context)
'--line-range 30:40:2' prints lines 28 to 42 (range 30-40 with 2 lines of context)
-L, --list-languages
Display a list of supported languages for syntax highlighting.
-u, --unbuffered
This option exists for POSIX-compliance reasons ('u' is for 'unbuffered'). The output is
always unbuffered - this option is simply ignored.
Enable unbuffered input reading. When this flag is set, bat will display data as soon as
it is available, without waiting for a complete line. This is useful for streaming use
cases like 'tail -f logfile | bat -u --paging=never'. Note that line numbers are
automatically disabled in unbuffered mode, and syntax highlighting may be imperfect on
partial lines.
--completion <SHELL>
Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]
@@ -208,6 +222,10 @@ Options:
--diagnostic
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
Show acknowledgements.
+7 -1
View File
@@ -17,6 +17,8 @@ Options:
Show plain style (alias for '--style=plain').
-l, --language <language>
Set the language for syntax highlighting.
--fallback-syntax <fallback-syntax>
Set a fallback language for undetected syntaxes. [aliases: --fallback-language]
-H, --highlight-line <N:M>
Highlight lines N through M.
--file-name <name>
@@ -26,7 +28,7 @@ Options:
--tabs <T>
Set the tab width to T spaces.
--wrap <mode>
Specify the text-wrapping mode (*auto*, never, character).
Specify the text-wrapping mode (*auto*, never, character, word).
-S, --chop-long-lines
Truncate all lines longer than screen width. Alias for '--wrap=never'.
-n, --number
@@ -58,8 +60,12 @@ Options:
Only print the lines from N to M.
-L, --list-languages
Display all supported languages.
-u, --unbuffered
Enable unbuffered input reading for streaming use cases.
--completion <SHELL>
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
Print help (see more with '--help')
-V, --version
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

-11
View File
@@ -1,11 +0,0 @@
<svg width="1354" height="420" viewBox="0 0 1354 420" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="1354" height="420" rx="20" fill="white"/>
<path d="M434.751 133.122H466.637L489.595 227.729C493.852 245.585 494.697 256.219 494.697 256.219H495.128C495.128 256.219 496.61 245.808 500.867 227.729L522.757 133.122H558.9L582.066 227.729C586.53 246.223 587.598 256.219 587.598 256.219H588.236C588.236 256.219 588.666 246.223 592.907 227.729L615.02 133.122H646.907L606.523 288.313H571.017L546.576 194.344C541.474 173.936 541.044 164.801 541.044 164.801H540.614C540.614 164.801 540.183 173.936 535.512 194.344L512.553 288.313H475.996L434.751 133.122Z" fill="black"/>
<path d="M641.583 231.934C641.583 196.428 664.541 173.47 699.202 173.47C733.639 173.47 756.597 196.428 756.597 231.934C756.597 267.647 733.639 290.828 699.202 290.828C664.557 290.812 641.583 267.647 641.583 231.934ZM726.832 231.934C726.832 208.976 715.783 195.998 699.202 195.998C681.346 195.998 671.349 210.458 671.349 231.934C671.349 255.323 682.398 268.284 699.202 268.284C717.058 268.284 726.832 253.824 726.832 231.934Z" fill="black"/>
<path d="M770.836 175.21H799.103V196.048H799.741C804.635 185.207 816.322 174.365 836.299 174.365C839.695 174.365 841.831 174.796 843.314 175.21V203.478H842.469C842.469 203.478 839.918 202.633 832.903 202.633C811.013 202.633 799.103 215.594 799.103 239.828V288.295H770.836V175.21Z" fill="black"/>
<path d="M856.5 133.122H884.767V182.865C884.767 212.2 884.336 217.509 884.336 217.509H884.767L926.857 175.212H962.139L912.843 224.11L970.031 288.313H936.646L895.401 241.536L884.767 251.946V288.297H856.5V133.122Z" fill="black"/>
<path d="M970.444 211.285C970.444 163.455 1000.21 131.569 1044.85 131.569C1089.49 131.569 1119.26 163.455 1119.26 211.285C1119.26 259.114 1089.49 291.001 1044.85 291.001C1000.21 291.001 970.444 259.114 970.444 211.285ZM1088.42 211.285C1088.42 178.761 1071 156.855 1044.84 156.855C1018.67 156.855 1001.26 178.761 1001.26 211.285C1001.26 243.809 1018.69 265.715 1044.84 265.715C1070.98 265.715 1088.42 243.809 1088.42 211.285Z" fill="black"/>
<path d="M1130.08 236.656H1162.4C1162.4 254.943 1174.95 265.146 1194.08 265.146C1210.23 265.146 1221.29 257.063 1221.29 245.584C1221.29 232.622 1212.79 229.21 1185.79 223.901C1161.12 219.007 1134.98 210.716 1134.98 178.399C1134.98 151.408 1157.93 131 1193.01 131C1229.57 131 1252.11 150.132 1252.11 179.037H1219.79C1219.79 165.007 1208.95 156.286 1193.01 156.286C1176.86 156.286 1166.86 164.146 1166.86 175.625C1166.86 187.742 1173.88 192.413 1195.56 196.878C1227.65 203.685 1254.02 207.288 1254.02 243.001C1254.02 271.3 1229.36 290.432 1193.01 290.432C1156.02 290.432 1130.08 268.957 1130.08 236.656Z" fill="black"/>
<path d="M100 210C100 214.824 101.269 219.647 103.723 223.793L148.231 300.878C152.8 308.747 159.739 315.178 168.369 318.055C185.377 323.724 202.977 316.447 211.354 301.893L222.1 283.278L179.708 210L224.47 132.408L235.216 113.792C238.431 108.208 242.747 103.638 247.824 100H243.17H178.777C166.677 100 155.508 106.431 149.5 116.923L103.723 196.208C101.269 200.354 100 205.177 100 210Z" fill="#6363F1"/>
<path d="M353.847 210C353.847 205.177 352.578 200.353 350.124 196.207L305.024 118.107C296.647 103.638 279.047 96.3608 262.039 101.945C253.409 104.822 246.47 111.253 241.901 119.122L231.747 136.638L274.139 210L229.378 287.592L218.632 306.208C215.416 311.708 211.101 316.362 206.024 320H210.678H275.07C287.17 320 298.34 313.569 304.347 303.077L350.124 223.792C352.578 219.646 353.847 214.823 353.847 210Z" fill="#6363F1"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

+7 -2
View File
@@ -1,4 +1,6 @@
use bat::{assets::HighlightingAssets, config::Config, controller::Controller, Input};
use bat::{
assets::HighlightingAssets, config::Config, controller::Controller, output::OutputHandle, Input,
};
fn main() {
let mut buffer = String::new();
@@ -10,7 +12,10 @@ fn main() {
let controller = Controller::new(&config, &assets);
let input = Input::from_file(file!());
controller
.run(vec![input.into()], Some(&mut buffer))
.run(
vec![input.into()],
Some(&mut OutputHandle::FmtWrite(&mut buffer)),
)
.unwrap();
println!("{buffer}");
Generated
+27
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
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
];
};
}
);
};
}
+205 -29
View File
@@ -152,7 +152,7 @@ impl HighlightingAssets {
&self,
path: impl AsRef<Path>,
mapping: &SyntaxMapping,
) -> Result<SyntaxReferenceInSet> {
) -> Result<SyntaxReferenceInSet<'_>> {
let path = path.as_ref();
let syntax_match = mapping.get_syntax_for(path);
@@ -163,7 +163,7 @@ impl HighlightingAssets {
if let Some(MappingTarget::MapTo(syntax_name)) = syntax_match {
return self
.find_syntax_by_name(syntax_name)?
.find_syntax_by_token(syntax_name)?
.ok_or_else(|| Error::UnknownSyntax(syntax_name.to_owned()));
}
@@ -191,11 +191,11 @@ impl HighlightingAssets {
Some(theme) => theme,
None => {
if theme == "ansi-light" || theme == "ansi-dark" {
bat_warning!("Theme '{}' is deprecated, using 'ansi' instead.", theme);
bat_warning!("Theme '{theme}' is deprecated, using 'ansi' instead.");
return self.get_theme("ansi");
}
if !theme.is_empty() {
bat_warning!("Unknown theme '{}', using default.", theme)
bat_warning!("Unknown theme '{theme}', using default.")
}
self.get_theme_set()
.get(
@@ -210,9 +210,10 @@ impl HighlightingAssets {
pub(crate) fn get_syntax(
&self,
language: Option<&str>,
fallback_syntax: Option<&str>,
input: &mut OpenedInput,
mapping: &SyntaxMapping,
) -> Result<SyntaxReferenceInSet> {
) -> Result<SyntaxReferenceInSet<'_>> {
if let Some(language) = language {
let syntax_set = self.get_syntax_set()?;
return syntax_set
@@ -222,21 +223,50 @@ impl HighlightingAssets {
}
let path = input.path();
let path_syntax = if let Some(path) = path {
self.get_syntax_for_path(
PathAbs::new(path).map_or_else(|_| path.to_owned(), |p| p.as_path().to_path_buf()),
mapping,
)
let absolute_path = path.and_then(|p| {
PathAbs::new(p)
.ok()
.map(|abs| abs.as_path().to_path_buf())
.or_else(|| Some(p.to_owned()))
});
let path_syntax = if let Some(ref path) = absolute_path {
self.get_syntax_for_path(path, mapping).or_else(|e| {
// If syntax detection failed on the given path, retry with the
// canonicalized path (which resolves symlinks). This handles
// cases like `Aliases/0install -> ../Formula/zero-install.rb`
// where the symlink name has no extension but the target does.
// See #1001.
if matches!(e, Error::UndetectedSyntax(_)) {
if let Ok(resolved) = fs::canonicalize(path) {
if resolved != *path {
return match self.get_syntax_for_path(&resolved, mapping) {
Ok(syntax) => Ok(syntax),
Err(Error::UndetectedSyntax(_)) => Err(e),
Err(err) => Err(err),
};
}
}
}
Err(e)
})
} else {
Err(Error::UndetectedSyntax("[unknown]".into()))
};
// If a path wasn't provided, or if path based syntax detection
// above failed, we fall back to first-line syntax detection.
match path_syntax {
// If a path wasn't provided, or if path based syntax detection
// above failed, we fall back to first-line syntax detection.
Err(Error::UndetectedSyntax(path)) => self
.get_first_line_syntax(&mut input.reader)?
.ok_or(Error::UndetectedSyntax(path)),
Err(Error::UndetectedSyntax(path)) => {
if let Some(syntax_in_set) = self.get_first_line_syntax(&mut input.reader)? {
Ok(syntax_in_set)
} else if let Some(language) = fallback_syntax {
self.find_syntax_by_token(language)?
.ok_or_else(|| Error::UnknownSyntax(language.to_owned()))
} else {
Err(Error::UndetectedSyntax(path))
}
}
_ => path_syntax,
}
}
@@ -244,14 +274,17 @@ impl HighlightingAssets {
pub(crate) fn find_syntax_by_name(
&self,
syntax_name: &str,
) -> Result<Option<SyntaxReferenceInSet>> {
) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let syntax_set = self.get_syntax_set()?;
Ok(syntax_set
.find_syntax_by_name(syntax_name)
.map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
}
fn find_syntax_by_extension(&self, e: Option<&OsStr>) -> Result<Option<SyntaxReferenceInSet>> {
fn find_syntax_by_extension(
&self,
e: Option<&OsStr>,
) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let syntax_set = self.get_syntax_set()?;
let extension = e.and_then(|x| x.to_str()).unwrap_or_default();
Ok(syntax_set
@@ -259,12 +292,40 @@ impl HighlightingAssets {
.map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
}
fn find_syntax_by_hidden_file_name(
&self,
file_name: &OsStr,
) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let Some(hidden_file_extension) = file_name
.to_str()
.and_then(|name| name.strip_prefix('.'))
.filter(|name| !name.is_empty())
else {
return Ok(None);
};
// syntect stores `hidden_file_extensions` in the same extension list as
// regular file extensions, but dotfiles must be queried without the
// leading period.
self.find_syntax_by_extension(Some(OsStr::new(hidden_file_extension)))
}
fn find_syntax_by_token(&self, token: &str) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let syntax_set = self.get_syntax_set()?;
Ok(syntax_set
.find_syntax_by_token(token)
.map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
}
fn get_syntax_for_file_name(
&self,
file_name: &OsStr,
ignored_suffixes: &IgnoredSuffixes,
) -> Result<Option<SyntaxReferenceInSet>> {
) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let mut syntax = self.find_syntax_by_extension(Some(file_name))?;
if syntax.is_none() {
syntax = self.find_syntax_by_hidden_file_name(file_name)?;
}
if syntax.is_none() {
syntax =
ignored_suffixes.try_with_stripped_suffix(file_name, |stripped_file_name| {
@@ -279,7 +340,7 @@ impl HighlightingAssets {
&self,
file_name: &OsStr,
ignored_suffixes: &IgnoredSuffixes,
) -> Result<Option<SyntaxReferenceInSet>> {
) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let mut syntax = self.find_syntax_by_extension(Path::new(file_name).extension())?;
if syntax.is_none() {
syntax =
@@ -294,11 +355,15 @@ impl HighlightingAssets {
fn get_first_line_syntax(
&self,
reader: &mut InputReader,
) -> Result<Option<SyntaxReferenceInSet>> {
) -> Result<Option<SyntaxReferenceInSet<'_>>> {
let syntax_set = self.get_syntax_set()?;
Ok(String::from_utf8(reader.first_line.clone())
.ok()
.and_then(|l| syntax_set.find_syntax_by_first_line(&l))
.and_then(|l| {
// Strip UTF-8 BOM if present
let line = l.strip_prefix('\u{feff}').unwrap_or(&l);
syntax_set.find_syntax_by_first_line(line)
})
.map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }))
}
}
@@ -343,8 +408,7 @@ fn asset_from_cache<T: serde::de::DeserializeOwned>(
) -> Result<T> {
let contents = fs::read(path).map_err(|_| {
format!(
"Could not load cached {} '{}'",
description,
"Could not load cached {description} '{}'",
path.to_string_lossy()
)
})?;
@@ -370,7 +434,7 @@ mod tests {
pub temp_dir: TempDir,
}
impl<'a> SyntaxDetectionTest<'a> {
impl SyntaxDetectionTest<'_> {
fn new() -> Self {
SyntaxDetectionTest {
assets: HighlightingAssets::from_binary(),
@@ -382,11 +446,12 @@ mod tests {
fn get_syntax_name(
&self,
language: Option<&str>,
fallback_syntax: Option<&str>,
input: &mut OpenedInput,
mapping: &SyntaxMapping,
) -> String {
self.assets
.get_syntax(language, input, mapping)
.get_syntax(language, fallback_syntax, input, mapping)
.map(|syntax_in_set| syntax_in_set.syntax.name.clone())
.unwrap_or_else(|_| "!no syntax!".to_owned())
}
@@ -406,7 +471,7 @@ mod tests {
let dummy_stdin: &[u8] = &[];
let mut opened_input = input.open(dummy_stdin, None).unwrap();
self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping)
self.get_syntax_name(None, None, &mut opened_input, &self.syntax_mapping)
}
fn syntax_for_file_with_content_os(&self, file_name: &OsStr, first_line: &str) -> String {
@@ -416,7 +481,7 @@ mod tests {
let dummy_stdin: &[u8] = &[];
let mut opened_input = input.open(dummy_stdin, None).unwrap();
self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping)
self.get_syntax_name(None, None, &mut opened_input, &self.syntax_mapping)
}
#[cfg(unix)]
@@ -436,7 +501,7 @@ mod tests {
let input = Input::stdin().with_name(Some(file_name));
let mut opened_input = input.open(content, None).unwrap();
self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping)
self.get_syntax_name(None, None, &mut opened_input, &self.syntax_mapping)
}
fn syntax_is_same_for_inputkinds(&self, file_name: &str, content: &str) -> bool {
@@ -533,6 +598,41 @@ mod tests {
);
}
#[test]
fn syntax_detection_first_line_with_utf8_bom() {
let test = SyntaxDetectionTest::new();
// Test that XML files are detected correctly even with UTF-8 BOM
// The BOM should be stripped before first-line syntax detection
let xml_with_bom = "\u{feff}<?xml version=\"1.0\" encoding=\"utf-8\"?>";
assert_eq!(
test.syntax_for_file_with_content("unknown_file", xml_with_bom),
"XML"
);
// Test the specific .csproj case mentioned in the issue
// Even if .csproj has extension mapping, this tests first-line fallback
let csproj_content_with_bom = "\u{feff}<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">";
assert_eq!(
test.syntax_for_file_with_content("test.csproj", csproj_content_with_bom),
"XML"
);
// Test that shell scripts are detected correctly even with UTF-8 BOM
let script_with_bom = "\u{feff}#!/bin/bash";
assert_eq!(
test.syntax_for_file_with_content("unknown_script", script_with_bom),
"Bourne Again Shell (bash)"
);
// Test that PHP files are detected correctly even with UTF-8 BOM
let php_with_bom = "\u{feff}<?php";
assert_eq!(
test.syntax_for_file_with_content("unknown_php", php_with_bom),
"PHP"
);
}
#[test]
fn syntax_detection_with_custom_mapping() {
let mut test = SyntaxDetectionTest::new();
@@ -613,6 +713,55 @@ mod tests {
);
}
#[cfg(feature = "build-assets")]
#[test]
fn syntax_detection_hidden_file_extensions() {
let source_dir = TempDir::new().expect("creation of temporary source directory");
let cache_dir = TempDir::new().expect("creation of temporary cache directory");
let syntax_dir = source_dir.path().join("syntaxes");
std::fs::create_dir_all(&syntax_dir).expect("creation of syntax directory succeeds");
std::fs::write(
syntax_dir.join("HiddenFileExtension.sublime-syntax"),
r#"%YAML 1.2
---
name: Hidden File Extension
hidden_file_extensions:
- testrc
scope: source.hiddenfileextension
contexts:
main:
- match: .
scope: source.hiddenfileextension
"#,
)
.expect("custom syntax can be written");
build(
source_dir.path(),
false,
false,
cache_dir.path(),
env!("CARGO_PKG_VERSION"),
)
.expect("custom assets can be built");
let test = SyntaxDetectionTest {
assets: HighlightingAssets::from_cache(cache_dir.path())
.expect("custom syntax cache can be loaded"),
syntax_mapping: SyntaxMapping::new(),
temp_dir: TempDir::new().expect("creation of temporary directory"),
};
assert_eq!(test.syntax_for_file(".testrc"), "Hidden File Extension");
assert_eq!(
test.syntax_for_stdin_with_content(".testrc", b""),
"Hidden File Extension"
);
assert!(test.syntax_is_same_for_inputkinds(".testrc", ""));
}
#[cfg(unix)]
#[test]
fn syntax_detection_for_symlinked_file() {
@@ -634,8 +783,35 @@ mod tests {
let mut opened_input = input.open(dummy_stdin, None).unwrap();
assert_eq!(
test.get_syntax_name(None, &mut opened_input, &test.syntax_mapping),
test.get_syntax_name(None, None, &mut opened_input, &test.syntax_mapping),
"SSH Config"
);
}
#[cfg(unix)]
#[test]
fn syntax_detection_for_symlinked_file_by_target_extension() {
use std::os::unix::fs::symlink;
let test = SyntaxDetectionTest::new();
let formula_dir = test.temp_dir.path().join("Formula");
std::fs::create_dir(&formula_dir).unwrap();
let target = formula_dir.join("zero-install.rb");
File::create(&target).unwrap();
let aliases_dir = test.temp_dir.path().join("Aliases");
std::fs::create_dir(&aliases_dir).unwrap();
let link = aliases_dir.join("0install");
symlink(&target, &link).unwrap();
let input = Input::ordinary_file(&link);
let dummy_stdin: &[u8] = &[];
let mut opened_input = input.open(dummy_stdin, None).unwrap();
assert_eq!(
test.get_syntax_name(None, None, &mut opened_input, &test.syntax_mapping),
"Ruby"
);
}
}
+9 -9
View File
@@ -40,15 +40,15 @@ impl AssetsMetadata {
/// Load metadata about the stored cache file from the given folder.
///
/// There are several possibilities:
/// - We find a metadata.yaml file and are able to parse it
/// => return the contained information
/// - We find a metadata.yaml file and but are not able to parse it
/// => return a SerdeYamlError
/// - We do not find a metadata.yaml file but a syntaxes.bin or themes.bin file
/// => assume that these were created by an old version of bat and return
/// AssetsMetadata::default() without version information
/// - We do not find a metadata.yaml file and no cached assets
/// => no user provided assets are available, return None
/// - We find a `metadata.yaml` file and are able to parse it
/// - return the contained information
/// - We find a `metadata.yaml` file, but are not able to parse it
/// - return a [`Error::SerdeYamlError`]
/// - We do not find a `metadata.yaml` file but a `syntaxes.bin` or `themes.bin` file
/// - assume that these were created by an old version of bat and return
/// [`AssetsMetadata::default()`] without version information
/// - We do not find a `metadata.yaml` file and no cached assets
/// - no user provided assets are available, return `None`
pub fn load_from_folder(path: &Path) -> Result<Option<Self>> {
match Self::try_load_from_folder(path) {
Ok(metadata) => Ok(Some(metadata)),
+4 -10
View File
@@ -47,9 +47,8 @@ fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> Result
let res = theme_set.add_from_folder(&theme_dir);
if let Err(err) = res {
println!(
"Failed to load one or more themes from '{}' (reason: '{}')",
"Failed to load one or more themes from '{}' (reason: '{err}')",
theme_dir.to_string_lossy(),
err,
);
}
} else {
@@ -162,15 +161,10 @@ fn asset_to_cache<T: serde::Serialize>(
description: &str,
compressed: bool,
) -> Result<()> {
print!("Writing {} to {} ... ", description, path.to_string_lossy());
print!("Writing {description} to {} ... ", path.to_string_lossy());
let contents = asset_to_contents(asset, description, compressed)?;
std::fs::write(path, &contents[..]).map_err(|_| {
format!(
"Could not save {} to {}",
description,
path.to_string_lossy()
)
})?;
std::fs::write(path, &contents[..])
.map_err(|_| format!("Could not save {description} to {}", path.to_string_lossy()))?;
println!("okay");
Ok(())
}
+4 -1
View File
@@ -60,7 +60,7 @@ fn to_path_and_stem(source_dir: &Path, entry: DirEntry) -> Option<PathAndStem> {
fn handle_file(path_and_stem: &PathAndStem) -> Result<Option<String>> {
if path_and_stem.stem == "NOTICE" {
handle_notice(&path_and_stem.path)
} else if path_and_stem.stem.to_ascii_uppercase() == "LICENSE" {
} else if path_and_stem.stem.eq_ignore_ascii_case("LICENSE") {
handle_license(&path_and_stem.path)
} else {
Ok(None)
@@ -95,6 +95,9 @@ fn include_license_in_acknowledgments(license_text: &str) -> bool {
// Apache 2.0
"Apache License Version 2.0, January 2004 http://www.apache.org/licenses/",
"Licensed under the Apache License, Version 2.0 (the \"License\");",
// CC BY 4.0
"Creative Commons Attribution 4.0 International Public License",
];
license_contains_marker(license_text, &markers)
+296 -62
View File
@@ -3,6 +3,7 @@ use std::env;
use std::io::IsTerminal;
use std::path::{Path, PathBuf};
use std::str::FromStr;
use std::thread::available_parallelism;
use crate::{
clap_app,
@@ -37,9 +38,23 @@ pub fn env_no_color() -> bool {
env::var_os("NO_COLOR").is_some_and(|x| !x.is_empty())
}
enum HelpType {
Short,
Long,
}
pub struct App {
pub matches: ArgMatches,
interactive_output: bool,
/// True if -n / --number was passed on the command line
/// (not from config file or environment variables).
/// This is used to honor the flag when piping output, similar to `cat -n`.
number_from_cli: bool,
/// True if --wrap=character was passed on the command line
/// (not from config file or environment variables).
/// When piping output (non-interactive), --wrap=character is ignored unless
/// it was explicitly provided on the command line.
wrap_character_from_cli: bool,
}
impl App {
@@ -49,53 +64,233 @@ impl App {
let interactive_output = std::io::stdout().is_terminal();
// Check if the -n / --number option was passed on the command line
// (before merging with config file and environment variables).
// This is needed to honor the -n flag when piping output, similar to `cat -n`.
// We need to handle both standalone (-n, --number) and combined short flags (-pn, -An, etc.)
// Note: We only check if -n appears and is not overridden by -p in the same combined flag.
// For combined flags like -np, -p comes after -n and overrides it, so we don't count it.
// For combined flags like -pn, -n comes after -p and takes effect.
let number_from_cli = wild::args_os().any(|arg| {
let arg_str = arg.to_string_lossy();
if arg_str == "-n" || arg_str == "--number" {
return true;
}
// Handle combined short flags
// Only count -n if it's the LAST flag in the combined form (so -p doesn't override it)
// or if -p is not present in the combined form
if arg_str.starts_with('-') && !arg_str.starts_with("--") && arg_str.len() > 2 {
let chars: Vec<char> = arg_str.chars().skip(1).collect();
let n_pos = chars.iter().position(|&c| c == 'n');
let p_pos = chars.iter().position(|&c| c == 'p');
// -n is in the combined flag and either:
// - -p is not present, OR
// - -n comes after -p (so -n takes effect)
if let Some(n) = n_pos {
if p_pos.is_none() || n > p_pos.unwrap() {
return true;
}
}
}
false
});
// Check if --wrap=character was passed on the command line
// (before merging with config file and environment variables).
// This is needed to honor --wrap=character when piping output, while
// ignoring it when it comes only from the config file or BAT_OPTS.
let cli_args_vec: Vec<_> = wild::args_os().collect();
let wrap_character_from_cli = cli_args_vec
.iter()
.any(|arg| arg.to_string_lossy() == "--wrap=character")
|| cli_args_vec.windows(2).any(|pair| {
pair[0].to_string_lossy() == "--wrap" && pair[1].to_string_lossy() == "character"
});
let matches = Self::matches(interactive_output)?;
if matches.get_flag("help") {
let help_type = if wild::args_os().any(|arg| arg == "--help") {
HelpType::Long
} else {
HelpType::Short
};
let use_pager = match matches.get_one::<String>("paging").map(|s| s.as_str()) {
Some("never") => false,
_ => !matches.get_flag("no-paging"),
};
let use_color = match matches.get_one::<String>("color").map(|s| s.as_str()) {
Some("always") => true,
Some("never") => false,
_ => interactive_output, // auto: use color if interactive
};
let pager = matches.get_one::<String>("pager").map(|s| s.as_str());
let theme_options = Self::theme_options_from_matches(&matches);
let use_custom_assets = !matches.get_flag("no-custom-assets");
Self::display_help(
interactive_output,
help_type,
use_pager,
use_color,
pager,
theme_options,
use_custom_assets,
)?;
std::process::exit(0);
}
Ok(App {
matches: Self::matches(interactive_output)?,
matches,
interactive_output,
number_from_cli,
wrap_character_from_cli,
})
}
fn matches(interactive_output: bool) -> Result<ArgMatches> {
let args = if wild::args_os().nth(1) == Some("cache".into()) {
// Skip the config file and env vars
wild::args_os().collect::<Vec<_>>()
} else if wild::args_os().any(|arg| arg == "--no-config") {
// Skip the arguments in bats config file
let mut cli_args = wild::args_os();
let mut args = get_args_from_env_vars();
// Put the zero-th CLI argument (program name) first
args.insert(0, cli_args.next().unwrap());
// .. and the rest at the end
cli_args.for_each(|a| args.push(a));
args
} else {
let mut cli_args = wild::args_os();
// Read arguments from bats config file
let mut args = get_args_from_env_opts_var()
.unwrap_or_else(get_args_from_config_file)
.map_err(|_| "Could not parse configuration file")?;
// Selected env vars supersede config vars
args.extend(get_args_from_env_vars());
// Put the zero-th CLI argument (program name) first
args.insert(0, cli_args.next().unwrap());
// .. and the rest at the end
cli_args.for_each(|a| args.push(a));
args
fn display_help(
interactive_output: bool,
help_type: HelpType,
use_pager: bool,
use_color: bool,
pager: Option<&str>,
theme_options: ThemeOptions,
use_custom_assets: bool,
) -> Result<()> {
use crate::assets::assets_from_cache_or_binary;
use crate::directories::PROJECT_DIRS;
use bat::{
config::Config,
controller::Controller,
input::Input,
style::{StyleComponent, StyleComponents},
theme::theme,
PagingMode,
};
Ok(clap_app::build_app(interactive_output).get_matches_from(args))
let mut cmd = clap_app::build_app(interactive_output);
let help_text = match help_type {
HelpType::Short => cmd.render_help().to_string(),
HelpType::Long => cmd.render_long_help().to_string(),
};
let inputs: Vec<Input> = vec![Input::from_reader(Box::new(help_text.as_bytes()))];
let paging_mode = if use_pager {
PagingMode::QuitIfOneScreen
} else {
PagingMode::Never
};
let help_config = Config {
style_components: StyleComponents::new(StyleComponent::Plain.components(false)),
paging_mode,
pager,
colored_output: use_color,
true_color: use_color,
language: if use_color { Some("help") } else { None },
theme: theme(theme_options).to_string(),
..Default::default()
};
let cache_dir = PROJECT_DIRS.cache_dir();
let assets = assets_from_cache_or_binary(use_custom_assets, cache_dir)?;
Controller::new(&help_config, &assets)
.run(inputs, None)
.ok();
Ok(())
}
pub fn config(&self, inputs: &[Input]) -> Result<Config> {
/// Build argument list with env vars and CLI args (without config file)
fn build_args_without_config() -> Vec<std::ffi::OsString> {
let mut cli_args = wild::args_os();
let mut args = get_args_from_env_vars();
// Put the zero-th CLI argument (program name) first
args.insert(0, cli_args.next().unwrap());
// .. and the rest at the end
cli_args.for_each(|a| args.push(a));
args
}
fn matches(interactive_output: bool) -> Result<ArgMatches> {
// Check if we should skip config file processing for special arguments
// that don't require full application setup (version, diagnostic)
let should_skip_config = wild::args_os().any(|arg| {
matches!(
arg.to_str(),
Some("-V" | "--version" | "--diagnostic" | "--diagnostics")
)
});
// Check if help was requested - help should read the config file but be
// forgiving of invalid arguments (so configured theme etc. can be used)
let help_requested =
wild::args_os().any(|arg| matches!(arg.to_str(), Some("-h" | "--help")));
if wild::args_os().nth(1) == Some("cache".into()) {
// Skip the config file and env vars
let args = wild::args_os().collect::<Vec<_>>();
return Ok(clap_app::build_app(interactive_output).get_matches_from(args));
}
if wild::args_os().any(|arg| arg == "--no-config") || should_skip_config {
// Skip the arguments in bats config file when --no-config is present
// or when user requests version or diagnostic information
let args = Self::build_args_without_config();
return Ok(clap_app::build_app(interactive_output).get_matches_from(args));
}
// Build arguments with config file
let mut cli_args = wild::args_os();
// Read arguments from bats config file
let config_args = match get_args_from_env_opts_var() {
Some(result) => result,
None => get_args_from_config_file(),
};
// For help, ignore config file parse errors (use empty config instead)
// For non-help, propagate the error
let mut args = if help_requested {
config_args.unwrap_or_default()
} else {
config_args.map_err(|_| "Could not parse configuration file")?
};
// Selected env vars supersede config vars
args.extend(get_args_from_env_vars());
// Put the zero-th CLI argument (program name) first
args.insert(0, cli_args.next().unwrap());
// .. and the rest at the end
cli_args.for_each(|a| args.push(a));
// For help, try parsing with config, and if clap fails (e.g., invalid
// argument in config), fall back to parsing without config file args
if help_requested {
let app = clap_app::build_app(interactive_output);
match app.try_get_matches_from(args) {
Ok(matches) => Ok(matches),
Err(_) => {
// Config has invalid arguments, fall back to just env vars + CLI args
let fallback_args = Self::build_args_without_config();
Ok(clap_app::build_app(interactive_output).get_matches_from(fallback_args))
}
}
} else {
Ok(clap_app::build_app(interactive_output).get_matches_from(args))
}
}
pub fn config(&self, inputs: &[Input]) -> Result<Config<'_>> {
let style_components = self.style_components()?;
let extra_plain = self.matches.get_count("plain") > 1;
@@ -124,7 +319,10 @@ impl App {
// If we have -pp as an option when in auto mode, the pager should be disabled.
if extra_plain || self.matches.get_flag("no-paging") {
PagingMode::Never
} else if inputs.iter().any(Input::is_stdin) {
} else if inputs.iter().any(Input::is_stdin)
// ignore stdin when --list-themes is used because in that case no input will be read anyways
&& !self.matches.get_flag("list-themes")
{
// If we are reading from stdin, only enable paging if we write to an
// interactive terminal and if we do not *read* from an interactive
// terminal.
@@ -146,7 +344,9 @@ impl App {
// start building glob matchers for builtin mappings immediately
// this is an appropriate approach because it's statistically likely that
// all the custom mappings need to be checked
syntax_mapping.start_offload_build_all();
if available_parallelism()?.get() > 1 {
syntax_mapping.start_offload_build_all();
}
if let Some(values) = self.matches.get_many::<String>("ignored-suffix") {
for suffix in values {
@@ -202,6 +402,10 @@ impl App {
None
}
}),
fallback_syntax: self
.matches
.get_one::<String>("fallback-syntax")
.map(|s| s.as_str()),
show_nonprintable: self.matches.get_flag("show-all"),
nonprintable_notation: match self
.matches
@@ -217,27 +421,38 @@ impl App {
Some("no-printing") => BinaryBehavior::NoPrinting,
_ => unreachable!("other values for --binary are not allowed"),
},
wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
if !self.matches.get_flag("chop-long-lines") {
wrapping_mode: {
if self.matches.get_flag("chop-long-lines") {
WrappingMode::NoWrapping(true)
} else {
match self.matches.get_one::<String>("wrap").map(|s| s.as_str()) {
Some("character") => WrappingMode::Character,
Some("never") => WrappingMode::NoWrapping(true),
Some("auto") | None => {
if style_components.plain() {
Some("character") => {
if !self.interactive_output && !self.wrap_character_from_cli {
// When piping output (non-interactive), ignore --wrap=character
// unless it was explicitly provided on the command line.
WrappingMode::NoWrapping(false)
} else {
WrappingMode::Character
}
}
Some("word") => WrappingMode::Word,
Some("never") => WrappingMode::NoWrapping(true),
Some("auto") | None => {
if self.interactive_output || maybe_term_width.is_some() {
if style_components.plain() && maybe_term_width.is_none() {
WrappingMode::NoWrapping(false)
} else {
WrappingMode::Character
}
} else {
// We don't have the tty width when piping to another program.
// There's no point in wrapping when this is the case.
WrappingMode::NoWrapping(false)
}
}
_ => unreachable!("other values for --wrap are not allowed"),
}
} else {
WrappingMode::NoWrapping(true)
}
} else {
// We don't have the tty width when piping to another program.
// There's no point in wrapping when this is the case.
WrappingMode::NoWrapping(false)
},
colored_output: self.matches.get_flag("force-colorization")
|| match self.matches.get_one::<String>("color").map(|s| s.as_str()) {
@@ -255,7 +470,8 @@ impl App {
.get_one::<String>("decorations")
.map(|s| s.as_str())
== Some("always")
|| self.matches.get_flag("force-colorization")),
|| self.matches.get_flag("force-colorization")
|| self.number_from_cli),
tab_width: self
.matches
.get_one::<String>("tabs")
@@ -278,6 +494,8 @@ impl App {
Some("auto") => StripAnsiMode::Auto,
_ => unreachable!("other values for --strip-ansi are not allowed"),
},
quiet_empty: self.matches.get_flag("quiet-empty"),
unbuffered: self.matches.get_flag("unbuffered"),
theme: theme(self.theme_options()).to_string(),
visible_lines: match self.matches.try_contains_id("diff").unwrap_or_default()
&& self.matches.get_flag("diff")
@@ -332,7 +550,7 @@ impl App {
})
}
pub fn inputs(&self) -> Result<Vec<Input>> {
pub fn inputs(&self) -> Result<Vec<Input<'_>>> {
let filenames: Option<Vec<&Path>> = self
.matches
.get_many::<PathBuf>("file-name")
@@ -398,7 +616,17 @@ impl App {
// Plain if `--plain` is specified at least once.
if self.matches.get_count("plain") > 0 {
return Some(StyleComponents(HashSet::from([StyleComponent::Plain])));
let mut components = HashSet::from([StyleComponent::Plain]);
// When --diff is active, preserve change markers and snip separators
// so that diff output remains visually useful.
if self.matches.try_contains_id("diff").unwrap_or_default()
&& self.matches.get_flag("diff")
{
#[cfg(feature = "git")]
components.insert(StyleComponent::Changes);
components.insert(StyleComponent::Snip);
}
return Some(StyleComponents(components));
}
// Default behavior.
@@ -425,7 +653,7 @@ impl App {
None => StyleComponents(HashSet::from_iter(
StyleComponent::Default
.components(self.interactive_output)
.into_iter()
.iter()
.cloned(),
)),
};
@@ -435,21 +663,27 @@ impl App {
bat_warning!("Style 'rule' is a subset of style 'grid', 'rule' will not be visible.");
}
// Auto-disable line numbers in unbuffered mode to avoid confusion with partial lines
if self.matches.get_flag("unbuffered") {
styled_components.0.remove(&StyleComponent::LineNumbers);
}
Ok(styled_components)
}
fn theme_options(&self) -> ThemeOptions {
let theme = self
.matches
Self::theme_options_from_matches(&self.matches)
}
fn theme_options_from_matches(matches: &ArgMatches) -> ThemeOptions {
let theme = matches
.get_one::<String>("theme")
.map(|t| ThemePreference::from_str(t).unwrap())
.unwrap_or_default();
let theme_dark = self
.matches
let theme_dark = matches
.get_one::<String>("theme-dark")
.map(|t| ThemeName::from_str(t).unwrap());
let theme_light = self
.matches
let theme_light = matches
.get_one::<String>("theme-light")
.map(|t| ThemeName::from_str(t).unwrap());
ThemeOptions {
+1 -1
View File
@@ -50,7 +50,7 @@ fn clear_asset(path: PathBuf, description: &str) {
println!("skipped (not present)");
}
Err(err) => {
println!("could not remove the cache file {:?}: {}", &path, err);
println!("could not remove the cache file {path:?}: {err}");
}
Ok(_) => println!("okay"),
}
+73 -21
View File
@@ -1,7 +1,5 @@
use bat::style::StyleComponentList;
use clap::{
crate_name, crate_version, value_parser, Arg, ArgAction, ArgGroup, ColorChoice, Command,
};
use clap::{crate_name, crate_version, value_parser, Arg, ArgAction, ColorChoice, Command};
use once_cell::sync::Lazy;
use std::env;
use std::path::{Path, PathBuf};
@@ -16,7 +14,7 @@ static VERSION: Lazy<String> = Lazy::new(|| {
if git_version.is_empty() {
crate_version!().to_string()
} else {
format!("{} ({})", crate_version!(), git_version)
format!("{} ({git_version})", crate_version!())
}
});
@@ -34,6 +32,8 @@ pub fn build_app(interactive_output: bool) -> Command {
.args_conflicts_with_subcommands(true)
.allow_external_subcommands(true)
.disable_help_subcommand(true)
.disable_help_flag(true)
.disable_version_flag(true)
.max_term_width(100)
.about("A cat(1) clone with wings.")
.long_about("A cat(1) clone with syntax highlighting and Git integration.")
@@ -120,6 +120,17 @@ pub fn build_app(interactive_output: bool) -> Command {
language names and file extensions.",
),
)
.arg(
Arg::new("fallback-syntax")
.long("fallback-syntax")
.visible_alias("fallback-language")
.help("Set a fallback language for undetected syntaxes.")
.long_help(
"Set a fallback language for syntax highlighting when auto-detection fails. \
Unlike '--language', this is only used when no syntax could be detected from \
filename, custom syntax mappings, or first-line detection.",
),
)
.arg(
Arg::new("highlight-line")
.long("highlight-line")
@@ -211,11 +222,11 @@ pub fn build_app(interactive_output: bool) -> Command {
.long("wrap")
.overrides_with("wrap")
.value_name("mode")
.value_parser(["auto", "never", "character"])
.value_parser(["auto", "never", "character", "word"])
.default_value("auto")
.hide_default_value(true)
.help("Specify the text-wrapping mode (*auto*, never, character).")
.long_help("Specify the text-wrapping mode (*auto*, never, character). \
.help("Specify the text-wrapping mode (*auto*, never, character, word).")
.long_help("Specify the text-wrapping mode (*auto*, never, character, word). \
The '--terminal-width' option can be used in addition to \
control the output width."),
)
@@ -299,9 +310,10 @@ pub fn build_app(interactive_output: bool) -> Command {
.help("When to show the decorations (*auto*, never, always).")
.long_help(
"Specify when to use the decorations that have been specified \
via '--style'. The automatic mode only enables decorations if \
an interactive terminal is detected. Possible values: *auto*, never, always.",
),
via '--style'. The automatic mode only enables decorations if \
an interactive terminal is detected. The always mode will show \
decorations even when piping output. Possible values: *auto*, never, always.",
)
)
.arg(
Arg::new("force-colorization")
@@ -328,7 +340,7 @@ pub fn build_app(interactive_output: bool) -> Command {
.help("Specify when to use the pager, or use `-P` to disable (*auto*, never, always).")
.long_help(
"Specify when to use the pager. To disable the pager, use \
--paging=never' or its alias,'-P'. To disable the pager permanently, \
'--paging=never' or its alias,'-P'. To disable the pager permanently, \
set BAT_PAGING to 'never'. To control which pager is used, see the \
'--pager' option. Possible values: *auto*, never, always."
),
@@ -354,6 +366,7 @@ pub fn build_app(interactive_output: bool) -> Command {
.long_help(
"Determine which pager is used. This option will override the \
PAGER and BAT_PAGER environment variables. The default pager is 'less'. \
If you provide '--pager=builtin', use the built-in 'minus' pager. \
To control when the pager is used, see the '--paging' option. \
Example: '--pager \"less -RF\"'."
),
@@ -517,6 +530,7 @@ pub fn build_app(interactive_output: bool) -> Command {
.short('r')
.action(ArgAction::Append)
.value_name("N:M")
.allow_hyphen_values(true)
.help("Only print the lines from N to M.")
.long_help(
"Only print the specified range of lines for each file. \
@@ -525,7 +539,10 @@ pub fn build_app(interactive_output: bool) -> Command {
'--line-range :40' prints lines 1 to 40\n \
'--line-range 40:' prints lines 40 to the end of the file\n \
'--line-range 40' only prints line 40\n \
'--line-range 30:+10' prints lines 30 to 40",
'--line-range -10:' prints the last 10 lines\n \
'--line-range 30:+10' prints lines 30 to 40\n \
'--line-range 35::5' prints lines 30 to 40 (line 35 with 5 lines of context)\n \
'--line-range 30:40:2' prints lines 28 to 42 (range 30-40 with 2 lines of context)",
),
)
.arg(
@@ -542,11 +559,14 @@ pub fn build_app(interactive_output: bool) -> Command {
.short('u')
.long("unbuffered")
.action(ArgAction::SetTrue)
.hide_short_help(true)
.help("Enable unbuffered input reading for streaming use cases.")
.long_help(
"This option exists for POSIX-compliance reasons ('u' is for \
'unbuffered'). The output is always unbuffered - this option \
is simply ignored.",
"Enable unbuffered input reading. When this flag is set, bat will \
display data as soon as it is available, without waiting for a \
complete line. This is useful for streaming use cases like \
'tail -f logfile | bat -u --paging=never'. Note that line numbers \
are automatically disabled in unbuffered mode, and syntax \
highlighting may be imperfect on partial lines.",
),
)
.arg(
@@ -635,6 +655,18 @@ pub fn build_app(interactive_output: bool) -> Command {
.hide_short_help(true)
.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::new("acknowledgements")
.long("acknowledgements")
@@ -648,6 +680,21 @@ pub fn build_app(interactive_output: bool) -> Command {
.action(ArgAction::SetTrue)
.hide_short_help(true)
.help("Sets terminal title to filenames when using a pager."),
)
.arg(
Arg::new("help")
.short('h')
.long("help")
.action(ArgAction::SetTrue)
.help("Print help (see more with '--help')")
.long_help("Print help (see a summary with '-h')"),
)
.arg(
Arg::new("version")
.long("version")
.short('V')
.action(ArgAction::Version)
.help("Print version"),
);
// Check if the current directory contains a file name cache. Otherwise,
@@ -659,11 +706,20 @@ pub fn build_app(interactive_output: bool) -> Command {
Command::new("cache")
.hide(true)
.about("Modify the syntax-definition and theme cache")
.arg_required_else_help(true)
.arg(
Arg::new("help")
.short('h')
.long("help")
.action(ArgAction::Help)
.help("Print help"),
)
.arg(
Arg::new("build")
.long("build")
.short('b')
.action(ArgAction::SetTrue)
.conflicts_with("clear")
.help("Initialize (or update) the syntax/theme cache.")
.long_help(
"Initialize (or update) the syntax/theme cache by loading from \
@@ -675,13 +731,9 @@ pub fn build_app(interactive_output: bool) -> Command {
.long("clear")
.short('c')
.action(ArgAction::SetTrue)
.conflicts_with("build")
.help("Remove the cached syntax definitions and themes."),
)
.group(
ArgGroup::new("cache-actions")
.args(["build", "clear"])
.required(true),
)
.arg(
Arg::new("source")
.long("source")
+56 -6
View File
@@ -2,7 +2,7 @@ use std::env;
use std::ffi::OsString;
use std::fs;
use std::io::{self, Write};
use std::path::PathBuf;
use std::path::{Path, PathBuf};
use crate::directories::PROJECT_DIRS;
@@ -88,9 +88,8 @@ pub fn generate_config_file() -> bat::error::Result<()> {
fs::write(&config_file, default_config).map_err(|e| {
format!(
"Failed to create config file at '{}': {}",
"Failed to create config file at '{}': {e}",
config_file.to_string_lossy(),
e
)
})?;
@@ -105,18 +104,32 @@ pub fn generate_config_file() -> bat::error::Result<()> {
pub fn get_args_from_config_file() -> Result<Vec<OsString>, shell_words::ParseError> {
let mut config = String::new();
if let Ok(c) = fs::read_to_string(system_config_file()) {
let system_config = system_config_file();
let user_config = config_file();
if let Ok(c) = fs::read_to_string(&system_config) {
config.push_str(&c);
config.push('\n');
}
if let Ok(c) = fs::read_to_string(config_file()) {
config.push_str(&c);
// Skip the user config if it resolves to the same file as the system config,
// which can happen when BAT_CONFIG_DIR is set to e.g. "/etc/bat". See #3589.
if !same_file(&system_config, &user_config) {
if let Ok(c) = fs::read_to_string(&user_config) {
config.push_str(&c);
}
}
get_args_from_str(&config)
}
fn same_file(a: &Path, b: &Path) -> bool {
match (fs::canonicalize(a), fs::canonicalize(b)) {
(Ok(a), Ok(b)) => a == b,
_ => a == b,
}
}
pub fn get_args_from_env_opts_var() -> Option<Result<Vec<OsString>, shell_words::ParseError>> {
env::var("BAT_OPTS").ok().map(|s| get_args_from_str(&s))
}
@@ -215,3 +228,40 @@ fn comments() {
get_args_from_str(config).unwrap()
);
}
#[test]
fn same_file_identical_paths() {
let dir = tempfile::tempdir().unwrap();
let file = dir.path().join("config");
fs::write(&file, "").unwrap();
assert!(same_file(&file, &file));
}
#[test]
fn same_file_different_paths() {
let dir = tempfile::tempdir().unwrap();
let a = dir.path().join("a");
let b = dir.path().join("b");
fs::write(&a, "").unwrap();
fs::write(&b, "").unwrap();
assert!(!same_file(&a, &b));
}
#[test]
fn same_file_nonexistent() {
let dir = tempfile::tempdir().unwrap();
let a = dir.path().join("a");
let b = dir.path().join("b");
assert!(!same_file(&a, &b));
}
#[cfg(unix)]
#[test]
fn same_file_via_symlink() {
let dir = tempfile::tempdir().unwrap();
let original = dir.path().join("config");
let link = dir.path().join("link");
fs::write(&original, "").unwrap();
std::os::unix::fs::symlink(&original, &link).unwrap();
assert!(same_file(&original, &link));
}
+1 -1
View File
@@ -5,7 +5,7 @@ pub fn new_file_input<'a>(file: &'a Path, name: Option<&'a Path>) -> Input<'a> {
named(Input::ordinary_file(file), name.or(Some(file)))
}
pub fn new_stdin_input(name: Option<&Path>) -> Input {
pub fn new_stdin_input(name: Option<&Path>) -> Input<'_> {
named(Input::stdin(), name)
}
+24 -18
View File
@@ -16,6 +16,7 @@ use std::io::{BufReader, Write};
use std::path::Path;
use std::process;
use bat::output::{OutputHandle, OutputType};
use bat::theme::DetectColorScheme;
use nu_ansi_term::Color::Green;
use nu_ansi_term::Style;
@@ -161,7 +162,7 @@ pub fn get_languages(config: &Config, cache_dir: &Path) -> Result<String> {
};
for lang in languages {
write!(result, "{:width$}{}", lang.name, separator, width = longest).ok();
write!(result, "{:width$}{separator}", lang.name, width = longest).ok();
// Number of characters on this line so far, wrap before `desired_width`
let mut num_chars = 0;
@@ -172,7 +173,7 @@ pub fn get_languages(config: &Config, cache_dir: &Path) -> Result<String> {
let new_chars = word.len() + comma_separator.len();
if num_chars + new_chars >= desired_width {
num_chars = 0;
write!(result, "\n{:width$}{}", "", separator, width = longest).ok();
write!(result, "\n{:width$}{separator}", "", width = longest).ok();
}
num_chars += new_chars;
@@ -205,12 +206,12 @@ pub fn list_themes(
config.language = Some("Rust");
config.style_components = StyleComponents(style);
let stdout = io::stdout();
let mut stdout = stdout.lock();
let default_theme_name = default_theme(color_scheme(detect_color_scheme).unwrap_or_default());
let mut buf = String::new();
let mut handle = OutputHandle::FmtWrite(&mut buf);
for theme in assets.themes() {
let default_theme_info = if !config.loop_through && default_theme_name == theme {
let default_theme_info = if default_theme_name == theme {
" (default)"
} else if default_theme(ColorScheme::Dark) == theme {
" (default dark)"
@@ -219,34 +220,39 @@ pub fn list_themes(
} else {
""
};
if config.colored_output {
writeln!(
stdout,
"Theme: {}{}\n",
handle.write_fmt(format_args!(
"{}{default_theme_info}\n\n",
Style::new().bold().paint(theme.to_string()),
default_theme_info
)?;
))?;
config.theme = theme.to_string();
Controller::new(&config, &assets)
.run(vec![theme_preview_file()], None)
.run(vec![theme_preview_file()], Some(&mut handle))
.ok();
writeln!(stdout)?;
handle.write_fmt(format_args!("\n"))?;
} else if config.loop_through {
handle.write_fmt(format_args!("{theme}\n"))?;
} else {
writeln!(stdout, "{theme}{default_theme_info}")?;
handle.write_fmt(format_args!("{theme}{default_theme_info}\n"))?;
}
}
if config.colored_output {
writeln!(
stdout,
handle.write_fmt(format_args!(
"Further themes can be installed to '{}', \
and are added to the cache with `bat cache --build`. \
For more information, see:\n\n \
https://github.com/sharkdp/bat#adding-new-themes",
config_dir.join("themes").to_string_lossy()
)?;
))?;
}
let mut output_type =
OutputType::from_mode(config.paging_mode, config.wrapping_mode, config.pager)?;
let mut writer = output_type.handle()?;
writer.write_fmt(format_args!("{buf}"))?;
Ok(())
}
@@ -356,7 +362,7 @@ fn run() -> Result<bool> {
"fish" => println!("{}", completions::FISH_COMPLETION),
"ps1" => println!("{}", completions::PS1_COMPLETION),
"zsh" => println!("{}", completions::ZSH_COMPLETION),
_ => unreachable!("No completion for shell '{}' available.", shell),
_ => unreachable!("No completion for shell '{shell}' available."),
}
return Ok(true);
}
+105 -5
View File
@@ -38,6 +38,9 @@ pub struct Config<'a> {
/// The explicitly configured language, if any
pub language: Option<&'a str>,
/// The fallback syntax used when auto-detection fails
pub fallback_syntax: Option<&'a str>,
/// Whether or not to show/replace non-printable characters like space, tab and newline.
pub show_nonprintable: bool,
@@ -99,14 +102,20 @@ pub struct Config<'a> {
#[cfg(feature = "lessopen")]
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,
/// The maximum number of consecutive empty lines to display
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,
/// Whether or not to produce no output when input is empty
pub quiet_empty: bool,
/// Whether or not to use unbuffered input reading for streaming use cases
pub unbuffered: bool,
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
@@ -114,22 +123,113 @@ pub fn get_pager_executable(config_pager: Option<&str>) -> Option<String> {
crate::pager::get_pager(config_pager)
.ok()
.flatten()
.map(|pager| pager.bin)
.and_then(|pager| {
if pager.kind != crate::pager::PagerKind::Builtin {
Some(pager.bin)
} else {
None
}
})
}
#[test]
fn default_config_should_include_all_lines() {
use crate::line_range::MaxBufferedLineNumber;
use crate::line_range::RangeCheckResult;
assert_eq!(LineRanges::default().check(17), RangeCheckResult::InRange);
assert_eq!(
LineRanges::default().check(17, MaxBufferedLineNumber::Tentative(17)),
RangeCheckResult::InRange
);
}
#[test]
fn default_config_should_highlight_no_lines() {
use crate::line_range::MaxBufferedLineNumber;
use crate::line_range::RangeCheckResult;
assert_ne!(
Config::default().highlighted_lines.0.check(17),
Config::default()
.highlighted_lines
.0
.check(17, MaxBufferedLineNumber::Tentative(17)),
RangeCheckResult::InRange
);
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_with_config_pager_less() {
let result = get_pager_executable(Some("less"));
assert_eq!(result, Some("less".to_string()));
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_with_config_pager_builtin() {
let result = get_pager_executable(Some("builtin"));
assert_eq!(result, None);
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_with_config_pager_more() {
let result = get_pager_executable(Some("more"));
assert_eq!(result, Some("more".to_string()));
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_with_bat_pager() {
std::env::set_var("BAT_PAGER", "most");
let result = get_pager_executable(None);
assert_eq!(result, Some("most".to_string()));
std::env::remove_var("BAT_PAGER");
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_with_pager_more_switches_to_less() {
std::env::set_var("PAGER", "more");
let result = get_pager_executable(None);
assert_eq!(result, Some("less".to_string()));
std::env::remove_var("PAGER");
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_default() {
// Ensure no env vars
std::env::remove_var("BAT_PAGER");
std::env::remove_var("PAGER");
let result = get_pager_executable(None);
assert_eq!(result, Some("less".to_string()));
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_name_ignoring_arguments() {
let result = get_pager_executable(Some("foo --bar"));
assert_eq!(result, Some("foo".to_string()));
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_name_ignoring_path() {
let result = get_pager_executable(Some("/bin/foo test"));
assert_eq!(result, Some("/bin/foo".to_string()));
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_invalid_command() {
let result = get_pager_executable(Some("invalid ' command"));
assert_eq!(result, None);
}
#[cfg(all(feature = "minimal-application", feature = "paging"))]
#[test]
fn get_pager_executable_empty_config() {
let result = get_pager_executable(Some(""));
assert_eq!(result, None);
}
+85 -27
View File
@@ -1,5 +1,3 @@
use std::io::{self, BufRead, Write};
use crate::assets::HighlightingAssets;
use crate::config::{Config, VisibleLines};
#[cfg(feature = "git")]
@@ -10,11 +8,14 @@ use crate::input::{Input, InputReader, OpenedInput};
use crate::lessopen::LessOpenPreprocessor;
#[cfg(feature = "git")]
use crate::line_range::LineRange;
use crate::line_range::{LineRanges, RangeCheckResult};
use crate::output::OutputType;
use crate::line_range::{LineRanges, MaxBufferedLineNumber, RangeCheckResult};
use crate::output::{OutputHandle, OutputType};
#[cfg(feature = "paging")]
use crate::paging::PagingMode;
use crate::printer::{InteractivePrinter, OutputHandle, Printer, SimplePrinter};
use crate::printer::{InteractivePrinter, Printer, SimplePrinter};
use std::collections::VecDeque;
use std::io::{self, BufRead, Write};
use std::mem;
use clircle::{Clircle, Identifier};
@@ -25,7 +26,7 @@ pub struct Controller<'a> {
preprocessor: Option<LessOpenPreprocessor>,
}
impl<'b> Controller<'b> {
impl Controller<'_> {
pub fn new<'a>(config: &'a Config, assets: &'a HighlightingAssets) -> Controller<'a> {
Controller {
config,
@@ -38,21 +39,23 @@ impl<'b> Controller<'b> {
pub fn run(
&self,
inputs: Vec<Input>,
output_buffer: Option<&mut dyn std::fmt::Write>,
output_handle: Option<&mut OutputHandle<'_>>,
) -> Result<bool> {
self.run_with_error_handler(inputs, output_buffer, default_error_handler)
self.run_with_error_handler(inputs, output_handle, default_error_handler)
}
pub fn run_with_error_handler(
&self,
inputs: Vec<Input>,
output_buffer: Option<&mut dyn std::fmt::Write>,
output_handle: Option<&mut OutputHandle<'_>>,
mut handle_error: impl FnMut(&Error, &mut dyn Write),
) -> Result<bool> {
let mut output_type;
// only create our own OutputType if no output handle was provided.
#[allow(unused_mut)]
let mut output_type_opt: Option<OutputType> = None;
#[cfg(feature = "paging")]
{
if output_handle.is_none() {
use crate::input::InputKind;
use std::path::Path;
@@ -73,24 +76,35 @@ impl<'b> Controller<'b> {
let wrapping_mode = self.config.wrapping_mode;
output_type = OutputType::from_mode(paging_mode, wrapping_mode, self.config.pager)?;
output_type_opt = Some(OutputType::from_mode(
paging_mode,
wrapping_mode,
self.config.pager,
)?);
}
#[cfg(not(feature = "paging"))]
{
output_type = OutputType::stdout();
if output_handle.is_none() {
output_type_opt = Some(OutputType::stdout());
}
let attached_to_pager = output_type.is_pager();
let attached_to_pager = match (&output_handle, &output_type_opt) {
(Some(_), _) => true,
(None, Some(ot)) => ot.is_pager(),
(None, None) => false,
};
let stdout_identifier = if cfg!(windows) || attached_to_pager {
None
} else {
clircle::Identifier::stdout()
};
let mut writer = match output_buffer {
Some(buf) => OutputHandle::FmtWrite(buf),
None => OutputHandle::IoWrite(output_type.handle()?),
let mut writer = match (output_handle, &mut output_type_opt) {
(Some(OutputHandle::FmtWrite(w)), _) => OutputHandle::FmtWrite(w),
(Some(OutputHandle::IoWrite(w)), _) => OutputHandle::IoWrite(w),
(None, Some(ot)) => ot.handle()?,
(None, None) => unreachable!("No output handle and no output type available"),
};
let mut no_errors: bool = true;
let stderr = io::stderr();
@@ -144,6 +158,7 @@ impl<'b> Controller<'b> {
#[cfg(not(feature = "lessopen"))]
input.open(stdin, stdout_identifier)?
};
opened_input.reader.unbuffered = self.config.unbuffered;
#[cfg(feature = "git")]
let line_changes = if self.config.visible_lines.diff_mode()
|| (!self.config.loop_through && self.config.style_components.changes())
@@ -241,20 +256,63 @@ impl<'b> Controller<'b> {
reader: &mut InputReader,
line_ranges: &LineRanges,
) -> Result<()> {
let mut line_buffer = Vec::new();
let mut line_number: usize = 1;
let mut current_line_buffer: Vec<u8> = Vec::new();
let mut current_line_number: usize = 1;
// Buffer needs to be 1 greater than the offset to have a look-ahead line for EOF
let buffer_size: usize = line_ranges.largest_offset_from_end() + 1;
// Buffers multiple line data and line number
let mut buffered_lines: VecDeque<(Vec<u8>, usize)> = VecDeque::with_capacity(buffer_size);
let mut reached_eof: bool = false;
let mut first_range: bool = true;
let mut mid_range: bool = false;
let style_snip = self.config.style_components.snip();
while reader.read_line(&mut line_buffer)? {
match line_ranges.check(line_number) {
loop {
if reached_eof && buffered_lines.is_empty() {
// Done processing all lines
break;
}
if !reached_eof {
if reader.read_line(&mut current_line_buffer)? {
// Fill the buffer
buffered_lines
.push_back((mem::take(&mut current_line_buffer), current_line_number));
current_line_number += 1;
} else {
// No more data to read
reached_eof = true;
}
}
if buffered_lines.len() < buffer_size && !reached_eof {
// The buffer needs to be completely filled first
continue;
}
let Some((line, line_nr)) = buffered_lines.pop_front() else {
break;
};
// Determine if the last line number in the buffer is the last line of the file or
// just a line somewhere in the file
let max_buffered_line_number = buffered_lines
.back()
.map(|(_, max_line_number)| {
if reached_eof {
MaxBufferedLineNumber::Final(*max_line_number)
} else {
MaxBufferedLineNumber::Tentative(*max_line_number)
}
})
.unwrap_or(MaxBufferedLineNumber::Final(line_nr));
match line_ranges.check(line_nr, max_buffered_line_number) {
RangeCheckResult::BeforeOrBetweenRanges => {
// Call the printer in case we need to call the syntax highlighter
// for this line. However, set `out_of_range` to `true`.
printer.print_line(true, writer, line_number, &line_buffer)?;
printer.print_line(true, writer, line_nr, &line, max_buffered_line_number)?;
mid_range = false;
}
@@ -269,15 +327,15 @@ impl<'b> Controller<'b> {
}
}
printer.print_line(false, writer, line_number, &line_buffer)?;
printer.print_line(false, writer, line_nr, &line, max_buffered_line_number)?;
if self.config.unbuffered {
writer.flush()?;
}
}
RangeCheckResult::AfterLastRange => {
break;
}
}
line_number += 1;
line_buffer.clear();
}
Ok(())
}
+10 -3
View File
@@ -28,6 +28,9 @@ pub enum Error {
InvalidPagerValueBat,
#[error("{0}")]
Msg(String),
#[cfg(feature = "paging")]
#[error(transparent)]
MinusError(#[from] ::minus::MinusError),
#[cfg(feature = "lessopen")]
#[error(transparent)]
VarError(#[from] ::std::env::VarError),
@@ -60,14 +63,18 @@ pub fn default_error_handler(error: &Error, output: &mut dyn Write) {
Error::SerdeYamlError(_) => {
writeln!(
output,
"{}: Error while parsing metadata.yaml file: {}",
"{}: Error while parsing metadata.yaml file: {error}",
Red.paint("[bat error]"),
error
)
.ok();
}
_ => {
writeln!(output, "{}: {}", Red.paint("[bat error]"), error).ok();
writeln!(
&mut std::io::stderr().lock(),
"{}: {error}",
Red.paint("[bat error]"),
)
.ok();
}
};
}

Some files were not shown because too many files have changed in this diff Show More