reader handle_completions(): remove code duplication

We fail to flash the command line if we filter out completions due
to !reader_can_replace. Fix that and de-duplicate the logic
This commit is contained in:
Johannes Altmanninger
2026-01-03 14:45:23 +01:00
parent 972355e2fc
commit 9c867225ee

View File

@@ -6660,23 +6660,6 @@ fn try_insert(&mut self, c: Completion, tok: &wstr, token_range: Range<usize>) {
fn handle_completions(&mut self, token_range: Range<usize>, mut comp: Vec<Completion>) -> bool {
let tok = self.command_line.text()[token_range.clone()].to_owned();
// Check trivial cases.
let len = comp.len();
if len == 0 {
// No suitable completions found, flash screen and return.
if token_range.is_empty() {
self.flash(0..self.command_line.len());
} else {
self.flash(token_range);
}
return false;
} else if len == 1 {
// Exactly one suitable completion found - insert it.
let c = std::mem::take(&mut comp[0]);
self.try_insert(c, &tok, token_range);
return true;
}
comp.retain({
let best_rank = comp.iter().map(|c| c.rank()).min().unwrap_or(u32::MAX);
move |c| {
@@ -6698,10 +6681,18 @@ fn handle_completions(&mut self, token_range: Range<usize>, mut comp: Vec<Comple
}
}
if comp.len() == 1 {
// After sorting and stuff only one completion is left, use it.
let len = comp.len();
if len == 0 {
// No suitable completions found, flash screen and return.
if token_range.is_empty() {
self.flash(0..self.command_line.len());
} else {
self.flash(token_range);
}
return false;
} else if len == 1 {
// Exactly one suitable completion found - insert it.
let c = std::mem::take(&mut comp[0]);
self.try_insert(c, &tok, token_range);
return true;
}