aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorAlex Kladov2022-12-17 19:30:43 +0000
committerGitHub2022-12-17 19:30:43 +0000
commite6a2df8c798537a7dc5aff264eeccc773525aa6c (patch)
treed9f2afe510d7e0d8b9a0c413745a18947d746e62 /helix-term/src
parentb12c65678aacc577b070c70307ef6fce528e4d85 (diff)
Better sorting in picker in case of ties (#5169)
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/ui/mod.rs3
-rw-r--r--helix-term/src/ui/picker.rs19
2 files changed, 15 insertions, 7 deletions
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index 5b5924bf..ade1d8cf 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -207,13 +207,14 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
// Cap the number of files if we aren't in a git project, preventing
// hangs when using the picker in your home directory
- let files: Vec<_> = if root.join(".git").exists() {
+ let mut files: Vec<PathBuf> = if root.join(".git").exists() {
files.collect()
} else {
// const MAX: usize = 8192;
const MAX: usize = 100_000;
files.take(MAX).collect()
};
+ files.sort();
log::debug!("file_picker init {:?}", Instant::now().duration_since(now));
diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs
index 2d471aae..aad3f81c 100644
--- a/helix-term/src/ui/picker.rs
+++ b/helix-term/src/ui/picker.rs
@@ -12,7 +12,10 @@ use tui::{
use fuzzy_matcher::skim::SkimMatcherV2 as Matcher;
use tui::widgets::Widget;
-use std::{cmp::Ordering, time::Instant};
+use std::{
+ cmp::{self, Ordering},
+ time::Instant,
+};
use std::{collections::HashMap, io::Read, path::PathBuf};
use crate::ui::{Prompt, PromptEvent};
@@ -344,11 +347,17 @@ impl<T: Item + 'static> Component for FilePicker<T> {
#[derive(PartialEq, Eq, Debug)]
struct PickerMatch {
- index: usize,
score: i64,
+ index: usize,
len: usize,
}
+impl PickerMatch {
+ fn key(&self) -> impl Ord {
+ (cmp::Reverse(self.score), self.len, self.index)
+ }
+}
+
impl PartialOrd for PickerMatch {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
@@ -357,10 +366,7 @@ impl PartialOrd for PickerMatch {
impl Ord for PickerMatch {
fn cmp(&self, other: &Self) -> Ordering {
- self.score
- .cmp(&other.score)
- .reverse()
- .then_with(|| self.len.cmp(&other.len))
+ self.key().cmp(&other.key())
}
}
@@ -502,6 +508,7 @@ impl<T: Item> Picker<T> {
})
}),
);
+
self.matches.sort_unstable();
}