mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-11-04 09:01:56 +00:00 
			
		
		
		
	Merge branch 'master' into fix/2731_plain_override
This commit is contained in:
		@@ -9,6 +9,7 @@
 | 
			
		||||
- Syntax highlighting for JavaScript files that start with `#!/usr/bin/env bun` #2913 (@sharunkumar)
 | 
			
		||||
- `bat --strip-ansi={never,always,auto}` to remove ANSI escape sequences from bat's input, see #2999 (@eth-p)
 | 
			
		||||
- Add or remove individual style components without replacing all styles #2929 (@eth-p)
 | 
			
		||||
- Add option `--binary=as-text` for printing binary content, see issue #2974 and PR #2976 (@einfachIrgendwer0815)
 | 
			
		||||
 | 
			
		||||
## Bugfixes
 | 
			
		||||
 | 
			
		||||
@@ -45,6 +46,7 @@
 | 
			
		||||
- Use bat's ANSI iterator during tab expansion, see #2998 (@eth-p)
 | 
			
		||||
- Support 'statically linked binary' for aarch64 in 'Release' page, see #2992 (@tzq0301)
 | 
			
		||||
- Update options in shell completions and the man page of `bat`, see #2995 (@akinomyoga)
 | 
			
		||||
- Update nix dev-dependency to v0.29.0, see #3112 (@decathorpe)
 | 
			
		||||
 | 
			
		||||
## Syntaxes
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +63,7 @@
 | 
			
		||||
- Associate Wireguard config `/etc/wireguard/*.conf`, see #2874 (@cyqsimon)
 | 
			
		||||
