nushell/src/shell/completer.rs

82 lines
2.6 KiB
Rust
Raw Normal View History

2019-05-26 08:54:41 +02:00
use derive_new::new;
2019-08-09 22:49:43 +02:00
use rustyline::completion::{Completer, FilenameCompleter};
2019-05-16 23:43:36 +02:00
2019-05-26 08:54:41 +02:00
#[derive(new)]
crate struct NuCompleter {
pub file_completer: FilenameCompleter,
2019-08-07 19:49:11 +02:00
//pub commands: indexmap::IndexMap<String, Arc<dyn Command>>,
}
2019-05-16 23:43:36 +02:00
2019-08-09 06:51:21 +02:00
impl NuCompleter {
pub fn complete(
2019-05-16 23:43:36 +02:00
&self,
line: &str,
pos: usize,
context: &rustyline::Context,
2019-08-09 21:42:23 +02:00
) -> rustyline::Result<(usize, Vec<rustyline::completion::Pair>)> {
2019-08-07 19:49:11 +02:00
//let commands: Vec<String> = self.commands.keys().cloned().collect();
let mut completions = self.file_completer.complete(line, pos, context)?.1;
for completion in &mut completions {
if completion.replacement.contains("\\ ") {
completion.replacement = completion.replacement.replace("\\ ", " ");
}
if completion.replacement.contains("\\(") {
completion.replacement = completion.replacement.replace("\\(", "(");
}
if completion.replacement.contains(" ") || completion.replacement.contains("(") {
if !completion.replacement.starts_with("\"") {
completion.replacement = format!("\"{}", completion.replacement);
}
if !completion.replacement.ends_with("\"") {
completion.replacement = format!("{}\"", completion.replacement);
}
}
}
let line_chars: Vec<_> = line.chars().collect();
let mut replace_pos = pos;
while replace_pos > 0 {
if line_chars[replace_pos - 1] == ' ' {
break;
}
replace_pos -= 1;
}
2019-08-07 19:49:11 +02:00
/*
2019-05-18 16:06:01 +02:00
for command in commands.iter() {
let mut pos = replace_pos;
let mut matched = true;
if pos < line_chars.len() {
for chr in command.chars() {
if line_chars[pos] != chr {
matched = false;
break;
}
pos += 1;
if pos == line_chars.len() {
break;
}
}
}
if matched {
2019-08-09 06:51:21 +02:00
completions.push(CompletionPair {
2019-06-09 19:52:56 +02:00
display: command.clone(),
replacement: command.clone(),
2019-05-18 16:06:01 +02:00
});
}
}
2019-08-07 19:49:11 +02:00
*/
2019-05-18 16:06:01 +02:00
Ok((replace_pos, completions))
2019-05-16 23:43:36 +02:00
}
2019-08-09 22:49:43 +02:00
// fn update(&self, line: &mut LineBuffer, start: usize, elected: &str) {
// let end = line.pos();
// line.replace(start..end, elected)
// }
2019-05-16 23:43:36 +02:00
}