Skip to content

Commit

Permalink
Maintain the current cursor's position and view in the vsplit/hsplit …
Browse files Browse the repository at this point in the history
…commands too (helix-editor#8109)

Co-authored-by: Benjamin Bouvier <public@benj.me>
  • Loading branch information
2 people authored and dgkf committed Jan 30, 2024
1 parent a50c9a7 commit eeab18a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 13 deletions.
16 changes: 9 additions & 7 deletions helix-term/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4886,33 +4886,35 @@ 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)
view.offset = offset;
}

fn hsplit(cx: &mut Context) {
split(cx, Action::HorizontalSplit);
split(cx.editor, Action::HorizontalSplit);
}

fn hsplit_new(cx: &mut Context) {
cx.editor.new_file(Action::HorizontalSplit);
}

fn vsplit(cx: &mut Context) {
split(cx, Action::VerticalSplit);
split(cx.editor, Action::VerticalSplit);
}

fn vsplit_new(cx: &mut Context) {
Expand Down
8 changes: 2 additions & 6 deletions helix-term/src/commands/typed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit eeab18a

Please sign in to comment.