on master help sign in
Minor cleanup of file picker file gathering logic (#1683)
bdbf423Daniel S Poulin
helix-term/src/ui/mod.rs+22−13
@@ -101,8 +101,6 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
101 use ignore::{types::TypesBuilder, WalkBuilder};
101 use ignore::{types::TypesBuilder, WalkBuilder};
102 use std::time;
102 use std::time;
103
103
104− // We want to exclude files that the editor can't handle yet
105− let mut type_builder = TypesBuilder::new();
106 let mut walk_builder = WalkBuilder::new(&root);
104 let mut walk_builder = WalkBuilder::new(&root);
107 walk_builder
105 walk_builder
108 .hidden(config.file_picker.hidden)
106 .hidden(config.file_picker.hidden)
@@ -117,18 +115,25 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
117 // in our picker.
115 // in our picker.
118 .filter_entry(|entry| entry.file_name() != ".git");
116 .filter_entry(|entry| entry.file_name() != ".git");
119
117
118+ // We want to exclude files that the editor can't handle yet
119+ let mut type_builder = TypesBuilder::new();
120+
120− let walk_builder = match type_builder.add(
121+ type_builder
122+ .add(
121− "compressed",
123+ "compressed",
122− "*.{zip,gz,bz2,zst,lzo,sz,tgz,tbz2,lz,lz4,lzma,lzo,z,Z,xz,7z,rar,cab}",
124+ "*.{zip,gz,bz2,zst,lzo,sz,tgz,tbz2,lz,lz4,lzma,lzo,z,Z,xz,7z,rar,cab}",
123− ) {
125+ )
124− Err(_) => &walk_builder,
126+ // This shouldn't panic as the above is static, but if it ever
125− _ => {
127+ // is changed and becomes invalid it will catch here rather than
128+ // being unnoticed.
129+ .expect("Invalid type definition");
126− type_builder.negate("all");
130+ type_builder.negate("all");
131+
127− let excluded_types = type_builder.build().unwrap();
132+ if let Ok(excluded_types) = type_builder.build() {
128− walk_builder.types(excluded_types)
133+ walk_builder.types(excluded_types);
129− }
130− };
134+ }
131
135
136+ // We want files along with their modification date for sorting
132 let files = walk_builder.build().filter_map(|entry| {
137 let files = walk_builder.build().filter_map(|entry| {
133 let entry = entry.ok()?;
138 let entry = entry.ok()?;
134 // Path::is_dir() traverses symlinks, so we use it over DirEntry::is_dir
139 // Path::is_dir() traverses symlinks, so we use it over DirEntry::is_dir
@@ -148,6 +153,8 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
148 Some((entry.into_path(), time))
153 Some((entry.into_path(), time))
149 });
154 });
150
155
156+ // Cap the number of files if we aren't in a git project, preventing
157+ // hangs when using the picker in your home directory
151 let mut files: Vec<_> = if root.join(".git").is_dir() {
158 let mut files: Vec<_> = if root.join(".git").is_dir() {
152 files.collect()
159 files.collect()
153 } else {
160 } else {
@@ -155,8 +162,10 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
155 files.take(MAX).collect()
162 files.take(MAX).collect()
156 };
163 };
157
164
165+ // Most recently modified first
158 files.sort_by_key(|file| std::cmp::Reverse(file.1));
166 files.sort_by_key(|file| std::cmp::Reverse(file.1));
159
167
168+ // Strip the time data so we can send just the paths to the FilePicker
160 let files = files.into_iter().map(|(path, _)| path).collect();
169 let files = files.into_iter().map(|(path, _)| path).collect();
161
170
162 FilePicker::new(
171 FilePicker::new(