diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index a734b46a46cd4598e702bbbb45be5fe2e67b841e..06239d4089f422d53c4e1eda442fd3a7bfd81876 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -650,6 +650,9 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
                 Range range(m_oldPosition, m_tc.position());
                 m_lastInsertion.append(text(range));
             }
+        } else if (!isVisualMode()) {
+            if (atEndOfLine())
+                moveLeft();
         }
     }
 
@@ -3366,6 +3369,8 @@ void FakeVimHandler::Private::undo()
 
     if (m_undoCursorPosition.contains(rev))
         m_tc.setPosition(m_undoCursorPosition[rev]);
+    if (atEndOfLine())
+        moveLeft();
 }
 
 void FakeVimHandler::Private::redo()
@@ -3398,6 +3403,8 @@ void FakeVimHandler::Private::enterCommandMode()
 {
     EDITOR(setCursorWidth(m_cursorWidth));
     EDITOR(setOverwriteMode(true));
+    if (atEndOfLine())
+        moveLeft();
     m_mode = CommandMode;
 }