@@ -76,11 +76,22 @@ pub fn regex_prompt(
7676
7777pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
7878 use ignore::Walk;
79+ use std::time;
7980 let files = Walk::new(root.clone()).filter_map(|entry| match entry {
8081 Ok(entry) => {
8182 // filter dirs, but we might need special handling for symlinks!
8283 if !entry.file_type().map_or(false, |entry| entry.is_dir()) {
83− Some(entry.into_path())
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+
94+ Some((entry.into_path(), time))
8495 } else {
8596 None
8697 }
@@ -88,13 +99,17 @@ pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
8899 Err(_err) => None,
89100 });
90101
91− let files = if root.join(".git").is_dir() {
102+ let mut files: Vec<_> = if root.join(".git").is_dir() {
92103 files.collect()
93104 } else {
94105 const MAX: usize = 8192;
95106 files.take(MAX).collect()
96107 };
97108
109+ files.sort_by_key(|file| file.1);
110+
111+ let files = files.into_iter().map(|(path, _)| path).collect();
112+
98113 Picker::new(
99114 files,
100115 move |path: &PathBuf| {