Fix vi-redo
diff --git a/src/keymap.rs b/src/keymap.rs
index e08838f..98e7f39 100644
--- a/src/keymap.rs
+++ b/src/keymap.rs
@@ -130,7 +130,17 @@
Cmd::ReplaceChar(previous, c) => Cmd::ReplaceChar(repeat_count(previous, new), c),
Cmd::Replace(ref mvt, ref text) => {
if text.is_none() {
- Cmd::Replace(mvt.redo(new), wrt.last_insert())
+ let last_insert = wrt.last_insert();
+ if let Movement::ForwardChar(0) = mvt {
+ Cmd::Replace(
+ Movement::ForwardChar(
+ last_insert.as_ref().map_or(0, |text| text.len()),
+ ),
+ last_insert,
+ )
+ } else {
+ Cmd::Replace(mvt.redo(new), last_insert)
+ }
} else {
Cmd::Replace(mvt.redo(new), text.clone())
}
@@ -598,7 +608,7 @@
KeyPress::Char('R') => {
// vi-replace-mode (overwrite-mode)
self.input_mode = InputMode::Replace;
- Cmd::Noop // FIXME no redo possible
+ Cmd::Replace(Movement::ForwardChar(0), None)
}
KeyPress::Char('s') => {
// vi-substitute-char:
@@ -684,6 +694,8 @@
if cmd.is_repeatable_change() {
if let (Cmd::Replace(_, _), Cmd::SelfInsert(_, _)) = (&self.last_cmd, &cmd) {
// replacing...
+ } else if let (Cmd::SelfInsert(_, _), Cmd::SelfInsert(_, _)) = (&self.last_cmd, &cmd) {
+ // inserting...
} else {
self.last_cmd = cmd.clone();
}
diff --git a/src/undo.rs b/src/undo.rs
index 8e865b8..84c8f77 100644
--- a/src/undo.rs
+++ b/src/undo.rs
@@ -314,7 +314,8 @@
pub fn last_insert(&self) -> Option<String> {
for change in self.undos.iter().rev() {
match change {
- Change::Insert { ref text, .. } => return Some(text.clone()),
+ Change::Insert { ref text, .. } => return Some(text.to_owned()),
+ Change::Replace { ref new, .. } => return Some(new.to_owned()),
Change::End => {
continue;
}