aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Davis2022-11-23 14:57:03 +0000
committerBlaž Hrastnik2022-11-24 01:57:12 +0000
commitfd00f3a70eb626242bb2fcc9bddf2c4d94580a9a (patch)
tree3c389daef7707519caa78cfe33104875b1022b70
parent94eb3de7767c5d16344bec9634028f346cd867bb (diff)
Don't apply transactions to Views in undo/redo
View::apply should only be called by EditorView after 42e37a571e75aaf4feb1717dfebe8cf215e535dd. This change removes the duplicate calls within undo/redo which could cause a panic.
-rw-r--r--helix-term/src/commands.rs8
-rw-r--r--helix-term/src/commands/typed.rs4
-rw-r--r--helix-view/src/document.rs24
3 files changed, 18 insertions, 18 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 8af5a7e3..4eb9742f 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -3302,7 +3302,7 @@ fn undo(cx: &mut Context) {
let count = cx.count();
let (view, doc) = current!(cx.editor);
for _ in 0..count {
- if !doc.undo(view) {
+ if !doc.undo(view.id) {
cx.editor.set_status("Already at oldest change");
break;
}
@@ -3313,7 +3313,7 @@ fn redo(cx: &mut Context) {
let count = cx.count();
let (view, doc) = current!(cx.editor);
for _ in 0..count {
- if !doc.redo(view) {
+ if !doc.redo(view.id) {
cx.editor.set_status("Already at newest change");
break;
}
@@ -3325,7 +3325,7 @@ fn earlier(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
for _ in 0..count {
// rather than doing in batch we do this so get error halfway
- if !doc.earlier(view, UndoKind::Steps(1)) {
+ if !doc.earlier(view.id, UndoKind::Steps(1)) {
cx.editor.set_status("Already at oldest change");
break;
}
@@ -3337,7 +3337,7 @@ fn later(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
for _ in 0..count {
// rather than doing in batch we do this so get error halfway
- if !doc.later(view, UndoKind::Steps(1)) {
+ if !doc.later(view.id, UndoKind::Steps(1)) {
cx.editor.set_status("Already at newest change");
break;
}
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index b8f99ff3..475f14d1 100644
--- a/helix-term/src/commands/typed.rs
+++ b/helix-term/src/commands/typed.rs
@@ -481,7 +481,7 @@ fn earlier(
let uk = args.join(" ").parse::<UndoKind>().map_err(|s| anyhow!(s))?;
let (view, doc) = current!(cx.editor);
- let success = doc.earlier(view, uk);
+ let success = doc.earlier(view.id, uk);
if !success {
cx.editor.set_status("Already at oldest change");
}
@@ -500,7 +500,7 @@ fn later(
let uk = args.join(" ").parse::<UndoKind>().map_err(|s| anyhow!(s))?;
let (view, doc) = current!(cx.editor);
- let success = doc.later(view, uk);
+ let success = doc.later(view.id, uk);
if !success {
cx.editor.set_status("Already at newest change");
}
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index 08708528..0eb54f25 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -857,11 +857,11 @@ impl Document {
success
}
- fn undo_redo_impl(&mut self, view: &mut View, undo: bool) -> bool {
+ fn undo_redo_impl(&mut self, view_id: ViewId, undo: bool) -> bool {
let mut history = self.history.take();
let txn = if undo { history.undo() } else { history.redo() };
let success = if let Some(txn) = txn {
- self.apply_impl(txn, view.id) && view.apply(txn, self)
+ self.apply_impl(txn, view_id)
} else {
false
};
@@ -875,13 +875,13 @@ impl Document {
}
/// Undo the last modification to the [`Document`]. Returns whether the undo was successful.
- pub fn undo(&mut self, view: &mut View) -> bool {
- self.undo_redo_impl(view, true)
+ pub fn undo(&mut self, view_id: ViewId) -> bool {
+ self.undo_redo_impl(view_id, true)
}
/// Redo the last modification to the [`Document`]. Returns whether the redo was successful.
- pub fn redo(&mut self, view: &mut View) -> bool {
- self.undo_redo_impl(view, false)
+ pub fn redo(&mut self, view_id: ViewId) -> bool {
+ self.undo_redo_impl(view_id, false)
}
pub fn savepoint(&mut self) {
@@ -894,7 +894,7 @@ impl Document {
}
}
- fn earlier_later_impl(&mut self, view: &mut View, uk: UndoKind, earlier: bool) -> bool {
+ fn earlier_later_impl(&mut self, view_id: ViewId, uk: UndoKind, earlier: bool) -> bool {
let txns = if earlier {
self.history.get_mut().earlier(uk)
} else {
@@ -902,7 +902,7 @@ impl Document {
};
let mut success = false;
for txn in txns {
- if self.apply_impl(&txn, view.id) && view.apply(&txn, self) {
+ if self.apply_impl(&txn, view_id) {
success = true;
}
}
@@ -914,13 +914,13 @@ impl Document {
}
/// Undo modifications to the [`Document`] according to `uk`.
- pub fn earlier(&mut self, view: &mut View, uk: UndoKind) -> bool {
- self.earlier_later_impl(view, uk, true)
+ pub fn earlier(&mut self, view_id: ViewId, uk: UndoKind) -> bool {
+ self.earlier_later_impl(view_id, uk, true)
}
/// Redo modifications to the [`Document`] according to `uk`.
- pub fn later(&mut self, view: &mut View, uk: UndoKind) -> bool {
- self.earlier_later_impl(view, uk, false)
+ pub fn later(&mut self, view_id: ViewId, uk: UndoKind) -> bool {
+ self.earlier_later_impl(view_id, uk, false)
}
/// Commit pending changes to history