Merge pull request #266 from jonathandturner/command_completions

Add back command completions
This commit is contained in:
Jonathan Turner 2019-08-10 18:46:46 +12:00 committed by GitHub
commit b59c58948a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 46 additions and 22 deletions

17
Cargo.lock generated
View File

@ -1942,7 +1942,7 @@ dependencies = [
"rawkey 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "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)", "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)", "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)", "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)", "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)", "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)", "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)", "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]] [[package]]
@ -2709,7 +2710,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "roxmltree" name = "roxmltree"
version = "0.6.1" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"xmlparser 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "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" version = "0.2.48"
source = "registry+https://github.com/rust-lang/crates.io-index" 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]] [[package]]
name = "widestring" name = "widestring"
version = "0.4.0" 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 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 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 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-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 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" "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 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-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 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 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.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" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"

View File

@ -41,7 +41,7 @@ serde = { version = "1.0.98", features = ["derive"] }
serde_json = "1.0.40" serde_json = "1.0.40"
serde-hjson = "0.9.0" serde-hjson = "0.9.0"
serde_yaml = "0.8" serde_yaml = "0.8"
serde_bytes = "0.11.1" serde_bytes = "0.11.2"
getset = "0.0.7" getset = "0.0.7"
logos = "0.10.0-rc2" logos = "0.10.0-rc2"
logos-derive = "0.10.0-rc2" logos-derive = "0.10.0-rc2"
@ -61,7 +61,7 @@ ctrlc = "3.1.3"
ptree = "0.2" ptree = "0.2"
clipboard = "0.5" clipboard = "0.5"
reqwest = "0.9" reqwest = "0.9"
roxmltree = "0.6.1" roxmltree = "0.7.0"
nom5_locate = "0.1.1" nom5_locate = "0.1.1"
derive_more = "0.15.0" derive_more = "0.15.0"
enum-utils = "0.1.1" enum-utils = "0.1.1"
@ -81,8 +81,9 @@ semver = "0.9.0"
uuid = {version = "0.7.4", features = [ "v4", "serde" ]} uuid = {version = "0.7.4", features = [ "v4", "serde" ]}
syntect = "3.2.0" syntect = "3.2.0"
strip-ansi-escapes = "0.1.0" strip-ansi-escapes = "0.1.0"
onig_sys = "=69.1" onig_sys = "=69.1.0"
heim = "0.0.6" heim = "0.0.6"
which = "2.0.1"
[dev-dependencies] [dev-dependencies]
pretty_assertions = "0.6.1" pretty_assertions = "0.6.1"

View File

@ -148,7 +148,10 @@ impl InternalCommand {
// If it's a directory, add a new filesystem shell // If it's a directory, add a new filesystem shell
context context
.shell_manager .shell_manager
.push(Box::new(FilesystemShell::with_location(location)?)); .push(Box::new(FilesystemShell::with_location(
location,
context.registry().clone(),
)?));
} else { } else {
// If it's a file, attempt to open the file as a value and enter it // If it's a file, attempt to open the file as a value and enter it
let cwd = context.shell_manager.path(); let cwd = context.shell_manager.path();

View File

@ -64,10 +64,10 @@ impl CommandRegistry {
registry.insert(name.into(), command); registry.insert(name.into(), command);
} }
// crate fn names(&self) -> Vec<String> { crate fn names(&self) -> Vec<String> {
// let registry = self.registry.lock().unwrap(); let registry = self.registry.lock().unwrap();
// registry.keys().cloned().collect() registry.keys().cloned().collect()
// } }
} }
#[derive(Clone)] #[derive(Clone)]
@ -84,11 +84,12 @@ impl Context {
} }
crate fn basic() -> Result<Context, Box<dyn Error>> { crate fn basic() -> Result<Context, Box<dyn Error>> {
let registry = CommandRegistry::new();
Ok(Context { Ok(Context {
registry: CommandRegistry::new(), registry: registry.clone(),
source_map: SourceMap::new(), source_map: SourceMap::new(),
host: Arc::new(Mutex::new(crate::env::host::BasicHost)), host: Arc::new(Mutex::new(crate::env::host::BasicHost)),
shell_manager: ShellManager::basic()?, shell_manager: ShellManager::basic(registry)?,
}) })
} }

View File

