aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Allison2022-12-23 02:23:34 +0000
committerGitHub2022-12-23 02:23:34 +0000
commit1b89d3e5350f83b2ffb86a86326bd2714308ee53 (patch)
tree36dcfc3b2bf385ba360892d79b9ae94a413855fe
parent7a1fa0c74fb2c3b7b1c9aea9aa77c5c612e0bd12 (diff)
Add file picker dialogue when opening a directory with :o (#2707)
-rw-r--r--helix-term/src/commands/typed.rs28
1 files changed, 22 insertions, 6 deletions
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index cb387fcb..c3a7c9fa 100644
--- a/helix-term/src/commands/typed.rs
+++ b/helix-term/src/commands/typed.rs
@@ -65,12 +65,28 @@ fn open(cx: &mut compositor::Context, args: &[Cow<str>], event: PromptEvent) ->
ensure!(!args.is_empty(), "wrong argument count");
for arg in args {
let (path, pos) = args::parse_file(arg);
- let _ = cx.editor.open(&path, Action::Replace)?;
- let (view, doc) = current!(cx.editor);
- let pos = Selection::point(pos_at_coords(doc.text().slice(..), pos, true));
- doc.set_selection(view.id, pos);
- // does not affect opening a buffer without pos
- align_view(doc, view, Align::Center);
+ // If the path is a directory, open a file picker on that directory and update the status
+ // message
+ if std::fs::canonicalize(&path)?.is_dir() {
+ let callback = async move {
+ let call: job::Callback = job::Callback::EditorCompositor(Box::new(
+ move |editor: &mut Editor, compositor: &mut Compositor| {
+ let picker = ui::file_picker(path, &editor.config());
+ compositor.push(Box::new(overlayed(picker)));
+ },
+ ));
+ Ok(call)
+ };
+ cx.jobs.callback(callback);
+ } else {
+ // Otherwise, just open the file
+ let _ = cx.editor.open(&path, Action::Replace)?;
+ let (view, doc) = current!(cx.editor);
+ let pos = Selection::point(pos_at_coords(doc.text().slice(..), pos, true));
+ doc.set_selection(view.id, pos);
+ // does not affect opening a buffer without pos
+ align_view(doc, view, Align::Center);
+ }
}
Ok(())
}