diff --git a/scripts/init.rhai b/scripts/init.rhai index 42ad560..7496e22 100644 --- a/scripts/init.rhai +++ b/scripts/init.rhai @@ -88,6 +88,11 @@ tree_keymap.bind_key("r", "Redo", || s::redo()); tree_keymap.bind_key("m", "SaveBookmark", || s::save_bookmark('a')); tree_keymap.bind_key("'", "GoToBookmark", || s::goto_bookmark('a')); +tree_keymap.bind_key("y", "Copy", || s::copy()); +tree_keymap.bind_key("d", "Cut", || s::cut()); +tree_keymap.bind_key("p", "Paste", || s::paste()); +tree_keymap.bind_key("P", "PasteSwap", || s::paste_swap()); + tree_keymap.bind_key("I", "Insert", || { s::open_menu("candidate_node_selection"); let construct = s::block(); diff --git a/src/engine/doc.rs b/src/engine/doc.rs index 9e86b69..0b9c3b2 100644 --- a/src/engine/doc.rs +++ b/src/engine/doc.rs @@ -266,6 +266,7 @@ fn execute_tree_ed( Replace(new_node) => { let old_node = cursor.left_node(s).ok_or(EditError::NoNodeHere)?; if old_node.swap(s, new_node) { + *cursor = Location::after(s, new_node); Ok(vec![(*cursor, Replace(old_node).into())]) } else { Err(EditError::CannotPlaceNode) @@ -345,8 +346,9 @@ fn execute_clipboard( } PasteSwap => { let clip_node = clipboard.pop().ok_or(EditError::EmptyClipboard)?; - let doc_node = cursor.left_node(s).ok_or(EditError::NoNodeHere)?; + let doc_node = cursor.right_node(s).ok_or(EditError::NoNodeHere)?; if doc_node.swap(s, clip_node) { + *cursor = Location::after(s, clip_node); clipboard.push(doc_node.deep_copy(s)); Ok(vec![(*cursor, TreeEdCommand::Replace(doc_node).into())]) } else { diff --git a/src/engine/mod.rs b/src/engine/mod.rs index 885f777..6535e0c 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -6,11 +6,8 @@ mod engine; use partial_pretty_printer as ppp; use std::default::Default; -// TODO remove allow(unused) -#[allow(unused)] pub use command::{ - BookmarkCommand, ClipboardCommand, Command, EdCommand, NavCommand, TextEdCommand, - TextNavCommand, TreeEdCommand, TreeNavCommand, + BookmarkCommand, ClipboardCommand, TextEdCommand, TextNavCommand, TreeEdCommand, TreeNavCommand, }; pub use doc_set::{DocDisplayLabel, DocName}; pub use engine::Engine; diff --git a/src/runtime.rs b/src/runtime.rs index 0f364be..c0b1ac3 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -1,6 +1,6 @@ use crate::engine::{ - BookmarkCommand, DocDisplayLabel, DocName, Engine, Settings, TextEdCommand, TextNavCommand, - TreeEdCommand, TreeNavCommand, + BookmarkCommand, ClipboardCommand, DocDisplayLabel, DocName, Engine, Settings, TextEdCommand, + TextNavCommand, TreeEdCommand, TreeNavCommand, }; use crate::frontends::{Event, Frontend, Key}; use crate::keymap::{KeyLookupResult, KeyProg, Keymap, Layer, LayerManager, MenuSelectionCmd}; @@ -352,6 +352,15 @@ impl + 'static> Runtime { self.engine.execute(TreeEdCommand::Insert(node)) } + /************* + * Clipboard * + *************/ + + pub fn cut(&mut self) -> Result<(), SynlessError> { + self.engine.execute(ClipboardCommand::Copy)?; + self.engine.execute(TreeEdCommand::Backspace) + } + /*********** * Private * ***********/ @@ -603,6 +612,14 @@ impl + 'static> Runtime { register!(module, rt, BookmarkCommand::Save(ch: char) as save_bookmark); register!(module, rt, BookmarkCommand::Goto(ch: char) as goto_bookmark); + // Clipboard + register!(module, rt.cut()?); + register!(module, rt, ClipboardCommand::Copy as copy); + register!(module, rt, ClipboardCommand::Paste as paste); + register!(module, rt, ClipboardCommand::PasteSwap as paste_swap); + register!(module, rt, ClipboardCommand::Dup as dup_clipboard); + register!(module, rt, ClipboardCommand::Pop as pop_clipboard); + // Editing: Meta register!(module, rt.undo()?); register!(module, rt.redo()?);