From eb6e43b9a91e1b3d59b208dad8c3889f1ddbc0c8 Mon Sep 17 00:00:00 2001 From: eth-p <32112321+eth-p@users.noreply.github.com> Date: Mon, 10 Sep 2018 20:12:13 -0700 Subject: [PATCH] Disabled tab expansion when decorations and pager are not used. --- src/app.rs | 400 +++++++++++++++++++++++++++-------------------------- 1 file changed, 204 insertions(+), 196 deletions(-) diff --git a/src/app.rs b/src/app.rs index f2e2a84c..3ab76366 100644 --- a/src/app.rs +++ b/src/app.rs @@ -16,7 +16,7 @@ use errors::*; use line_range::LineRange; use style::{OutputComponent, OutputComponents, OutputWrap}; -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum PagingMode { Always, QuitIfOneScreen, @@ -133,7 +133,7 @@ impl App { to read from standard input.", ).multiple(true) .empty_values(false), - ) + ) .arg( Arg::with_name("language") .short("l") @@ -147,204 +147,204 @@ impl App { language names and file extensions." ).takes_value(true), ).arg( - Arg::with_name("list-languages") - .long("list-languages") - .conflicts_with("list-themes") - .help("Display all supported languages.") - .long_help("Display a list of supported languages for syntax highlighting."), - ).arg( - Arg::with_name("theme") - .long("theme") - .overrides_with("theme") - .takes_value(true) - .help("Set the color theme for syntax highlighting.") - .long_help( - "Set the theme for syntax highlighting. Use '--list-themes' to \ + Arg::with_name("list-languages") + .long("list-languages") + .conflicts_with("list-themes") + .help("Display all supported languages.") + .long_help("Display a list of supported languages for syntax highlighting."), + ).arg( + Arg::with_name("theme") + .long("theme") + .overrides_with("theme") + .takes_value(true) + .help("Set the color theme for syntax highlighting.") + .long_help( + "Set the theme for syntax highlighting. Use '--list-themes' to \ see all available themes. To set a default theme, export the \ BAT_THEME environment variable (e.g.: export \ BAT_THEME=\"TwoDark\").", - ), - ).arg( - Arg::with_name("list-themes") - .long("list-themes") - .help("Display all supported highlighting themes.") - .long_help("Display a list of supported themes for syntax highlighting."), - ).arg( - Arg::with_name("style") - .long("style") - .value_name("style-components") - .use_delimiter(true) - .takes_value(true) - .possible_values(&[ - "auto", "full", "plain", "changes", "header", "grid", "numbers", - ]).default_value("auto") - .help("Comma-separated list of style elements to display.") - .long_help( - "Configure which elements (line numbers, file headers, grid \ + ), + ).arg( + Arg::with_name("list-themes") + .long("list-themes") + .help("Display all supported highlighting themes.") + .long_help("Display a list of supported themes for syntax highlighting."), + ).arg( + Arg::with_name("style") + .long("style") + .value_name("style-components") + .use_delimiter(true) + .takes_value(true) + .possible_values(&[ + "auto", "full", "plain", "changes", "header", "grid", "numbers", + ]).default_value("auto") + .help("Comma-separated list of style elements to display.") + .long_help( + "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')", - ), - ).arg( - Arg::with_name("plain") - .overrides_with("plain") - .short("p") - .long("plain") - .conflicts_with("style") - .conflicts_with("number") - .help("Show plain style (alias for '--style=plain').") - .long_help( - "Only show plain style, no decorations. This is an alias for \ + ), + ).arg( + Arg::with_name("plain") + .overrides_with("plain") + .short("p") + .long("plain") + .conflicts_with("style") + .conflicts_with("number") + .help("Show plain style (alias for '--style=plain').") + .long_help( + "Only show plain style, no decorations. This is an alias for \ '--style=plain'", - ), - ).arg( - Arg::with_name("number") - .long("number") - .overrides_with("number") - .short("n") - .conflicts_with("style") - .help("Show line numbers (alias for '--style=numbers').") - .long_help( - "Only show line numbers, no other decorations. This is an alias for \ + ), + ).arg( + Arg::with_name("number") + .long("number") + .overrides_with("number") + .short("n") + .conflicts_with("style") + .help("Show line numbers (alias for '--style=numbers').") + .long_help( + "Only show line numbers, no other decorations. This is an alias for \ '--style=numbers'", - ), - ).arg( - Arg::with_name("line-range") - .long("line-range") - .overrides_with("line-range") - .takes_value(true) - .value_name("N:M") - .help("Only print the lines from N to M.") - .long_help( - "Only print the specified range of lines for each file. \ + ), + ).arg( + Arg::with_name("line-range") + .long("line-range") + .overrides_with("line-range") + .takes_value(true) + .value_name("N:M") + .help("Only print the lines from N to M.") + .long_help( + "Only print the specified range of lines for each file. \ For example:\n \ '--line-range 30:40' prints lines 30 to 40\n \ '--line-range :40' prints lines 1 to 40\n \ '--line-range 40:' prints lines 40 to the end of the file", - ), - ).arg( - Arg::with_name("color") - .long("color") - .overrides_with("color") - .takes_value(true) - .value_name("when") - .possible_values(&["auto", "never", "always"]) - .default_value("auto") - .help("When to use colors.") - .long_help("Specify when to use colored output. The automatic mode \ + ), + ).arg( + Arg::with_name("color") + .long("color") + .overrides_with("color") + .takes_value(true) + .value_name("when") + .possible_values(&["auto", "never", "always"]) + .default_value("auto") + .help("When to use colors.") + .long_help("Specify when to use colored output. The automatic mode \ only enables colors if an interactive terminal is detected."), - ).arg( - Arg::with_name("decorations") - .long("decorations") - .overrides_with("decorations") - .takes_value(true) - .value_name("when") - .possible_values(&["auto", "never", "always"]) - .default_value("auto") - .help("When to show the decorations specified by '--style'.") - .long_help("Specify when to use the decorations that have been specified \ + ).arg( + Arg::with_name("decorations") + .long("decorations") + .overrides_with("decorations") + .takes_value(true) + .value_name("when") + .possible_values(&["auto", "never", "always"]) + .default_value("auto") + .help("When to show the decorations specified by '--style'.") + .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."), - ).arg( - Arg::with_name("paging") - .long("paging") - .overrides_with("paging") - .takes_value(true) - .value_name("when") - .possible_values(&["auto", "never", "always"]) - .default_value("auto") - .help("Specify when to use the pager.") - .long_help("Specify when to use the pager. To control which pager \ + ).arg( + Arg::with_name("paging") + .long("paging") + .overrides_with("paging") + .takes_value(true) + .value_name("when") + .possible_values(&["auto", "never", "always"]) + .default_value("auto") + .help("Specify when to use the pager.") + .long_help("Specify when to use the pager. To control which pager \ is used, set the PAGER or BAT_PAGER environment \ variables (the latter takes precedence). The default \ pager is 'less'. To disable the pager permanently, set \ BAT_PAGER to an empty string."), - ).arg( - Arg::with_name("wrap") - .long("wrap") - .overrides_with("wrap") - .takes_value(true) - .value_name("mode") - .possible_values(&["auto", "never", "character"]) - .default_value("auto") - .help("Specify the text-wrapping mode.") - .long_help("Specify the text-wrapping mode."), - ).arg( - Arg::with_name("unbuffered") - .short("u") - .hidden_short_help(true) - .long_help( - "This option exists for POSIX-compliance reasons ('u' is for \ + ).arg( + Arg::with_name("wrap") + .long("wrap") + .overrides_with("wrap") + .takes_value(true) + .value_name("mode") + .possible_values(&["auto", "never", "character"]) + .default_value("auto") + .help("Specify the text-wrapping mode.") + .long_help("Specify the text-wrapping mode."), + ).arg( + Arg::with_name("unbuffered") + .short("u") + .hidden_short_help(true) + .long_help( + "This option exists for POSIX-compliance reasons ('u' is for \ 'unbuffered'). The output is always unbuffered - this option \ is simply ignored.", - ), - ).arg( - Arg::with_name("tabs") - .long("tabs") - .short("t") - .takes_value(true) - .value_name("width") - .help("Sets the tab width.") - .long_help("Sets the tab width. Use a width of 0 to pass tabs through \ + ), + ).arg( + Arg::with_name("tabs") + .long("tabs") + .short("t") + .takes_value(true) + .value_name("width") + .help("Sets the tab width.") + .long_help("Sets the tab width. Use a width of 0 to pass tabs through \ directly"), - ).arg( - Arg::with_name("terminal-width") - .long("terminal-width") - .takes_value(true) - .value_name("width") - .hidden(true) - .help("Set the width of the terminal"), - ).subcommand( - SubCommand::with_name("cache") - .about("Modify the syntax-definition and theme cache") - .arg( - Arg::with_name("init") - .long("init") - .short("i") - .help("Initialize the syntax/theme cache.") - .long_help( - "Initialize the syntax/theme cache by loading from the \ + ).arg( + Arg::with_name("terminal-width") + .long("terminal-width") + .takes_value(true) + .value_name("width") + .hidden(true) + .help("Set the width of the terminal"), + ).subcommand( + SubCommand::with_name("cache") + .about("Modify the syntax-definition and theme cache") + .arg( + Arg::with_name("init") + .long("init") + .short("i") + .help("Initialize the syntax/theme cache.") + .long_help( + "Initialize the syntax/theme cache by loading from the \ source directory (default: the configuration directory).", - ), - ).arg( - Arg::with_name("clear") - .long("clear") - .short("c") - .help("Remove the cached syntax definitions and themes."), - ).arg( - Arg::with_name("config-dir") - .long("config-dir") - .short("d") - .help("Show bat's configuration directory."), - ).group( - ArgGroup::with_name("cache-actions") - .args(&["init", "clear", "config-dir"]) - .required(arg_group_required), - ).arg( - Arg::with_name("source") - .long("source") - .requires("init") - .takes_value(true) - .value_name("dir") - .help("Use a different directory to load syntaxes and themes from."), - ).arg( - Arg::with_name("target") - .long("target") - .requires("init") - .takes_value(true) - .value_name("dir") - .help( - "Use a different directory to store the cached syntax and theme set.", - ), - ).arg( - Arg::with_name("blank") - .long("blank") - .requires("init") - .help("Create completely new syntax and theme sets \ - (instead of appending to the default sets).") + ), + ).arg( + Arg::with_name("clear") + .long("clear") + .short("c") + .help("Remove the cached syntax definitions and themes."), + ).arg( + Arg::with_name("config-dir") + .long("config-dir") + .short("d") + .help("Show bat's configuration directory."), + ).group( + ArgGroup::with_name("cache-actions") + .args(&["init", "clear", "config-dir"]) + .required(arg_group_required), + ).arg( + Arg::with_name("source") + .long("source") + .requires("init") + .takes_value(true) + .value_name("dir") + .help("Use a different directory to load syntaxes and themes from."), + ).arg( + Arg::with_name("target") + .long("target") + .requires("init") + .takes_value(true) + .value_name("dir") + .help( + "Use a different directory to store the cached syntax and theme set.", ), - ).help_message("Print this help message.") + ).arg( + Arg::with_name("blank") + .long("blank") + .requires("init") + .help("Create completely new syntax and theme sets \ + (instead of appending to the default sets).") + ), + ).help_message("Print this help message.") .version_message("Show version information.") .get_matches() } @@ -353,6 +353,27 @@ impl App { let files = self.files(); let output_components = self.output_components()?; + let paging_mode = match self.matches.value_of("paging") { + Some("always") => PagingMode::Always, + Some("never") => PagingMode::Never, + Some("auto") | _ => if files.contains(&InputFile::StdIn) { + // 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. + if self.interactive_output && !atty::is(Stream::Stdin) { + PagingMode::QuitIfOneScreen + } else { + PagingMode::Never + } + } else { + if self.interactive_output { + PagingMode::QuitIfOneScreen + } else { + PagingMode::Never + } + }, + }; + Ok(Config { true_color: is_truecolor_terminal(), language: self.matches.value_of("language"), @@ -376,26 +397,7 @@ impl App { Some("never") => false, Some("auto") | _ => self.interactive_output, }, - paging_mode: match self.matches.value_of("paging") { - Some("always") => PagingMode::Always, - Some("never") => PagingMode::Never, - Some("auto") | _ => if files.contains(&InputFile::StdIn) { - // 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. - if self.interactive_output && !atty::is(Stream::Stdin) { - PagingMode::QuitIfOneScreen - } else { - PagingMode::Never - } - } else { - if self.interactive_output { - PagingMode::QuitIfOneScreen - } else { - PagingMode::Never - } - }, - }, + paging_mode, term_width: self .matches .value_of("terminal-width") @@ -410,7 +412,13 @@ impl App { .value_of("tabs") .and_then(|w| w.parse().ok()) .or_else(|| env::var("BAT_TABS").ok().and_then(|w| w.parse().ok())) - .unwrap_or(8), + .unwrap_or( + if output_components.plain() && paging_mode == PagingMode::Never { + 0 + } else { + 8 + }, + ), theme: self .matches .value_of("theme")