From 19b7864062462e56545cfcca8402659573524f60 Mon Sep 17 00:00:00 2001 From: Robin Date: Fri, 22 Jul 2022 03:23:00 +0200 Subject: [PATCH] keep jump/file history when using :split (#3031) * keep jump/file history when using :split * move history cloning into the switch function Co-authored-by: Robin --- helix-term/src/commands.rs | 2 -- helix-view/src/editor.rs | 7 ++++++- helix-view/src/tree.rs | 8 ++++++-- helix-view/src/view.rs | 1 + 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 12d988d09917..6fdc215a89c2 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -4083,13 +4083,11 @@ fn split(cx: &mut Context, action: Action) { let (view, doc) = current!(cx.editor); let id = doc.id(); let selection = doc.selection(view.id).clone(); - let offset = view.offset; cx.editor.switch(id, action); // match the selection in the previous view let (view, doc) = current!(cx.editor); - view.offset = offset; doc.set_selection(view.id, selection); } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 7ac52f505dc9..6cd4515c076e 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -874,7 +874,12 @@ impl Editor { return; } Action::HorizontalSplit | Action::VerticalSplit => { - let view = View::new(id, self.config().gutters.clone()); + // copy the current view, unless there is no view yet + let view = self + .tree + .try_get(self.tree.focus) + .cloned() + .unwrap_or_else(|| View::new(id, self.config().gutters.clone())); let view_id = self.tree.split( view, match action { diff --git a/helix-view/src/tree.rs b/helix-view/src/tree.rs index 3ba85b560f81..c4474c33cf41 100644 --- a/helix-view/src/tree.rs +++ b/helix-view/src/tree.rs @@ -271,12 +271,16 @@ impl Tree { } pub fn get(&self, index: ViewId) -> &View { + self.try_get(index).unwrap() + } + + pub fn try_get(&self, index: ViewId) -> Option<&View> { match &self.nodes[index] { Node { content: Content::View(view), .. - } => view, - _ => unreachable!(), + } => Some(view), + _ => None, } } diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs index e74e0f651db6..e7fc16ab7b74 100644 --- a/helix-view/src/view.rs +++ b/helix-view/src/view.rs @@ -64,6 +64,7 @@ impl JumpList { } } +#[derive(Clone)] pub struct View { pub id: ViewId, pub offset: Position,