mirror of
https://github.com/nushell/nushell.git
synced 2024-11-22 00:13:21 +01:00
Add path completion to existing completions
This commit is contained in:
parent
52716d0c24
commit
1c44de4bba
@ -15,7 +15,7 @@ impl completion::Completer for Completer {
|
||||
_pos: usize,
|
||||
_ctx: &Context<'_>,
|
||||
) -> rustyline::Result<(usize, Vec<completion::Pair>)> {
|
||||
let pairs = self
|
||||
let pairs: Vec<completion::Pair> = self
|
||||
.commands
|
||||
.keys()
|
||||
.map(|k| completion::Pair {
|
||||
|
@ -1,26 +1,48 @@
|
||||
use rustyline::completion::{Candidate, Completer};
|
||||
use rustyline::completion::Completer;
|
||||
use rustyline::completion::{self, FilenameCompleter};
|
||||
use rustyline::line_buffer::LineBuffer;
|
||||
|
||||
#[derive(Debug)]
|
||||
crate struct NuCompleter;
|
||||
crate struct NuCompleter {
|
||||
pub file_completer: FilenameCompleter,
|
||||
}
|
||||
|
||||
impl Completer for NuCompleter {
|
||||
type Candidate = NuPair;
|
||||
type Candidate = completion::Pair;
|
||||
|
||||
fn complete(
|
||||
&self,
|
||||
_line: &str,
|
||||
_pos: usize,
|
||||
_context: &rustyline::Context,
|
||||
) -> rustyline::Result<(usize, Vec<NuPair>)> {
|
||||
Ok((
|
||||
0,
|
||||
vec![
|
||||
NuPair("exit", "exit"),
|
||||
NuPair("ls", "ls"),
|
||||
NuPair("ps", "ps"),
|
||||
],
|
||||
))
|
||||
line: &str,
|
||||
pos: usize,
|
||||
context: &rustyline::Context,
|
||||
) -> rustyline::Result<(usize, Vec<completion::Pair>)> {
|
||||
let mut pairs = vec![
|
||||
completion::Pair {
|
||||
display: "exit".to_string(),
|
||||
replacement: "exit".to_string(),
|
||||
},
|
||||
completion::Pair {
|
||||
display: "ls".to_string(),
|
||||
replacement: "ls".to_string(),
|
||||
},
|
||||
completion::Pair {
|
||||
display: "ps".to_string(),
|
||||
replacement: "ps".to_string(),
|
||||
},
|
||||
];
|
||||
|
||||
let mut completions = self.file_completer.complete(line, pos, context)?.1;
|
||||
completions.append(&mut pairs);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
Ok((replace_pos, completions))
|
||||
}
|
||||
|
||||
fn update(&self, line: &mut LineBuffer, start: usize, elected: &str) {
|
||||
@ -28,14 +50,3 @@ impl Completer for NuCompleter {
|
||||
line.replace(start..end, elected)
|
||||
}
|
||||
}
|
||||
|
||||
crate struct NuPair(&'static str, &'static str);
|
||||
|
||||
impl Candidate for NuPair {
|
||||
fn display(&self) -> &str {
|
||||
self.0
|
||||
}
|
||||
fn replacement(&self) -> &str {
|
||||
self.1
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::shell::completer::{NuCompleter, NuPair};
|
||||
use crate::shell::completer::NuCompleter;
|
||||
|
||||
use rustyline::completion::Completer;
|
||||
use rustyline::completion::{self, Completer, FilenameCompleter};
|
||||
use rustyline::error::ReadlineError;
|
||||
use rustyline::highlight::{Highlighter, MatchingBracketHighlighter};
|
||||
use rustyline::hint::{Hinter, HistoryHinter};
|
||||
@ -15,7 +15,9 @@ crate struct Helper {
|
||||
impl Helper {
|
||||
crate fn new() -> Helper {
|
||||
Helper {
|
||||
completer: NuCompleter,
|
||||
completer: NuCompleter {
|
||||
file_completer: FilenameCompleter::new(),
|
||||
},
|
||||
highlighter: MatchingBracketHighlighter::new(),
|
||||
hinter: HistoryHinter {},
|
||||
}
|
||||
@ -23,14 +25,14 @@ impl Helper {
|
||||
}
|
||||
|
||||
impl Completer for Helper {
|
||||
type Candidate = NuPair;
|
||||
type Candidate = completion::Pair;
|
||||
|
||||
fn complete(
|
||||
&self,
|
||||
line: &str,
|
||||
pos: usize,
|
||||
ctx: &rustyline::Context<'_>,
|
||||
) -> Result<(usize, Vec<NuPair>), ReadlineError> {
|
||||
) -> Result<(usize, Vec<completion::Pair>), ReadlineError> {
|
||||
self.completer.complete(line, pos, ctx)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user