diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index c6796159487f1f65ceb3a8c8e8e25a447e3fa2a3..a11cb22adf426b4af01aeea58f5e3304a13a65d4 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -2479,6 +2479,7 @@ impl History { self.undo_stack.pop(); false } else { + self.redo_stack.clear(); let transaction = self.undo_stack.last_mut().unwrap(); transaction.last_edit_at = now; for (buffer_id, transaction_id) in buffer_transactions { @@ -2511,6 +2512,7 @@ impl History { }; if !transaction.buffer_transactions.is_empty() { self.undo_stack.push(transaction); + self.redo_stack.clear(); } } @@ -3935,6 +3937,16 @@ mod tests { buffer_1.update(cx, |buffer_1, cx| buffer_1.redo(cx)); assert_eq!(multibuffer.read(cx).text(), "ABCD1234\nAB5678"); + // Redo stack gets cleared after an edit. + now += 2 * group_interval; + multibuffer.start_transaction_at(now, cx); + multibuffer.edit([(0..0, "X")], cx); + multibuffer.end_transaction_at(now, cx); + assert_eq!(multibuffer.read(cx).text(), "XABCD1234\nAB5678"); + multibuffer.redo(cx); + assert_eq!(multibuffer.read(cx).text(), "XABCD1234\nAB5678"); + multibuffer.undo(cx); + assert_eq!(multibuffer.read(cx).text(), "ABCD1234\nAB5678"); multibuffer.undo(cx); assert_eq!(multibuffer.read(cx).text(), "1234\n5678"); }); diff --git a/crates/text/src/tests.rs b/crates/text/src/tests.rs index 7994d5b8f1a1ce3f6daed3df54a399f6ef2a2be2..e66837f21b295a14c5011bc4921f5d43717b386e 100644 --- a/crates/text/src/tests.rs +++ b/crates/text/src/tests.rs @@ -529,6 +529,16 @@ fn test_history() { assert!(buffer.end_transaction_at(now).is_none()); buffer.undo(); assert_eq!(buffer.text(), "12cde6"); + + // Redo stack gets cleared after performing an edit. + buffer.edit([(0..0, "X")]); + assert_eq!(buffer.text(), "X12cde6"); + buffer.redo(); + assert_eq!(buffer.text(), "X12cde6"); + buffer.undo(); + assert_eq!(buffer.text(), "12cde6"); + buffer.undo(); + assert_eq!(buffer.text(), "123456"); } #[test] diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index 7bf8ee208fcece78063e4c0fd226401a9d7e2cdb..8d37ad0c8b0c7dca7c12ef03740d763fe0554823 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -216,6 +216,7 @@ impl History { self.undo_stack.pop(); None } else { + self.redo_stack.clear(); let entry = self.undo_stack.last_mut().unwrap(); entry.last_edit_at = now; Some(entry) @@ -276,6 +277,7 @@ impl History { last_edit_at: now, suppress_grouping: false, }); + self.redo_stack.clear(); } fn push_undo(&mut self, op_id: clock::Local) {