diff options
author | Blaž Hrastnik | 2020-12-21 04:58:54 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2020-12-21 04:58:54 +0000 |
commit | ea502c8665332932b2311df3852b5ac8df6509af (patch) | |
tree | f9dc0b8183b63f803780fa8e2189dc5aeab2f52f | |
parent | d1810272257f597ddba4fd3496dbdde8cda59638 (diff) |
fix change -> change -> undo -> change -> undo -> undo.
-rw-r--r-- | helix-term/src/commands.rs | 16 | ||||
-rw-r--r-- | helix-view/src/document.rs | 44 |
2 files changed, 49 insertions, 11 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index a8aea914..7722eca5 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -660,21 +660,15 @@ pub fn insert_char_prompt(prompt: &mut Prompt, c: char) { // Undo / Redo -pub fn undo(cx: &mut Context) { - if let Some(revert) = cx.view.doc.history.undo() { - cx.view.doc.version += 1; - cx.view.doc.apply(&revert); - // TODO: undo/redo needs to avoid storing in self.changes/self.old_state - } +// TODO: each command could simply return a Option<transaction>, then the higher level handles +// storing it? - // TODO: each command could simply return a Option<transaction>, then the higher level handles storing it? +pub fn undo(cx: &mut Context) { + cx.view.doc.undo(); } pub fn redo(cx: &mut Context) { - if let Some(transaction) = cx.view.doc.history.redo() { - cx.view.doc.version += 1; - cx.view.doc.apply(&transaction); - } + cx.view.doc.redo(); } // Yank / Paste diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 0dc40c5a..d6246c34 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -185,6 +185,50 @@ impl Document { success } + pub fn undo(&mut self) -> bool { + if let Some(transaction) = self.history.undo() { + let old_doc = self.text().clone(); + self.version += 1; + let success = transaction.apply(&mut self.state); + + // update tree-sitter syntax tree + if let Some(syntax) = &mut self.syntax { + // TODO: no unwrap + syntax + .update(&old_doc, &self.state.doc, transaction.changes()) + .unwrap(); + } + + // reset changeset to fix len + self.changes = ChangeSet::new(self.text()); + + return success; + } + false + } + + pub fn redo(&mut self) -> bool { + if let Some(transaction) = self.history.redo() { + let old_doc = self.text().clone(); + self.version += 1; + let success = transaction.apply(&mut self.state); + + // update tree-sitter syntax tree + if let Some(syntax) = &mut self.syntax { + // TODO: no unwrap + syntax + .update(&old_doc, &self.state.doc, transaction.changes()) + .unwrap(); + } + + // reset changeset to fix len + self.changes = ChangeSet::new(self.text()); + + return success; + } + false + } + #[inline] pub fn mode(&self) -> Mode { self.mode |