summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-core/src/state.rs1
-rw-r--r--helix-view/src/commands.rs8
-rw-r--r--helix-view/src/document.rs4
3 files changed, 4 insertions, 9 deletions
diff --git a/helix-core/src/state.rs b/helix-core/src/state.rs
index 7fd620a5..4d531aa0 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 6bf89040..06c4b9e0 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 04018ed6..22438926 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<Diagnostic>,
}
@@ -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,