1
0
Fork 0
mirror of https://github.com/helix-editor/helix synced 2024-06-07 21:56:04 +02:00

fix change -> change -> undo -> change -> undo -> undo.

This commit is contained in:
Blaž Hrastnik 2020-12-21 13:58:54 +09:00
parent d181027225
commit ea502c8665
2 changed files with 49 additions and 11 deletions

View File

@ -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

View File

@ -185,6 +185,50 @@ pub fn apply(&mut self, transaction: &Transaction) -> bool {
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