Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/ui/mod.rs')
-rw-r--r--helix-term/src/ui/mod.rs39
1 files changed, 30 insertions, 9 deletions
diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs
index 21a68d7f..a76adbe2 100644
--- a/helix-term/src/ui/mod.rs
+++ b/helix-term/src/ui/mod.rs
@@ -30,7 +30,7 @@ pub use spinner::{ProgressSpinners, Spinner};
pub use text::Text;
use helix_view::Editor;
-use tui::text::Span;
+use tui::text::{Span, Spans};
use std::path::Path;
use std::{error::Error, path::PathBuf};
@@ -185,12 +185,23 @@ pub fn raw_regex_prompt(
cx.push_layer(Box::new(prompt));
}
-type FilePicker = Picker<PathBuf, PathBuf>;
+#[derive(Debug)]
+pub struct FilePickerData {
+ root: PathBuf,
+ directory_style: Style,
+}
+type FilePicker = Picker<PathBuf, FilePickerData>;
-pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePicker {
+pub fn file_picker(editor: &Editor, root: PathBuf) -> FilePicker {
use ignore::{types::TypesBuilder, WalkBuilder};
use std::time::Instant;
+ let config = editor.config();
+ let data = FilePickerData {
+ root: root.clone(),
+ directory_style: editor.theme.get("ui.text.directory"),
+ };
+
let now = Instant::now();
let dedup_symlinks = config.file_picker.deduplicate_links;
@@ -236,14 +247,24 @@ pub fn file_picker(root: PathBuf, config: &helix_view::editor::Config) -> FilePi
let columns = [PickerColumn::new(
"path",
- |item: &PathBuf, root: &PathBuf| {
- item.strip_prefix(root)
- .unwrap_or(item)
- .to_string_lossy()
- .into()
+ |item: &PathBuf, data: &FilePickerData| {
+ let path = item.strip_prefix(&data.root).unwrap_or(item);
+ let mut spans = Vec::with_capacity(3);
+ if let Some(dirs) = path.parent().filter(|p| !p.as_os_str().is_empty()) {
+ spans.extend([
+ Span::styled(dirs.to_string_lossy(), data.directory_style),
+ Span::styled(std::path::MAIN_SEPARATOR_STR, data.directory_style),
+ ]);
+ }
+ let filename = path
+ .file_name()
+ .expect("normalized paths can't end in `..`")
+ .to_string_lossy();
+ spans.push(Span::raw(filename));
+ Spans::from(spans).into()
},
)];
- let picker = Picker::new(columns, 0, [], root, move |cx, path: &PathBuf, action| {
+ let picker = Picker::new(columns, 0, [], data, move |cx, path: &PathBuf, action| {
if let Err(e) = cx.editor.open(path, action) {
let err = if let Some(err) = e.source() {
format!("{}", err)