@ -1,10 +1,11 @@
use crate::prelude::*;
use derive_new::new; use derive_new::new;
use rustyline::completion::{Completer, FilenameCompleter}; use rustyline::completion::{Completer, FilenameCompleter};
#[derive(new)] #[derive(new)]
crate struct NuCompleter { crate struct NuCompleter {
pub file_completer: FilenameCompleter, pub file_completer: FilenameCompleter,
//pub commands: indexmap::IndexMap<String, Arc<dyn Command>>, pub commands: CommandRegistry,
} }
impl NuCompleter { impl NuCompleter {
@ -14,7 +15,7 @@ impl NuCompleter {
pos: usize, pos: usize,
context: &rustyline::Context, context: &rustyline::Context,
) -> rustyline::Result<(usize, Vec<rustyline::completion::Pair>)> { ) -> rustyline::Result<(usize, Vec<rustyline::completion::Pair>)> {
//let commands: Vec<String> = self.commands.keys().cloned().collect(); let commands: Vec<String> = self.commands.names();
let mut completions = self.file_completer.complete(line, pos, context)?.1; let mut completions = self.file_completer.complete(line, pos, context)?.1;
@ -45,7 +46,6 @@ impl NuCompleter {
replace_pos -= 1; replace_pos -= 1;
} }
/*
for command in commands.iter() { for command in commands.iter() {
let mut pos = replace_pos; let mut pos = replace_pos;
let mut matched = true; let mut matched = true;
@ -63,13 +63,12 @@ impl NuCompleter {
} }
if matched { if matched {
completions.push(CompletionPair { completions.push(rustyline::completion::Pair {
display: command.clone(), display: command.clone(),
replacement: command.clone(), replacement: command.clone(),
}); });
} }
} }
*/
Ok((replace_pos, completions)) Ok((replace_pos, completions))
} }

View File

@ -18,6 +18,7 @@ impl Clone for FilesystemShell {
path: self.path.clone(), path: self.path.clone(),
completer: NuCompleter { completer: NuCompleter {
file_completer: FilenameCompleter::new(), file_completer: FilenameCompleter::new(),
commands: self.completer.commands.clone(),
}, },
hinter: HistoryHinter {}, hinter: HistoryHinter {},
} }
@ -25,23 +26,28 @@ impl Clone for FilesystemShell {
} }
impl FilesystemShell { impl FilesystemShell {
pub fn basic() -> Result<FilesystemShell, std::io::Error> { pub fn basic(commands: CommandRegistry) -> Result<FilesystemShell, std::io::Error> {
let path = std::env::current_dir()?; let path = std::env::current_dir()?;
Ok(FilesystemShell { Ok(FilesystemShell {
path: path.to_string_lossy().to_string(), path: path.to_string_lossy().to_string(),
completer: NuCompleter { completer: NuCompleter {
file_completer: FilenameCompleter::new(), file_completer: FilenameCompleter::new(),
commands,
}, },
hinter: HistoryHinter {}, hinter: HistoryHinter {},
}) })
} }
pub fn with_location(path: String) -> Result<FilesystemShell, std::io::Error> { pub fn with_location(
path: String,
commands: CommandRegistry,
) -> Result<FilesystemShell, std::io::Error> {
Ok(FilesystemShell { Ok(FilesystemShell {
path, path,
completer: NuCompleter { completer: NuCompleter {
file_completer: FilenameCompleter::new(), file_completer: FilenameCompleter::new(),
commands,
}, },
hinter: HistoryHinter {}, hinter: HistoryHinter {},
}) })

View File

@ -1,5 +1,6 @@
use crate::commands::command::EvaluatedStaticCommandArgs; use crate::commands::command::EvaluatedStaticCommandArgs;
use crate::errors::ShellError; use crate::errors::ShellError;
use crate::prelude::*;
use crate::shell::filesystem_shell::FilesystemShell; use crate::shell::filesystem_shell::FilesystemShell;
use crate::shell::shell::Shell; use crate::shell::shell::Shell;
use crate::stream::OutputStream; use crate::stream::OutputStream;
@ -12,9 +13,11 @@ pub struct ShellManager {
} }
impl ShellManager { impl ShellManager {
pub fn basic() -> Result<ShellManager, Box<dyn Error>> { pub fn basic(commands: CommandRegistry) -> Result<ShellManager, Box<dyn Error>> {
Ok(ShellManager { Ok(ShellManager {
shells: Arc::new(Mutex::new(vec![Box::new(FilesystemShell::basic()?)])), shells: Arc::new(Mutex::new(vec![Box::new(FilesystemShell::basic(
commands,
)?)])),
}) })
} }