aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPascal Kuthe2023-04-05 18:24:49 +0000
committerBlaž Hrastnik2023-05-18 06:16:50 +0000
commitbcb8c3d34d87d97d01d37a2dda839197f2a375d8 (patch)
tree6a2c8e4f0e4cd702ab900a798f7ea1f57fe25ef2
parent9c558fc4705934097b5f20b100462fc1fa4f50e1 (diff)
deduplicate savepoints
-rw-r--r--helix-view/src/document.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index e467efd3..4d8e61e1 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -1240,6 +1240,22 @@ impl Document {
/// the state it had when this function was called.
pub fn savepoint(&mut self, view: &View) -> Arc<SavePoint> {
let revert = Transaction::new(self.text()).with_selection(self.selection(view.id).clone());
+ // check if there is already an existing (identical) savepoint around
+ if let Some(savepoint) = self
+ .savepoints
+ .iter()
+ .rev()
+ .find_map(|savepoint| savepoint.upgrade())
+ {
+ let transaction = savepoint.revert.lock();
+ if savepoint.view == view.id
+ && transaction.changes().is_empty()
+ && transaction.selection() == revert.selection()
+ {
+ drop(transaction);
+ return savepoint;
+ }
+ }
let savepoint = Arc::new(SavePoint {
view: view.id,
revert: Mutex::new(revert),