- Add support for [CFML](https://www.adobe.com/products/coldfusion-family.html), see #3031 (@brenton-at-pieces)
 | 
			
		||||
- Map `*.mkd` files to `Markdown` syntax, see issue #3060 and PR #3061 (@einfachIrgendwer0815)
 | 
			
		||||
- Add syntax mapping for kubernetes config files #3049 (@cyqsimon)
 | 
			
		||||
 | 
			
		||||
## Themes
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										17
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -243,6 +243,12 @@ version = "1.0.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "cfg_aliases"
 | 
			
		||||
version = "0.2.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "clap"
 | 
			
		||||
version = "4.4.12"
 | 
			
		||||
@@ -688,9 +694,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "libc"
 | 
			
		||||
version = "0.2.149"
 | 
			
		||||
version = "0.2.161"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
 | 
			
		||||
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "libgit2-sys"
 | 
			
		||||
@@ -761,12 +767,13 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "nix"
 | 
			
		||||
version = "0.26.4"
 | 
			
		||||
version = "0.29.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
 | 
			
		||||
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bitflags 1.3.2",
 | 
			
		||||
 "bitflags 2.4.0",
 | 
			
		||||
 "cfg-if",
 | 
			
		||||
 "cfg_aliases",
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -98,7 +98,7 @@ tempfile = "3.8.1"
 | 
			
		||||
serde = { version = "1.0", features = ["derive"] }
 | 
			
		||||
 | 
			
		||||
[target.'cfg(unix)'.dev-dependencies]
 | 
			
		||||
nix = { version = "0.26.4", default-features = false, features = ["term"] }
 | 
			
		||||
nix = { version = "0.29", default-features = false, features = ["term"] }
 | 
			
		||||
 | 
			
		||||
[build-dependencies]
 | 
			
		||||
anyhow = "1.0.86"
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,13 @@ Options:
 | 
			
		||||
            * unicode (␇, ␊, ␀, ..)
 | 
			
		||||
            * caret   (^G, ^J, ^@, ..)
 | 
			
		||||
 | 
			
		||||
      --binary <behavior>
 | 
			
		||||
          How to treat binary content. (default: no-printing)
 | 
			
		||||
          
 | 
			
		||||
          Possible values:
 | 
			
		||||
            * no-printing: do not print any binary content
 | 
			
		||||
            * as-text: treat binary content as normal text
 | 
			
		||||
 | 
			
		||||
  -p, --plain...
 | 
			
		||||
          Only show plain style, no decorations. This is an alias for '--style=plain'. When '-p' is
 | 
			
		||||
          used twice ('-pp'), it also disables automatic paging (alias for '--style=plain
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,8 @@ Options:
 | 
			
		||||
          Show non-printable characters (space, tab, newline, ..).
 | 
			
		||||
      --nonprintable-notation <notation>
 | 
			
		||||
          Set notation for non-printable characters.
 | 
			
		||||
      --binary <behavior>
 | 
			
		||||
          How to treat binary content. (default: no-printing)
 | 
			
		||||
  -p, --plain...
 | 
			
		||||
          Show plain style (alias for '--style=plain').
 | 
			
		||||
  -l, --language <language>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ use crate::{
 | 
			
		||||
    config::{get_args_from_config_file, get_args_from_env_opts_var, get_args_from_env_vars},
 | 
			
		||||
};
 | 
			
		||||
use bat::style::StyleComponentList;
 | 
			
		||||
use bat::BinaryBehavior;
 | 
			
		||||
use bat::StripAnsiMode;
 | 
			
		||||
use clap::ArgMatches;
 | 
			
		||||
 | 
			
		||||
@@ -211,6 +212,11 @@ impl App {
 | 
			
		||||
                Some("caret") => NonprintableNotation::Caret,
 | 
			
		||||
                _ => unreachable!("other values for --nonprintable-notation are not allowed"),
 | 
			
		||||
            },
 | 
			
		||||
            binary: match self.matches.get_one::<String>("binary").map(|s| s.as_str()) {
 | 
			
		||||
                Some("as-text") => BinaryBehavior::AsText,
 | 
			
		||||
                Some("no-printing") => BinaryBehavior::NoPrinting,
 | 
			
		||||
                _ => unreachable!("other values for --binary are not allowed"),
 | 
			
		||||
            },
 | 
			
		||||
            wrapping_mode: if self.interactive_output || maybe_term_width.is_some() {
 | 
			
		||||
                if !self.matches.get_flag("chop-long-lines") {
 | 
			
		||||
                    match self.matches.get_one::<String>("wrap").map(|s| s.as_str()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -77,6 +77,22 @@ pub fn build_app(interactive_output: bool) -> Command {
 | 
			
		||||
                    * caret   (^G, ^J, ^@, ..)",
 | 
			
		||||
                ),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::new("binary")
 | 
			
		||||
                .long("binary")
 | 
			
		||||
                .action(ArgAction::Set)
 | 
			
		||||
                .default_value("no-printing")
 | 
			
		||||
                .value_parser(["no-printing", "as-text"])
 | 
			
		||||
                .value_name("behavior")
 | 
			
		||||
                .hide_default_value(true)
 | 
			
		||||
                .help("How to treat binary content. (default: no-printing)")
 | 
			
		||||
                .long_help(
 | 
			
		||||
                    "How to treat binary content. (default: no-printing)\n\n\
 | 
			
		||||
                    Possible values:\n  \
 | 
			
		||||
                    * no-printing: do not print any binary content\n  \
 | 
			
		||||
                    * as-text: treat binary content as normal text",
 | 
			
		||||
                ),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::new("plain")
 | 
			
		||||
                .overrides_with("plain")
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
use crate::line_range::{HighlightedLineRanges, LineRanges};
 | 
			
		||||
use crate::nonprintable_notation::NonprintableNotation;
 | 
			
		||||
use crate::nonprintable_notation::{BinaryBehavior, NonprintableNotation};
 | 
			
		||||
#[cfg(feature = "paging")]
 | 
			
		||||
use crate::paging::PagingMode;
 | 
			
		||||
use crate::style::StyleComponents;
 | 
			
		||||
@@ -44,6 +44,9 @@ pub struct Config<'a> {
 | 
			
		||||
    /// The configured notation for non-printable characters
 | 
			
		||||
    pub nonprintable_notation: NonprintableNotation,
 | 
			
		||||
 | 
			
		||||
    /// How to treat binary content
 | 
			
		||||
    pub binary: BinaryBehavior,
 | 
			
		||||
 | 
			
		||||
    /// The character width of the terminal
 | 
			
		||||
    pub term_width: usize,
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,7 @@ mod terminal;
 | 
			
		||||
mod vscreen;
 | 
			
		||||
pub(crate) mod wrapping;
 | 
			
		||||
 | 
			
		||||
pub use nonprintable_notation::NonprintableNotation;
 | 
			
		||||
pub use nonprintable_notation::{BinaryBehavior, NonprintableNotation};
 | 
			
		||||
pub use preprocessor::StripAnsiMode;
 | 
			
		||||
pub use pretty_printer::{Input, PrettyPrinter, Syntax};
 | 
			
		||||
pub use syntax_mapping::{MappingTarget, SyntaxMapping};
 | 
			
		||||
 
 | 
			
		||||
@@ -10,3 +10,15 @@ pub enum NonprintableNotation {
 | 
			
		||||
    #[default]
 | 
			
		||||
    Unicode,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// How to treat binary content
 | 
			
		||||
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
 | 
			
		||||
#[non_exhaustive]
 | 
			
		||||
pub enum BinaryBehavior {
 | 
			
		||||
    /// Do not print any binary content
 | 
			
		||||
    #[default]
 | 
			
		||||
    NoPrinting,
 | 
			
		||||
 | 
			
		||||
    /// Treat binary content as normal text
 | 
			
		||||
    AsText,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,7 @@ use crate::style::StyleComponent;
 | 
			
		||||
use crate::terminal::{as_terminal_escaped, to_ansi_color};
 | 
			
		||||
use crate::vscreen::{AnsiStyle, EscapeSequence, EscapeSequenceIterator};
 | 
			
		||||
use crate::wrapping::WrappingMode;
 | 
			
		||||
use crate::BinaryBehavior;
 | 
			
		||||
use crate::StripAnsiMode;
 | 
			
		||||
 | 
			
		||||
const ANSI_UNDERLINE_ENABLE: EscapeSequence = EscapeSequence::CSI {
 | 
			
		||||
@@ -268,7 +269,8 @@ impl<'a> InteractivePrinter<'a> {
 | 
			
		||||
            .content_type
 | 
			
		||||
            .map_or(false, |c| c.is_binary() && !config.show_nonprintable);
 | 
			
		||||
 | 
			
		||||
        let needs_to_match_syntax = !is_printing_binary
 | 
			
		||||
        let needs_to_match_syntax = (!is_printing_binary
 | 
			
		||||
            || matches!(config.binary, BinaryBehavior::AsText))
 | 
			
		||||
            && (config.colored_output || config.strip_ansi == StripAnsiMode::Auto);
 | 
			
		||||
 | 
			
		||||
        let (is_plain_text, highlighter_from_set) = if needs_to_match_syntax {
 | 
			
		||||
@@ -458,7 +460,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if !self.config.style_components.header() {
 | 
			
		||||
            if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable {
 | 
			
		||||
            if Some(ContentType::BINARY) == self.content_type
 | 
			
		||||
                && !self.config.show_nonprintable
 | 
			
		||||
                && !matches!(self.config.binary, BinaryBehavior::AsText)
 | 
			
		||||
            {
 | 
			
		||||
                writeln!(
 | 
			
		||||
                    handle,
 | 
			
		||||
                    "{}: Binary content from {} will not be printed to the terminal \
 | 
			
		||||
@@ -539,7 +544,10 @@ impl<'a> Printer for InteractivePrinter<'a> {
 | 
			
		||||
            })?;
 | 
			
		||||
 | 
			
		||||
        if self.config.style_components.grid() {
 | 
			
		||||
            if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
 | 
			
		||||
            if self.content_type.map_or(false, |c| c.is_text())
 | 
			
		||||
                || self.config.show_nonprintable
 | 
			
		||||
                || matches!(self.config.binary, BinaryBehavior::AsText)
 | 
			
		||||
            {
 | 
			
		||||
                self.print_horizontal_line(handle, '┼')?;
 | 
			
		||||
            } else {
 | 
			
		||||
                self.print_horizontal_line(handle, '┴')?;
 | 
			
		||||
@@ -551,7 +559,9 @@ impl<'a> Printer for InteractivePrinter<'a> {
 | 
			
		||||
 | 
			
		||||
    fn print_footer(&mut self, handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> {
 | 
			
		||||
        if self.config.style_components.grid()
 | 
			
		||||
            && (self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable)
 | 
			
		||||
            && (self.content_type.map_or(false, |c| c.is_text())
 | 
			
		||||
                || self.config.show_nonprintable
 | 
			
		||||
                || matches!(self.config.binary, BinaryBehavior::AsText))
 | 
			
		||||
        {
 | 
			
		||||
            self.print_horizontal_line(handle, '┴')
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -599,7 +609,9 @@ impl<'a> Printer for InteractivePrinter<'a> {
 | 
			
		||||
            .into()
 | 
			
		||||
        } else {
 | 
			
		||||
            let mut line = match self.content_type {
 | 
			
		||||
                Some(ContentType::BINARY) | None => {
 | 
			
		||||
                Some(ContentType::BINARY) | None
 | 
			
		||||
                    if !matches!(self.config.binary, BinaryBehavior::AsText) =>
 | 
			
		||||
                {
 | 
			
		||||
                    return Ok(());
 | 
			
		||||
                }
 | 
			
		||||
                Some(ContentType::UTF_16LE) => UTF_16LE.decode_with_bom_removal(line_buffer).0,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								src/syntax_mapping/builtins/linux/50-kubernetes.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/syntax_mapping/builtins/linux/50-kubernetes.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
[mappings]
 | 
			
		||||
"YAML" = ["/etc/kubernetes/*.conf"]
 | 
			
		||||
@@ -9,7 +9,6 @@ use tempfile::tempdir;
 | 
			
		||||
mod unix {
 | 
			
		||||
    pub use std::fs::File;
 | 
			
		||||
    pub use std::io::{self, Write};
 | 
			
		||||
    pub use std::os::unix::io::FromRawFd;
 | 
			
		||||
    pub use std::path::PathBuf;
 | 
			
		||||
    pub use std::process::Stdio;
 | 
			
		||||
    pub use std::thread;
 | 
			
		||||
@@ -416,8 +415,8 @@ fn no_args_doesnt_break() {
 | 
			
		||||
    // not exit, because in this case it is safe to read and write to the same fd, which is why
 | 
			
		||||
    // this test exists.
 | 
			
		||||
    let OpenptyResult { master, slave } = openpty(None, None).expect("Couldn't open pty.");
 | 
			
		||||
    let mut master = unsafe { File::from_raw_fd(master) };
 | 
			
		||||
    let stdin_file = unsafe { File::from_raw_fd(slave) };
 | 
			
		||||
    let mut master = File::from(master);
 | 
			
		||||
    let stdin_file = File::from(slave);
 | 
			
		||||
    let stdout_file = stdin_file.try_clone().unwrap();
 | 
			
		||||
    let stdin = Stdio::from(stdin_file);
 | 
			
		||||
    let stdout = Stdio::from(stdout_file);
 | 
			
		||||
@@ -1964,6 +1963,16 @@ fn show_all_with_unicode() {
 | 
			
		||||
        .stderr("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn binary_as_text() {
 | 
			
		||||
    bat()
 | 
			
		||||
        .arg("--binary=as-text")
 | 
			
		||||
        .arg("control_characters.txt")
 | 
			
		||||
        .assert()
 | 
			
		||||
        .stdout("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x7F")
 | 
			
		||||
        .stderr("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn no_paging_arg() {
 | 
			
		||||
    bat()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user