From 2a5bce4dc6334e7a7d6ea076ad231bb98a644c5c Mon Sep 17 00:00:00 2001 From: sxyazi Date: Tue, 25 Jul 2023 00:59:25 +0800 Subject: [PATCH] up --- config/keymap.toml | 12 +++++++----- src/core/input/input.rs | 26 +++++++++++++------------- src/core/input/op.rs | 5 +++-- src/ui/dispatcher.rs | 4 +++- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/config/keymap.toml b/config/keymap.toml index d20d5c2d..587aab67 100644 --- a/config/keymap.toml +++ b/config/keymap.toml @@ -125,8 +125,10 @@ keymap = [ { on = [ "h" ], exec = "move -1" }, { on = [ "l" ], exec = "move 1" }, - { on = [ "H" ], exec = "move -999" }, - { on = [ "L" ], exec = "move 999" }, + { on = [ "0" ], exec = "move -999" }, + { on = [ "$" ], exec = "move 999" }, + { on = [ "I" ], exec = "move -999", "insert" }, + { on = [ "A" ], exec = "move 999", "insert --append" }, { on = [ "" ], exec = "move -1" }, { on = [ "" ], exec = "move 1" }, @@ -135,9 +137,9 @@ keymap = [ { on = [ "w" ], exec = "forward" }, { on = [ "e" ], exec = "forward --end-of-word" }, - { on = [ "d" ], exec = "delete" }, - { on = [ "c" ], exec = "delete --insert" }, - { on = [ "x" ], exec = [ "delete", "move 1 --in-operating" ] }, + { on = [ "d" ], exec = "delete --cut" }, + { on = [ "c" ], exec = "delete --cut --insert" }, + { on = [ "x" ], exec = [ "delete --cut", "move 1 --in-operating" ] }, { on = [ "y" ], exec = [ "yank" ] }, { on = [ "p" ], exec = [ "paste" ] }, diff --git a/src/core/input/input.rs b/src/core/input/input.rs index a25759d6..28b54069 100644 --- a/src/core/input/input.rs +++ b/src/core/input/input.rs @@ -208,21 +208,19 @@ impl Input { self.move_(-1) } - pub fn delete(&mut self, insert: bool) -> bool { + pub fn delete(&mut self, cut: bool, insert: bool) -> bool { match self.snap().op { InputOp::None => { - self.snap_mut().op = InputOp::Delete(insert, self.snap().cursor); + self.snap_mut().op = InputOp::Delete(cut, insert, self.snap().cursor); false } InputOp::Select(start) => { - self.snap_mut().op = InputOp::Delete(insert, start); + self.snap_mut().op = InputOp::Delete(cut, insert, start); return self.handle_op(self.snap().cursor, true).then(|| self.move_(0)).is_some(); } InputOp::Delete(..) => { - self.move_(-(self.snap().len() as isize)); - self.snap_mut().value.clear(); - self.snap_mut().mode = if insert { InputMode::Insert } else { InputMode::Normal }; - true + self.snap_mut().op = InputOp::Delete(cut, insert, 0); + return self.move_(self.snap().len() as isize); } _ => false, } @@ -249,7 +247,7 @@ impl Input { pub fn paste(&mut self, before: bool) -> bool { if let Some(start) = self.snap().op.start() { - self.snap_mut().op = InputOp::Delete(false, start); + self.snap_mut().op = InputOp::Delete(false, false, start); self.handle_op(self.snap().cursor, true); } @@ -275,11 +273,15 @@ impl Input { InputOp::None | InputOp::Select(_) => { snap.cursor = cursor; } - InputOp::Delete(insert, _) => { + InputOp::Delete(cut, insert, _) => { let range = snap.op.range(cursor, include).unwrap(); let Range { start, end } = snap.idx(range.start)..snap.idx(range.end); - snap.value.drain(start.unwrap()..end.unwrap()); + let drain = snap.value.drain(start.unwrap()..end.unwrap()).collect::(); + if cut { + futures::executor::block_on(async { external::clipboard_set(&drain).await.ok() }); + } + snap.op = InputOp::None; snap.mode = if insert { InputMode::Insert } else { InputMode::Normal }; snap.cursor = range.start; @@ -290,9 +292,7 @@ impl Input { let yanked = &snap.value[start.unwrap()..end.unwrap()]; snap.op = InputOp::None; - futures::executor::block_on(async { - external::clipboard_set(yanked).await.ok(); - }); + futures::executor::block_on(async { external::clipboard_set(yanked).await.ok() }); } }; diff --git a/src/core/input/op.rs b/src/core/input/op.rs index e991e863..7a2fbae2 100644 --- a/src/core/input/op.rs +++ b/src/core/input/op.rs @@ -5,7 +5,8 @@ pub enum InputOp { #[default] None, Select(usize), - Delete(bool, usize), + // cut, insert, start + Delete(bool, bool, usize), Yank(usize), } @@ -15,7 +16,7 @@ impl InputOp { match self { InputOp::None => None, InputOp::Select(s) => Some(*s), - InputOp::Delete(_, s) => Some(*s), + InputOp::Delete(.., s) => Some(*s), InputOp::Yank(s) => Some(*s), } } diff --git a/src/ui/dispatcher.rs b/src/ui/dispatcher.rs index 2b1af850..20343c4e 100644 --- a/src/ui/dispatcher.rs +++ b/src/ui/dispatcher.rs @@ -192,7 +192,9 @@ impl Executor { "backward" => cx.input.backward(), "forward" => cx.input.forward(exec.named.contains_key("end-of-word")), - "delete" => cx.input.delete(exec.named.contains_key("insert")), + "delete" => { + cx.input.delete(exec.named.contains_key("cut"), exec.named.contains_key("insert")) + } "yank" => cx.input.yank(), "paste" => cx.input.paste(exec.named.contains_key("before")),