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 <robinvandijk@klippa.com>
This commit is contained in:
Robin 2022-07-22 03:23:00 +02:00 committed by GitHub
parent 2f53644c6d
commit 19b7864062
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 5 deletions

View File

@ -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);
}

View File

@ -874,7 +874,12 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
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 {

View File

@ -271,12 +271,16 @@ pub fn views_mut(&mut self) -> impl Iterator<Item = (&mut View, bool)> {
}
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,
}
}

View File

@ -64,6 +64,7 @@ pub fn get(&self) -> &[Jump] {
}
}
#[derive(Clone)]
pub struct View {
pub id: ViewId,
pub offset: Position,