mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-11-04 00:51:56 +00:00 
			
		
		
		
	Add simple configuration file
This allows users to create simple configuration file
(`~/.config/bat/config` on Linux) that has the following format:
    ```bash
    --flag1
    --flag2
    --option1=value1
    # lines beginning with '#' are ignored
    --option2=value2
    # empty lines and trailing whitespace are also ignored
    --option3=value3
    ```
			
			
This commit is contained in:
		
							
								
								
									
										22
									
								
								src/app.rs
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/app.rs
									
									
									
									
									
								
							@@ -14,6 +14,7 @@ use console::Term;
 | 
			
		||||
use ansi_term;
 | 
			
		||||
 | 
			
		||||
use assets::BAT_THEME_DEFAULT;
 | 
			
		||||
use config::get_args_from_config_file;
 | 
			
		||||
use errors::*;
 | 
			
		||||
use inputfile::InputFile;
 | 
			
		||||
use line_range::LineRange;
 | 
			
		||||
@@ -97,7 +98,26 @@ impl App {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn matches(interactive_output: bool) -> ArgMatches<'static> {
 | 
			
		||||
        clap_app::build_app(interactive_output).get_matches_from(wild::args())
 | 
			
		||||
        let args = if wild::args_os().nth(1) == Some("cache".into()) {
 | 
			
		||||
            // Skip the arguments in bats config file
 | 
			
		||||
 | 
			
		||||
            wild::args_os().collect::<Vec<_>>()
 | 
			
		||||
        } else {
 | 
			
		||||
            let mut cli_args = wild::args_os();
 | 
			
		||||
 | 
			
		||||
            // Read arguments from bats config file
 | 
			
		||||
            let mut args = get_args_from_config_file();
 | 
			
		||||
 | 
			
		||||
            // 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
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        clap_app::build_app(interactive_output).get_matches_from(args)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn config(&self) -> Result<Config> {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,11 +13,6 @@ use directories::ProjectDirs;
 | 
			
		||||
use errors::*;
 | 
			
		||||
use inputfile::{InputFile, InputFileReader};
 | 
			
		||||
 | 
			
		||||
lazy_static! {
 | 
			
		||||
    static ref PROJECT_DIRS: ProjectDirs =
 | 
			
		||||
        ProjectDirs::from("", "", crate_name!()).expect("Could not get home directory");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub const BAT_THEME_DEFAULT: &str = "Monokai Extended";
 | 
			
		||||
 | 
			
		||||
pub struct HighlightingAssets {
 | 
			
		||||
 
 | 
			
		||||
@@ -84,6 +84,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
 | 
			
		||||
                .value_name("style-components")
 | 
			
		||||
                .use_delimiter(true)
 | 
			
		||||
                .takes_value(true)
 | 
			
		||||
                .overrides_with("style")
 | 
			
		||||
                .possible_values(&[
 | 
			
		||||
                    "auto", "full", "plain", "changes", "header", "grid", "numbers",
 | 
			
		||||
                ])
 | 
			
		||||
@@ -207,6 +208,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("tabs")
 | 
			
		||||
                .long("tabs")
 | 
			
		||||
                .overrides_with("tabs")
 | 
			
		||||
                .takes_value(true)
 | 
			
		||||
                .value_name("T")
 | 
			
		||||
                .validator(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										65
									
								
								src/config.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/config.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
use std::ffi::OsString;
 | 
			
		||||
use std::fs;
 | 
			
		||||
 | 
			
		||||
use dirs::PROJECT_DIRS;
 | 
			
		||||
 | 
			
		||||
pub fn get_args_from_config_file() -> Vec<OsString> {
 | 
			
		||||
    let config_file = PROJECT_DIRS.config_dir().join("config");
 | 
			
		||||
    fs::read_to_string(config_file)
 | 
			
		||||
        .map(|content| get_args_from_str(&content))
 | 
			
		||||
        .unwrap_or(vec![])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn get_args_from_str<'a>(content: &'a str) -> Vec<OsString> {
 | 
			
		||||
    content
 | 
			
		||||
        .split('\n')
 | 
			
		||||
        .map(|line| line.trim())
 | 
			
		||||
        .filter(|line| !line.is_empty())
 | 
			
		||||
        .filter(|line| !line.starts_with("#"))
 | 
			
		||||
        .map(|line| line.into())
 | 
			
		||||
        .collect()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn empty() {
 | 
			
		||||
    let args = get_args_from_str("");
 | 
			
		||||
    println!("{:?}", args);
 | 
			
		||||
    assert!(args.is_empty());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn single() {
 | 
			
		||||
    assert_eq!(vec!["--plain"], get_args_from_str("--plain"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn multiple() {
 | 
			
		||||
    let config = "
 | 
			
		||||
    -p
 | 
			
		||||
    --style numbers,changes
 | 
			
		||||
 | 
			
		||||
    --color=always
 | 
			
		||||
    ";
 | 
			
		||||
    assert_eq!(
 | 
			
		||||
        vec!["-p", "--style numbers,changes", "--color=always"],
 | 
			
		||||
        get_args_from_str(config)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[test]
 | 
			
		||||
fn comments() {
 | 
			
		||||
    let config = "
 | 
			
		||||
    # plain style
 | 
			
		||||
    -p
 | 
			
		||||
 | 
			
		||||
    # show line numbers and Git modifications
 | 
			
		||||
    --style numbers,changes
 | 
			
		||||
 | 
			
		||||
    # Always show ANSI colors
 | 
			
		||||
    --color=always
 | 
			
		||||
    ";
 | 
			
		||||
    assert_eq!(
 | 
			
		||||
        vec!["-p", "--style numbers,changes", "--color=always"],
 | 
			
		||||
        get_args_from_str(config)
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								src/dirs.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/dirs.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
use directories::ProjectDirs;
 | 
			
		||||
 | 
			
		||||
lazy_static! {
 | 
			
		||||
    pub static ref PROJECT_DIRS: ProjectDirs =
 | 
			
		||||
        ProjectDirs::from("", "", crate_name!()).expect("Could not get home directory");
 | 
			
		||||
}
 | 
			
		||||
@@ -23,9 +23,11 @@ extern crate wild;
 | 
			
		||||
mod app;
 | 
			
		||||
mod assets;
 | 
			
		||||
mod clap_app;
 | 
			
		||||
mod config;
 | 
			
		||||
mod controller;
 | 
			
		||||
mod decorations;
 | 
			
		||||
mod diff;
 | 
			
		||||
mod dirs;
 | 
			
		||||
mod inputfile;
 | 
			
		||||
mod line_range;
 | 
			
		||||
mod output;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user