From e8fc77fe98a79473faacba544acae9e52b36903f Mon Sep 17 00:00:00 2001 From: Lorenzo Bellina <59364991+TheRealLorenz@users.noreply.github.com> Date: Mon, 4 Sep 2023 05:39:48 +0200 Subject: [PATCH] Maintain the current cursor's position and view in the vsplit/hsplit commands too (#8109) Co-authored-by: Benjamin Bouvier --- helix-term/src/commands.rs | 16 +++++++++------- helix-term/src/commands/typed.rs | 8 ++------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 6e3fb939..0fd011cc 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -4886,17 +4886,19 @@ fn transpose_view(cx: &mut Context) { cx.editor.transpose_view() } -// split helper, clear it later -fn split(cx: &mut Context, action: Action) { - let (view, doc) = current!(cx.editor); +/// Open a new split in the given direction specified by the action. +/// +/// Maintain the current view (both the cursor's position and view in document). +fn split(editor: &mut Editor, action: Action) { + let (view, doc) = current!(editor); let id = doc.id(); let selection = doc.selection(view.id).clone(); let offset = view.offset; - cx.editor.switch(id, action); + editor.switch(id, action); // match the selection in the previous view - let (view, doc) = current!(cx.editor); + let (view, doc) = current!(editor); doc.set_selection(view.id, selection); // match the view scroll offset (switch doesn't handle this fully // since the selection is only matched after the split) @@ -4904,7 +4906,7 @@ fn split(cx: &mut Context, action: Action) { } fn hsplit(cx: &mut Context) { - split(cx, Action::HorizontalSplit); + split(cx.editor, Action::HorizontalSplit); } fn hsplit_new(cx: &mut Context) { @@ -4912,7 +4914,7 @@ fn hsplit_new(cx: &mut Context) { } fn vsplit(cx: &mut Context) { - split(cx, Action::VerticalSplit); + split(cx.editor, Action::VerticalSplit); } fn vsplit_new(cx: &mut Context) { diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index 0e1d9431..e38853c0 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -1536,10 +1536,8 @@ fn vsplit( return Ok(()); } - let id = view!(cx.editor).doc; - if args.is_empty() { - cx.editor.switch(id, Action::VerticalSplit); + split(cx.editor, Action::VerticalSplit); } else { for arg in args { cx.editor @@ -1559,10 +1557,8 @@ fn hsplit( return Ok(()); } - let id = view!(cx.editor).doc; - if args.is_empty() { - cx.editor.switch(id, Action::HorizontalSplit); + split(cx.editor, Action::HorizontalSplit); } else { for arg in args { cx.editor