Unnamed repository; edit this file 'description' to name the repository.
Support features of :open in :vsplit & :hsplit (#13461)
| -rw-r--r-- | helix-term/src/commands/typed.rs | 19 | ||||
| -rw-r--r-- | 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 666b6fd5..263d337a 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); @@ -1815,10 +1820,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(()) @@ -1832,10 +1834,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 3f3aaba2..a6a0e17c 100644 --- a/helix-term/src/ui/picker.rs +++ b/helix-term/src/ui/picker.rs @@ -258,6 +258,7 @@ pub struct Picker<T: 'static + Send + Sync, D: 'static> { widths: Vec<Constraint>, callback_fn: PickerCallback<T>, + default_action: Action, pub truncate_start: bool, /// Caches paths to documents @@ -382,6 +383,7 @@ impl<T: 'static + Send + Sync, D: 'static + Send + Sync> Picker<T, D> { 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<T: 'static + Send + Sync, D: 'static + Send + Sync> Picker<T, D> { 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(); @@ -1071,7 +1078,7 @@ impl<I: 'static + Send + Sync, D: 'static + Send + Sync> Component for Picker<I, key!(Esc) | ctrl!('c') => 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) => { @@ -1095,7 +1102,7 @@ impl<I: 'static + Send + Sync, D: 'static + Send + Sync> Component for Picker<I, self.handle_prompt_change(true); } else { if let Some(option) = self.selection() { - (self.callback_fn)(ctx, option, Action::Replace); + (self.callback_fn)(ctx, option, self.default_action); } if let Some(history_register) = self.prompt.history_register() { if let Err(err) = ctx |