summaryrefslogtreecommitdiff
path: root/helix-view/src/commands.rs
diff options
context:
space:
mode:
authorBlaž Hrastnik2020-10-07 13:22:50 +0000
committerBlaž Hrastnik2020-10-13 14:13:56 +0000
commit490e23b645311fef86d8e8045f97f514927d2867 (patch)
tree79c773658f63a34c2cb25d261ff04ac08ac83953 /helix-view/src/commands.rs
parent518426b9f48369f72a49ccdecb23977fac178983 (diff)
Simplify changeset tracking.
Diffstat (limited to 'helix-view/src/commands.rs')
-rw-r--r--helix-view/src/commands.rs28
1 files changed, 16 insertions, 12 deletions
diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs
index aafc6202..e5e3244d 100644
--- a/helix-view/src/commands.rs
+++ b/helix-view/src/commands.rs
@@ -368,22 +368,26 @@ pub fn open_below(view: &mut View, _count: usize) {
// O inserts a new line before each line with a selection
fn append_changes_to_history(view: &mut View) {
- if let Some(changes) = view.state.changes.take() {
- // Instead of doing this messy merge we could always commit, and based on transaction
- // annotations either add a new layer or compose into the previous one.
- let transaction = Transaction::from(changes).with_selection(view.state.selection().clone());
- let (doc, selection) = view.state.old_state.take().unwrap();
- let mut old_state = State::new(doc);
- old_state.selection = selection;
-
- // TODO: take transaction by value?
- view.history.commit_revision(&transaction, &old_state);
+ if view.state.changes.is_empty() {
+ return;
}
- // TODO: need to start the state with these vals
+ let new_changeset = ChangeSet::new(view.state.doc());
+ let changes = std::mem::replace(&mut view.state.changes, new_changeset);
+ // Instead of doing this messy merge we could always commit, and based on transaction
+ // annotations either add a new layer or compose into the previous one.
+ let transaction = Transaction::from(changes).with_selection(view.state.selection().clone());
+
+ // HAXX: we need to reconstruct the state as it was before the changes..
+ let (doc, selection) = view.state.old_state.take().unwrap();
+ let mut old_state = State::new(doc);
+ old_state.selection = selection;
+ // TODO: take transaction by value?
+ view.history.commit_revision(&transaction, &old_state);
+
+ // TODO: need to start the state with these vals
// HAXX
- view.state.changes = Some(ChangeSet::new(view.state.doc()));
view.state.old_state = Some((view.state.doc().clone(), view.state.selection.clone()));
}