Force completers to sort in fetch()

Previously, there was a separate sort() method for completers, but it's
better to let them sort while fetching themselves, so that completions
for nested directories don't include slashes when sorting (they can sort
by the first component of the path, then the second, then so on)
This commit is contained in:
ysthakur 2024-06-23 10:26:26 -04:00
parent 9b7f899410
commit 1e166abf23
4 changed files with 10 additions and 50 deletions

View File

@ -1,7 +1,7 @@
use crate::completions::{CompletionOptions, SortBy};
use nu_protocol::{
engine::{Stack, StateWorkingSet},
levenshtein_distance, Span,
Span,
};
use reedline::Suggestion;
@ -23,28 +23,6 @@ pub trait Completer {
fn get_sort_by(&self) -> SortBy {
SortBy::Ascending
}
fn sort(&self, items: Vec<SemanticSuggestion>, prefix: Vec<u8>) -> Vec<SemanticSuggestion> {
let prefix_str = String::from_utf8_lossy(&prefix).to_string();
let mut filtered_items = items;
// Sort items
match self.get_sort_by() {
SortBy::LevenshteinDistance => {
filtered_items.sort_by(|a, b| {
let a_distance = levenshtein_distance(&prefix_str, &a.suggestion.value);
let b_distance = levenshtein_distance(&prefix_str, &b.suggestion.value);
a_distance.cmp(&b_distance)
});
}
SortBy::Ascending => {
filtered_items.sort_by(|a, b| a.suggestion.value.cmp(&b.suggestion.value));
}
SortBy::None => {}
};
filtered_items
}
}
#[derive(Debug, Default, PartialEq)]

View File

@ -51,8 +51,7 @@ impl NuCompleter {
..Default::default()
};
// Fetch
let mut suggestions = completer.fetch(
completer.fetch(
working_set,
&self.stack,
prefix.clone(),
@ -60,12 +59,7 @@ impl NuCompleter {
offset,
pos,
&options,
);
// Sort
suggestions = completer.sort(suggestions, prefix);
suggestions
)
}
fn external_completion(

View File

@ -36,7 +36,7 @@ impl Completer for DirectoryCompletion {
// Filter only the folders
#[allow(deprecated)]
let output: Vec<_> = directory_completion(
let items: Vec<_> = directory_completion(
span,
&prefix,
&working_set.permanent_state.current_work_dir(),
@ -62,13 +62,6 @@ impl Completer for DirectoryCompletion {
})
.collect();
output
}
// Sort results prioritizing the non hidden folders
fn sort(&self, items: Vec<SemanticSuggestion>, prefix: Vec<u8>) -> Vec<SemanticSuggestion> {
let prefix_str = String::from_utf8_lossy(&prefix).to_string();
// Sort items
let mut sorted_items = items;
@ -84,8 +77,8 @@ impl Completer for DirectoryCompletion {
}
SortBy::LevenshteinDistance => {
sorted_items.sort_by(|a, b| {
let a_distance = levenshtein_distance(&prefix_str, &a.suggestion.value);
let b_distance = levenshtein_distance(&prefix_str, &b.suggestion.value);
let a_distance = levenshtein_distance(&prefix, &a.suggestion.value);
let b_distance = levenshtein_distance(&prefix, &b.suggestion.value);
a_distance.cmp(&b_distance)
});
}

View File

@ -40,7 +40,7 @@ impl Completer for FileCompletion {
} = adjust_if_intermediate(&prefix, working_set, span);
#[allow(deprecated)]
let output: Vec<_> = complete_item(
let items: Vec<_> = complete_item(
readjusted,
span,
&prefix,
@ -67,12 +67,7 @@ impl Completer for FileCompletion {
})
.collect();
output
}
// Sort results prioritizing the non hidden folders
fn sort(&self, items: Vec<SemanticSuggestion>, prefix: Vec<u8>) -> Vec<SemanticSuggestion> {
let prefix_str = String::from_utf8_lossy(&prefix).to_string();
// Sort results prioritizing the non hidden folders
// Sort items
let mut sorted_items = items;
@ -89,8 +84,8 @@ impl Completer for FileCompletion {
}
SortBy::LevenshteinDistance => {
sorted_items.sort_by(|a, b| {
let a_distance = levenshtein_distance(&prefix_str, &a.suggestion.value);
let b_distance = levenshtein_distance(&prefix_str, &b.suggestion.value);
let a_distance = levenshtein_distance(&prefix, &a.suggestion.value);
let b_distance = levenshtein_distance(&prefix, &b.suggestion.value);
a_distance.cmp(&b_distance)
});
}