From 0a10d33eb54204991f1526e6e14547fcddb7d2ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20K=C3=B6hnen?= Date: Fri, 2 May 2025 18:13:56 +0200 Subject: [PATCH] Support features of :open in :vsplit & :hsplit --- helix-term/src/commands/typed.rs | 19 +++++++++---------- helix-term/src/ui/picker.rs | 11 +++++++++-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index c35ff714a..70fb53d4b 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -104,6 +104,10 @@ fn open(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyhow: return Ok(()); } + open_impl(cx, args, Action::Replace) +} + +fn open_impl(cx: &mut compositor::Context, args: Args, action: Action) -> anyhow::Result<()> { for arg in args { let (path, pos) = crate::args::parse_file(&arg); let path = helix_stdx::path::expand_tilde(path); @@ -113,7 +117,8 @@ fn open(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyhow: 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(editor, path.into_owned()); + let picker = + ui::file_picker(editor, path.into_owned()).with_default_action(action); compositor.push(Box::new(overlaid(picker))); }, )); @@ -122,7 +127,7 @@ fn open(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyhow: cx.jobs.callback(callback); } else { // Otherwise, just open the file - let _ = cx.editor.open(&path, Action::Replace)?; + let _ = cx.editor.open(&path, action)?; let (view, doc) = current!(cx.editor); let pos = Selection::point(pos_at_coords(doc.text().slice(..), pos, true)); doc.set_selection(view.id, pos); @@ -1750,10 +1755,7 @@ fn vsplit(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyho if args.is_empty() { split(cx.editor, Action::VerticalSplit); } else { - for arg in args { - cx.editor - .open(&PathBuf::from(arg.as_ref()), Action::VerticalSplit)?; - } + open_impl(cx, args, Action::VerticalSplit)?; } Ok(()) @@ -1767,10 +1769,7 @@ fn hsplit(cx: &mut compositor::Context, args: Args, event: PromptEvent) -> anyho if args.is_empty() { split(cx.editor, Action::HorizontalSplit); } else { - for arg in args { - cx.editor - .open(&PathBuf::from(arg.as_ref()), Action::HorizontalSplit)?; - } + open_impl(cx, args, Action::HorizontalSplit)?; } Ok(()) diff --git a/helix-term/src/ui/picker.rs b/helix-term/src/ui/picker.rs index a6ce91a67..e1391ec58 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -258,6 +258,7 @@ pub struct Picker { widths: Vec, callback_fn: PickerCallback, + default_action: Action, pub truncate_start: bool, /// Caches paths to documents @@ -382,6 +383,7 @@ impl Picker { truncate_start: true, show_preview: true, callback_fn: Box::new(callback_fn), + default_action: Action::Replace, completion_height: 0, widths, preview_cache: HashMap::new(), @@ -440,6 +442,11 @@ impl Picker { self } + pub fn with_default_action(mut self, action: Action) -> Self { + self.default_action = action; + self + } + /// Move the cursor by a number of lines, either down (`Forward`) or up (`Backward`) pub fn move_by(&mut self, amount: u32, direction: Direction) { let len = self.matcher.snapshot().matched_item_count(); @@ -1068,7 +1075,7 @@ impl Component for Picker return close_fn(self), alt!(Enter) => { if let Some(option) = self.selection() { - (self.callback_fn)(ctx, option, Action::Replace); + (self.callback_fn)(ctx, option, self.default_action); } } key!(Enter) => { @@ -1092,7 +1099,7 @@ impl Component for Picker