diff --git a/src/lib.rs b/src/lib.rs index 3fb381d0188e1b2eb770e45819e5f80dab486053..dba37c984e694aa9fddeed960740cdaf42e9f19d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -352,7 +352,10 @@ fn edit_replace_char(s: &mut State, ch: char, n: RepeatCount) -> Result<()> { // Yank/paste `text` at current position. fn edit_yank(s: &mut State, text: &str, anchor: Anchor, n: RepeatCount) -> Result<()> { - if s.line.yank(text, anchor, n).is_some() { + if let Anchor::After = anchor { + s.line.move_forward(1); + } + if s.line.yank(text, n).is_some() { if !s.edit_state.is_emacs_mode() { s.line.move_backward(1); } diff --git a/src/line_buffer.rs b/src/line_buffer.rs index a2178cf6e047fb05cd82b6d06eff4a4284552bc8..91fade5371af94d5053b6fc2d6c98f3317572b87 100644 --- a/src/line_buffer.rs +++ b/src/line_buffer.rs @@ -3,7 +3,7 @@ use std::iter; use std::ops::{Deref, Range}; use std_unicode::str::UnicodeStr; use unicode_segmentation::UnicodeSegmentation; -use keymap::{Anchor, At, CharSearch, Movement, RepeatCount, Word}; +use keymap::{At, CharSearch, Movement, RepeatCount, Word}; /// Maximum buffer size for the line read pub static MAX_LINE: usize = 4096; @@ -151,14 +151,11 @@ impl LineBuffer { /// Yank/paste `text` at current position. /// Return `None` when maximum buffer size has been reached, /// `true` when the character has been appended to the end of the line. - pub fn yank(&mut self, text: &str, anchor: Anchor, n: RepeatCount) -> Option<bool> { + pub fn yank(&mut self, text: &str, n: RepeatCount) -> Option<bool> { let shift = text.len() * n; if text.is_empty() || (self.buf.len() + shift) > self.buf.capacity() { return None; } - if let Anchor::After = anchor { - self.move_forward(1); - } let push = self.pos == self.buf.len(); if push { self.buf.reserve(shift); @@ -178,7 +175,7 @@ impl LineBuffer { pub fn yank_pop(&mut self, yank_size: usize, text: &str) -> Option<bool> { self.buf.drain((self.pos - yank_size)..self.pos); self.pos -= yank_size; - self.yank(text, Anchor::Before, 1) + self.yank(text, 1) } /// Move cursor on the left. @@ -280,7 +277,7 @@ impl LineBuffer { } let chars = self.delete(1).unwrap(); self.move_backward(1); - self.yank(&chars, Anchor::Before, 1); + self.yank(&chars, 1); self.move_forward(1); true } @@ -690,7 +687,7 @@ fn is_other_char(grapheme: &str) -> bool { #[cfg(test)] mod test { - use keymap::{Anchor, At, CharSearch, Word}; + use keymap::{At, CharSearch, Word}; use super::{LineBuffer, MAX_LINE, WordAction}; #[test] @@ -740,7 +737,8 @@ mod test { #[test] fn yank_after() { let mut s = LineBuffer::init("αß", 2); - let ok = s.yank("γδε", Anchor::After, 1); + s.move_forward(1); + let ok = s.yank("γδε", 1); assert_eq!(Some(true), ok); assert_eq!("αßγδε", s.buf); assert_eq!(10, s.pos); @@ -749,7 +747,7 @@ mod test { #[test] fn yank_before() { let mut s = LineBuffer::init("αε", 2); - let ok = s.yank("ßγδ", Anchor::Before, 1); + let ok = s.yank("ßγδ", 1); assert_eq!(Some(false), ok); assert_eq!("αßγδε", s.buf); assert_eq!(8, s.pos);