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;
                 }