@@ -76,11 +76,22 @@ pub fn regex_prompt(
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 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() {
87+ .or_else(|_| metadata.modified())
88+ .or_else(|_| metadata.created())
89+ .unwrap_or(time::UNIX_EPOCH)
83− Some(entry.into_path())
94+ Some((entry.into_path(), time))
@@ -88,13 +99,17 @@ pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
88 Err(_err) => None,
99 Err(_err) => None,
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()
94 const MAX: usize = 8192;
105 const MAX: usize = 8192;
95 files.take(MAX).collect()
106 files.take(MAX).collect()
109+ files.sort_by_key(|file| file.1);
111+ let files = files.into_iter().map(|(path, _)| path).collect();
98 Picker::new(
113 Picker::new(
100 move |path: &PathBuf| {
115 move |path: &PathBuf| {