diff --git a/Cargo.lock b/Cargo.lock index f302015929..2f429bdce1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -526,6 +526,16 @@ dependencies = [ "time", ] +[[package]] +name = "chrono-tz" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d96be7c3e993c9ee4356442db24ba364c924b6b8331866be6b6952bfe74b9d" +dependencies = [ + "chrono", + "parse-zoneinfo", +] + [[package]] name = "clap" version = "2.33.1" @@ -1050,6 +1060,19 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" +[[package]] +name = "dtparse" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9713da7ca51bcd8ecbaedbd6309110eb1ca930d2109ef595a125f84fa1bc608b" +dependencies = [ + "chrono", + "chrono-tz", + "lazy_static 1.4.0", + "num-traits 0.2.12", + "rust_decimal", +] + [[package]] name = "dunce" version = "1.0.1" @@ -2585,6 +2608,7 @@ dependencies = [ "derive-new", "directories 2.0.2", "dirs 2.0.2", + "dtparse", "dunce", "eml-parser", "encoding_rs", @@ -2983,6 +3007,20 @@ dependencies = [ "ptree", ] +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits 0.2.12", +] + [[package]] name = "num-bigint" version = "0.2.6" @@ -2995,6 +3033,16 @@ dependencies = [ "serde 1.0.114", ] +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits 0.2.12", +] + [[package]] name = "num-format" version = "0.4.0" @@ -3034,6 +3082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg", + "num-bigint", "num-integer", "num-traits 0.2.12", ] @@ -3287,6 +3336,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", +] + [[package]] name = "path-slash" version = "0.1.3" @@ -3833,6 +3891,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rust_decimal" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93c95e3d5c1d997e6e4ba9bda898f4e1d73934cd05510c972f10087d0ef00c1" +dependencies = [ + "byteorder", + "lazy_static 1.4.0", + "num", + "serde 1.0.114", +] + [[package]] name = "rustc-demangle" version = "0.1.16" diff --git a/crates/nu-cli/src/cli.rs b/crates/nu-cli/src/cli.rs index 3e0faab852..1d10843f17 100644 --- a/crates/nu-cli/src/cli.rs +++ b/crates/nu-cli/src/cli.rs @@ -561,6 +561,20 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap Cmd::Move(Movement::ForwardWord(1, At::AfterEnd, Word::Vi)), ); + // Let's set the defaults up front and then override them later if the user indicates + // defaults taken from here https://github.com/kkawakam/rustyline/blob/2fe886c9576c1ea13ca0e5808053ad491a6fe049/src/config.rs#L150-L167 + rl.set_max_history_size(100); + rl.set_history_ignore_dups(true); + rl.set_history_ignore_space(false); + rl.set_completion_type(DEFAULT_COMPLETION_MODE); + rl.set_completion_prompt_limit(100); + rl.set_keyseq_timeout(-1); + rl.set_edit_mode(rustyline::config::EditMode::Emacs); + rl.set_auto_add_history(false); + rl.set_bell_style(rustyline::config::BellStyle::default()); + rl.set_color_mode(rustyline::ColorMode::Enabled); + rl.set_tab_stop(8); + if let Err(e) = crate::keybinding::load_keybindings(&mut rl) { println!("Error loading keybindings: {:?}", e); } @@ -585,11 +599,9 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap for (idx, value) in line_editor_vars.row_entries() { match idx.as_ref() { "max_history_size" => { - let max_history_size = match value.as_u64() { - Ok(n) => n as usize, - _ => 1000 as usize, - }; - rl.set_max_history_size(max_history_size as usize); + if let Ok(max_history_size) = value.as_u64() { + rl.set_max_history_size(max_history_size as usize); + } } "history_duplicates" => { // history_duplicates = match value.as_string() { @@ -601,12 +613,14 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap // } // _ => rustyline::config::HistoryDuplicates::AlwaysAdd, // }; - let history_duplicates = value.as_bool().unwrap_or(true); - rl.set_history_ignore_dups(history_duplicates); + if let Ok(history_duplicates) = value.as_bool() { + rl.set_history_ignore_dups(history_duplicates); + } } "history_ignore_space" => { - let history_ignore_space = value.as_bool().unwrap_or(true); - rl.set_history_ignore_space(history_ignore_space); + if let Ok(history_ignore_space) = value.as_bool() { + rl.set_history_ignore_space(history_ignore_space); + } } "completion_type" => { let completion_type = match value.as_string() { @@ -625,12 +639,14 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap rl.set_completion_type(completion_type); } "completion_prompt_limit" => { - let completion_prompt_limit = value.as_u64().unwrap_or(1) as usize; - rl.set_completion_prompt_limit(completion_prompt_limit); + if let Ok(completion_prompt_limit) = value.as_u64() { + rl.set_completion_prompt_limit(completion_prompt_limit as usize); + } } "keyseq_timeout_ms" => { - let keyseq_timeout_ms = value.as_u64().unwrap_or(500) as i32; - rl.set_keyseq_timeout(keyseq_timeout_ms); + if let Ok(keyseq_timeout_ms) = value.as_u64() { + rl.set_keyseq_timeout(keyseq_timeout_ms as i32); + } } "edit_mode" => { let edit_mode = match value.as_string() { @@ -641,10 +657,15 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap _ => rustyline::config::EditMode::Emacs, }; rl.set_edit_mode(edit_mode); + // Note: When edit_mode is Emacs, the keyseq_timeout_ms is set to -1 + // no matter what you may have configured. This is so that key chords + // can be applied without having to do them in a given timeout. So, + // it essentially turns off the keyseq timeout. } "auto_add_history" => { - let auto_add_history = value.as_bool().unwrap_or(true); - rl.set_auto_add_history(auto_add_history); + if let Ok(auto_add_history) = value.as_bool() { + rl.set_auto_add_history(auto_add_history); + } } "bell_style" => { let bell_style = match value.as_string() { @@ -657,7 +678,7 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap Ok(s) if s.to_lowercase() == "visible" => { rustyline::config::BellStyle::Visible } - _ => rustyline::config::BellStyle::None, + _ => rustyline::config::BellStyle::default(), }; rl.set_bell_style(bell_style); } @@ -673,39 +694,14 @@ pub fn set_rustyline_configuration() -> (Editor, IndexMap rl.set_color_mode(color_mode); } "tab_stop" => { - let tab_stop = value.as_u64().unwrap_or(4) as usize; - rl.set_tab_stop(tab_stop); + if let Ok(tab_stop) = value.as_u64() { + rl.set_tab_stop(tab_stop as usize); + } } _ => (), } } - } else { - // if the line_editor config section doesn't exist, let's set some defaults - rl.set_max_history_size(1000); - rl.set_history_ignore_dups(true); - rl.set_history_ignore_space(false); - rl.set_completion_type(DEFAULT_COMPLETION_MODE); - rl.set_completion_prompt_limit(100); - rl.set_keyseq_timeout(500); - rl.set_edit_mode(rustyline::config::EditMode::Emacs); - rl.set_auto_add_history(false); - rl.set_bell_style(rustyline::config::BellStyle::None); - rl.set_color_mode(rustyline::ColorMode::Enabled); - rl.set_tab_stop(8); } - } else { - // if the config file itself doesn't exist, let's set some defaults - rl.set_max_history_size(1000); - rl.set_history_ignore_dups(true); - rl.set_history_ignore_space(false); - rl.set_completion_type(DEFAULT_COMPLETION_MODE); - rl.set_completion_prompt_limit(100); - rl.set_keyseq_timeout(500); - rl.set_edit_mode(rustyline::config::EditMode::Emacs); - rl.set_auto_add_history(false); - rl.set_bell_style(rustyline::config::BellStyle::None); - rl.set_color_mode(rustyline::ColorMode::Enabled); - rl.set_tab_stop(8); } // we are ok if history does not exist