mirror of
				https://github.com/sharkdp/bat.git
				synced 2025-10-31 15:12:12 +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