diff --git a/scripts/init.rhai b/scripts/init.rhai index 70f1374..aee2fee 100644 --- a/scripts/init.rhai +++ b/scripts/init.rhai @@ -41,6 +41,11 @@ tree_keymap.bind_key("l", "Inorder next", || s::tree_nav_inorder_next()); tree_keymap.bind_key("down", "Last child", || s::tree_nav_last_child()); tree_keymap.bind_key("up", "Parent", || s::tree_nav_parent()); tree_keymap.bind_key("enter", "Enter text", || s::tree_nav_enter_text()); +tree_keymap.bind_key("bksp", "Backspace", || s::tree_ed_backspace()); +tree_keymap.bind_key("d", "Delete", || s::tree_ed_delete()); +tree_keymap.bind_key("u", "Undo", || s::undo()); +tree_keymap.bind_key("r", "Redo", || s::redo()); + tree_keymap.bind_key("m", "Save bookmark", || s::save_bookmark('a')); tree_keymap.bind_key("'", "Go to bookmark", || s::goto_bookmark('a')); diff --git a/src/engine/engine.rs b/src/engine/engine.rs index 6730f65..6422159 100644 --- a/src/engine/engine.rs +++ b/src/engine/engine.rs @@ -262,6 +262,33 @@ impl Engine { Ok(()) } + pub fn undo(&mut self) -> Result<(), SynlessError> { + let doc = self + .doc_set + .visible_doc_mut() + .ok_or(DocError::NoVisibleDoc)?; + doc.undo(&mut self.storage)?; + Ok(()) + } + + pub fn redo(&mut self) -> Result<(), SynlessError> { + let doc = self + .doc_set + .visible_doc_mut() + .ok_or(DocError::NoVisibleDoc)?; + doc.redo(&mut self.storage)?; + Ok(()) + } + + pub fn end_undo_group(&mut self) -> Result<(), SynlessError> { + let doc = self + .doc_set + .visible_doc_mut() + .ok_or(DocError::NoVisibleDoc)?; + doc.end_undo_group(); + Ok(()) + } + /********************** * Raw Storage Access * **********************/ diff --git a/src/runtime.rs b/src/runtime.rs index 5693e64..a55ffc1 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -286,6 +286,14 @@ impl + 'static> Runtime { self.engine.execute(cmd) } + pub fn undo(&mut self) -> Result<(), SynlessError> { + self.engine.undo() + } + + pub fn redo(&mut self) -> Result<(), SynlessError> { + self.engine.redo() + } + /*********** * Private * ***********/ @@ -507,6 +515,9 @@ impl + 'static> Runtime { register!(module, rt, BookmarkCommand::Save(ch: char) as save_bookmark); register!(module, rt, BookmarkCommand::Goto(ch: char) as goto_bookmark); + register!(module, rt.undo()?); + register!(module, rt.redo()?); + // Logging rhai::FuncRegistration::new("log_trace") .in_internal_namespace()