diff --git a/Cargo.lock b/Cargo.lock index 01ab86adb0..1cc8bd5642 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1942,7 +1942,7 @@ dependencies = [ "rawkey 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)", - "roxmltree 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "roxmltree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustyline 5.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.98 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1963,6 +1963,7 @@ dependencies = [ "toml-query 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", + "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2709,7 +2710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "roxmltree" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "xmlparser 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3579,6 +3580,15 @@ name = "wasm-bindgen-shared" version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "which" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "widestring" version = "0.4.0" @@ -3977,7 +3987,7 @@ dependencies = [ "checksum render-tree 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "68ed587df09cfb7ce1bc6fe8f77e24db219f222c049326ccbfb948ec67e31664" "checksum reqwest 0.9.19 (registry+https://github.com/rust-lang/crates.io-index)" = "1d0777154c2c3eb54f5c480db01de845652d941e47191277cc673634c3853939" "checksum result 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "194d8e591e405d1eecf28819740abed6d719d1a2db87fc0bcdedee9a26d55560" -"checksum roxmltree 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "330d8f80a274bc3cb608908ee345970e7e24b96907f1ad69615a498bec57871c" +"checksum roxmltree 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "153c367ce9fb8ef7afe637ef92bd083ba0f88b03ef3fcf0287d40be05ae0a61c" "checksum rust-argon2 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81ed8d04228b44a740c8d46ff872a28e50fff3d659f307ab4da2cc502e019ff3" "checksum rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" "checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" @@ -4078,6 +4088,7 @@ dependencies = [ "checksum wasm-bindgen-macro 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "f07d50f74bf7a738304f6b8157f4a581e1512cd9e9cdb5baad8c31bbe8ffd81d" "checksum wasm-bindgen-macro-support 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "95cf8fe77e45ba5f91bc8f3da0c3aa5d464b3d8ed85d84f4d4c7cc106436b1d7" "checksum wasm-bindgen-shared 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)" = "d9c2d4d4756b2e46d3a5422e06277d02e4d3e1d62d138b76a4c681e925743623" +"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164" "checksum widestring 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" diff --git a/Cargo.toml b/Cargo.toml index 33200621d5..7aef71b92b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ serde = { version = "1.0.98", features = ["derive"] } serde_json = "1.0.40" serde-hjson = "0.9.0" serde_yaml = "0.8" -serde_bytes = "0.11.1" +serde_bytes = "0.11.2" getset = "0.0.7" logos = "0.10.0-rc2" logos-derive = "0.10.0-rc2" @@ -61,7 +61,7 @@ ctrlc = "3.1.3" ptree = "0.2" clipboard = "0.5" reqwest = "0.9" -roxmltree = "0.6.1" +roxmltree = "0.7.0" nom5_locate = "0.1.1" derive_more = "0.15.0" enum-utils = "0.1.1" @@ -81,8 +81,9 @@ semver = "0.9.0" uuid = {version = "0.7.4", features = [ "v4", "serde" ]} syntect = "3.2.0" strip-ansi-escapes = "0.1.0" -onig_sys = "=69.1" +onig_sys = "=69.1.0" heim = "0.0.6" +which = "2.0.1" [dev-dependencies] pretty_assertions = "0.6.1" diff --git a/src/commands/classified.rs b/src/commands/classified.rs index cb02b674c2..c4e44244ab 100644 --- a/src/commands/classified.rs +++ b/src/commands/classified.rs @@ -148,7 +148,10 @@ impl InternalCommand { // If it's a directory, add a new filesystem shell context .shell_manager - .push(Box::new(FilesystemShell::with_location(location)?)); + .push(Box::new(FilesystemShell::with_location( + location, + context.registry().clone(), + )?)); } else { // If it's a file, attempt to open the file as a value and enter it let cwd = context.shell_manager.path(); diff --git a/src/context.rs b/src/context.rs index b7fd149311..f707a625f9 100644 --- a/src/context.rs +++ b/src/context.rs @@ -64,10 +64,10 @@ impl CommandRegistry { registry.insert(name.into(), command); } - // crate fn names(&self) -> Vec { - // let registry = self.registry.lock().unwrap(); - // registry.keys().cloned().collect() - // } + crate fn names(&self) -> Vec { + let registry = self.registry.lock().unwrap(); + registry.keys().cloned().collect() + } } #[derive(Clone)] @@ -84,11 +84,12 @@ impl Context { } crate fn basic() -> Result> { + let registry = CommandRegistry::new(); Ok(Context { - registry: CommandRegistry::new(), + registry: registry.clone(), source_map: SourceMap::new(), host: Arc::new(Mutex::new(crate::env::host::BasicHost)), - shell_manager: ShellManager::basic()?, + shell_manager: ShellManager::basic(registry)?, }) } diff --git a/src/shell/completer.rs b/src/shell/completer.rs index 4e53f41721..dea696fea2 100644 --- a/src/shell/completer.rs +++ b/src/shell/completer.rs @@ -1,10 +1,11 @@ +use crate::prelude::*; use derive_new::new; use rustyline::completion::{Completer, FilenameCompleter}; #[derive(new)] crate struct NuCompleter { pub file_completer: FilenameCompleter, - //pub commands: indexmap::IndexMap>, + pub commands: CommandRegistry, } impl NuCompleter { @@ -14,7 +15,7 @@ impl NuCompleter { pos: usize, context: &rustyline::Context, ) -> rustyline::Result<(usize, Vec)> { - //let commands: Vec = self.commands.keys().cloned().collect(); + let commands: Vec = self.commands.names(); let mut completions = self.file_completer.complete(line, pos, context)?.1; @@ -45,7 +46,6 @@ impl NuCompleter { replace_pos -= 1; } - /* for command in commands.iter() { let mut pos = replace_pos; let mut matched = true; @@ -63,13 +63,12 @@ impl NuCompleter { } if matched { - completions.push(CompletionPair { + completions.push(rustyline::completion::Pair { display: command.clone(), replacement: command.clone(), }); } } - */ Ok((replace_pos, completions)) } diff --git a/src/shell/filesystem_shell.rs b/src/shell/filesystem_shell.rs index 142af2d7f2..2f709d1762 100644 --- a/src/shell/filesystem_shell.rs +++ b/src/shell/filesystem_shell.rs @@ -18,6 +18,7 @@ impl Clone for FilesystemShell { path: self.path.clone(), completer: NuCompleter { file_completer: FilenameCompleter::new(), + commands: self.completer.commands.clone(), }, hinter: HistoryHinter {}, } @@ -25,23 +26,28 @@ impl Clone for FilesystemShell { } impl FilesystemShell { - pub fn basic() -> Result { + pub fn basic(commands: CommandRegistry) -> Result { let path = std::env::current_dir()?; Ok(FilesystemShell { path: path.to_string_lossy().to_string(), completer: NuCompleter { file_completer: FilenameCompleter::new(), + commands, }, hinter: HistoryHinter {}, }) } - pub fn with_location(path: String) -> Result { + pub fn with_location( + path: String, + commands: CommandRegistry, + ) -> Result { Ok(FilesystemShell { path, completer: NuCompleter { file_completer: FilenameCompleter::new(), + commands, }, hinter: HistoryHinter {}, }) diff --git a/src/shell/shell_manager.rs b/src/shell/shell_manager.rs index f43ef7c9c4..205db391e6 100644 --- a/src/shell/shell_manager.rs +++ b/src/shell/shell_manager.rs @@ -1,5 +1,6 @@ use crate::commands::command::EvaluatedStaticCommandArgs; use crate::errors::ShellError; +use crate::prelude::*; use crate::shell::filesystem_shell::FilesystemShell; use crate::shell::shell::Shell; use crate::stream::OutputStream; @@ -12,9 +13,11 @@ pub struct ShellManager { } impl ShellManager { - pub fn basic() -> Result> { + pub fn basic(commands: CommandRegistry) -> Result> { Ok(ShellManager { - shells: Arc::new(Mutex::new(vec![Box::new(FilesystemShell::basic()?)])), + shells: Arc::new(Mutex::new(vec![Box::new(FilesystemShell::basic( + commands, + )?)])), }) }