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)]
|
2019-05-18 04:30:57 +02:00
|
|
|
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-18 04:30:57 +02:00
|
|
|
}
|
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,
|
2019-05-18 04:30:57 +02:00
|
|
|
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();
|
2019-05-18 04:30:57 +02:00
|
|
|
|
|
|
|
let mut completions = self.file_completer.complete(line, pos, context)?.1;
|
|
|
|
|
2019-07-15 07:40:27 +02:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-18 04:30:57 +02:00
|
|
|
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
|
|
|
|
2019-05-18 04:30:57 +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
|
|
|
}
|