on master help sign in
Sort files in file picker by access, modification and creation date (#336)
eb6fb63Wojciech Kępka
helix-term/src/ui/mod.rs+17−2
@@ -76,11 +76,22 @@ pub fn regex_prompt(
76
76
77pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
77pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
78 use ignore::Walk;
78 use ignore::Walk;
79+ use std::time;
79 let files = Walk::new(root.clone()).filter_map(|entry| match entry {
80 let files = Walk::new(root.clone()).filter_map(|entry| match entry {
80 Ok(entry) => {
81 Ok(entry) => {
81 // filter dirs, but we might need special handling for symlinks!
82 // filter dirs, but we might need special handling for symlinks!
82 if !entry.file_type().map_or(false, |entry| entry.is_dir()) {
83 if !entry.file_type().map_or(false, |entry| entry.is_dir()) {
84+ let time = if let Ok(metadata) = entry.metadata() {
85+ metadata
86+ .accessed()
87+ .or_else(|_| metadata.modified())
88+ .or_else(|_| metadata.created())
89+ .unwrap_or(time::UNIX_EPOCH)
90+ } else {
91+ time::UNIX_EPOCH
92+ };
93+
83− Some(entry.into_path())
94+ Some((entry.into_path(), time))
84 } else {
95 } else {
85 None
96 None
86 }
97 }
@@ -88,13 +99,17 @@ pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
88 Err(_err) => None,
99 Err(_err) => None,
89 });
100 });
90
101
91− let files = if root.join(".git").is_dir() {
102+ let mut files: Vec<_> = if root.join(".git").is_dir() {
92 files.collect()
103 files.collect()
93 } else {
104 } else {
94 const MAX: usize = 8192;
105 const MAX: usize = 8192;
95 files.take(MAX).collect()
106 files.take(MAX).collect()
96 };
107 };
97
108
109+ files.sort_by_key(|file| file.1);
110+
111+ let files = files.into_iter().map(|(path, _)| path).collect();
112+
98 Picker::new(
113 Picker::new(
99 files,
114 files,
100 move |path: &PathBuf| {
115 move |path: &PathBuf| {