diff --git a/helix-core/src/state.rs b/helix-core/src/state.rs index 7fd620a52..4d531aa02 100644 --- a/helix-core/src/state.rs +++ b/helix-core/src/state.rs @@ -4,6 +4,7 @@ use crate::{ChangeSet, Diagnostic, Position, Range, Rope, RopeSlice, Selection, use anyhow::Error; /// A state represents the current editor state of a single buffer. +#[derive(Clone)] pub struct State { // TODO: fields should be private but we need to refactor commands.rs first pub doc: Rope, diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs index 6bf89040f..06c4b9e0d 100644 --- a/helix-view/src/commands.rs +++ b/helix-view/src/commands.rs @@ -411,15 +411,9 @@ fn append_changes_to_history(view: &mut View) { // TODO: trigger lsp/documentDidChange with changes // HAXX: we need to reconstruct the state as it was before the changes.. - let (doc, selection) = view.doc.old_state.take().unwrap(); - let mut old_state = State::new(doc); - old_state.selection = selection; - + let old_state = std::mem::replace(&mut view.doc.old_state, view.doc.state.clone()); // TODO: take transaction by value? view.doc.history.commit_revision(&transaction, &old_state); - - // HAXX - view.doc.old_state = Some((view.doc.text().clone(), view.doc.state.selection.clone())); } pub fn normal_mode(view: &mut View, _count: usize) { diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 04018ed6a..22438926e 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -27,9 +27,9 @@ pub struct Document { /// Pending changes since last history commit. pub changes: ChangeSet, + pub old_state: State, pub history: History, pub version: i64, // should be usize? - pub old_state: Option<(Rope, Selection)>, pub diagnostics: Vec, } @@ -55,7 +55,7 @@ use url::Url; impl Document { fn new(state: State) -> Self { let changes = ChangeSet::new(&state.doc); - let old_state = Some((state.doc.clone(), Selection::single(0, 0))); + let old_state = state.clone(); Self { path: None,