mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-23 07:41:03 +00:00
feat: new sort_sensitive option, and sort case-insensitively by default (#155)
This commit is contained in:
parent
b62307dc4a
commit
902c094224
5 changed files with 31 additions and 9 deletions
|
|
@ -151,6 +151,7 @@ impl Executor {
|
|||
let b = cx.manager.active_mut().set_sorter(FilesSorter {
|
||||
by: SortBy::try_from(exec.args.get(0).cloned().unwrap_or_default())
|
||||
.unwrap_or_default(),
|
||||
sensitive: exec.named.contains_key("sensitive"),
|
||||
reverse: exec.named.contains_key("reverse"),
|
||||
dir_first: exec.named.contains_key("dir_first"),
|
||||
});
|
||||
|
|
|
|||
|
|
@ -14,6 +14,11 @@
|
|||
- `"natural"`: Sort naturally, e.g. `1.md` < `2.md` < `10.md`
|
||||
- `"size"`: Sort by file size
|
||||
|
||||
- sort_sensitive: Sort case-sensitively
|
||||
|
||||
- `true`: Case-sensitive
|
||||
- `false`: Case-insensitive
|
||||
|
||||
- sort_reverse: Display files in reverse order
|
||||
|
||||
- `true`: Reverse order
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
[manager]
|
||||
layout = [ 1, 4, 3 ]
|
||||
sort_by = "modified"
|
||||
sort_sensitive = false
|
||||
sort_reverse = true
|
||||
sort_dir_first = true
|
||||
show_hidden = false
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ pub struct Manager {
|
|||
|
||||
// Sorting
|
||||
pub sort_by: SortBy,
|
||||
pub sort_sensitive: bool,
|
||||
pub sort_reverse: bool,
|
||||
pub sort_dir_first: bool,
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use std::{cmp::Ordering, collections::BTreeMap, mem};
|
||||
use std::{cmp::Ordering, collections::BTreeMap, mem, ops::Deref};
|
||||
|
||||
use config::{manager::SortBy, MANAGER};
|
||||
use shared::Url;
|
||||
|
|
@ -8,6 +8,7 @@ use super::File;
|
|||
#[derive(Clone, Copy, PartialEq)]
|
||||
pub struct FilesSorter {
|
||||
pub by: SortBy,
|
||||
pub sensitive: bool,
|
||||
pub reverse: bool,
|
||||
pub dir_first: bool,
|
||||
}
|
||||
|
|
@ -16,6 +17,7 @@ impl Default for FilesSorter {
|
|||
fn default() -> Self {
|
||||
Self {
|
||||
by: MANAGER.sort_by,
|
||||
sensitive: MANAGER.sort_sensitive,
|
||||
reverse: MANAGER.sort_reverse,
|
||||
dir_first: MANAGER.sort_dir_first,
|
||||
}
|
||||
|
|
@ -29,9 +31,17 @@ impl FilesSorter {
|
|||
}
|
||||
|
||||
match self.by {
|
||||
SortBy::Alphabetical => {
|
||||
items.sort_unstable_by(|a, b| self.cmp(&*a.url, &*b.url, self.promote(a, b)))
|
||||
}
|
||||
SortBy::Alphabetical => items.sort_unstable_by(|a, b| {
|
||||
if self.sensitive {
|
||||
return self.cmp(&*a.url, &*b.url, self.promote(a, b));
|
||||
}
|
||||
|
||||
self.cmp(
|
||||
a.url.as_os_str().to_ascii_lowercase(),
|
||||
b.url.as_os_str().to_ascii_lowercase(),
|
||||
self.promote(a, b),
|
||||
)
|
||||
}),
|
||||
SortBy::Created => items.sort_unstable_by(|a, b| {
|
||||
if let (Ok(aa), Ok(bb)) = (a.meta.created(), b.meta.created()) {
|
||||
return self.cmp(aa, bb, self.promote(a, b));
|
||||
|
|
@ -65,12 +75,16 @@ impl FilesSorter {
|
|||
indices.sort_unstable_by(|&a, &b| {
|
||||
let promote = self.promote(entities[a].1, entities[b].1);
|
||||
if promote != Ordering::Equal {
|
||||
promote
|
||||
} else if self.reverse {
|
||||
natord::compare(&entities[b].0, &entities[a].0)
|
||||
} else {
|
||||
natord::compare(&entities[a].0, &entities[b].0)
|
||||
return promote;
|
||||
}
|
||||
|
||||
let ordering = if self.sensitive {
|
||||
natord::compare(&entities[a].0, &entities[b].0)
|
||||
} else {
|
||||
natord::compare_ignore_case(&entities[a].0, &entities[b].0)
|
||||
};
|
||||
|
||||
if self.reverse { ordering.reverse() } else { ordering }
|
||||
});
|
||||
|
||||
let dummy = File {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue