Skip to content

Commit

Permalink
Better sorting in picker in case of ties (helix-editor#5169)
Browse files Browse the repository at this point in the history
  • Loading branch information
matklad authored and hadronized committed Jan 4, 2023
1 parent d163549 commit 42104e1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
3 changes: 2 additions & 1 deletion helix-term/src/ui/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
19 changes: 13 additions & 6 deletions helix-term/src/ui/picker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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))
Expand All @@ -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())
}
}

Expand Down Expand Up @@ -502,6 +508,7 @@ impl<T: Item> Picker<T> {
})
}),
);

self.matches.sort_unstable();
}

Expand Down

0 comments on commit 42104e1

Please sign in to comment.