diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp
index 487ac32f293f7b66553639521432313d12a4c0c5..255892e3ed3965923ba0e66fe1d40061bf690abf 100644
--- a/src/plugins/fakevim/handler.cpp
+++ b/src/plugins/fakevim/handler.cpp
@@ -375,13 +375,15 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         m_tc.movePosition(EndOfLine, KeepAnchor);
         finishMovement();
     } else if (key == 'a') {
+        m_mode = InsertMode;
         m_lastInsertion.clear();
+        m_tc.beginEditBlock();
         m_tc.movePosition(Right, MoveAnchor, 1);
-        m_mode = InsertMode;
     } else if (key == 'A') {
+        m_mode = InsertMode;
+        m_tc.beginEditBlock();
         m_tc.movePosition(EndOfLine, MoveAnchor);
         m_lastInsertion.clear();
-        m_mode = InsertMode;
     } else if (key == 'b') {
         moveToWordBoundary(false, false);
         finishMovement();
@@ -390,8 +392,10 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         finishMovement();
     } else if (key == 'c') {
         m_submode = ChangeSubMode;
+        m_tc.beginEditBlock();
     } else if (key == 'C') {
         m_submode = ChangeSubMode;
+        m_tc.beginEditBlock();
         m_tc.movePosition(EndOfLine, KeepAnchor);
         finishMovement();
     } else if (key == 'd') {
@@ -434,8 +438,9 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         moveToFirstNonBlankOnLine();
         finishMovement();
     } else if (key == 'i') {
-        m_lastInsertion.clear();
         m_mode = InsertMode;
+        m_tc.beginEditBlock();
+        m_lastInsertion.clear();
     } else if (key == 'j' || key == Key_Down) {
         m_tc.movePosition(Down, KeepAnchor, count());
         finishMovement();
@@ -488,6 +493,11 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         }
     } else if (key == control('r')) {
         EDITOR(redo());
+    } else if (key == 's') {
+        m_submode = ChangeSubMode;
+        m_tc.beginEditBlock();
+        m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist()));
+        finishMovement();
     } else if (key == 't' || key == 'T') {
         m_subsubmode = FtSubSubMode;
         m_subsubdata = key;
@@ -542,10 +552,11 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
 void FakeVimHandler::Private::handleInsertMode(int key, const QString &text)
 {
     if (key == Key_Escape) {
-        m_mode = CommandMode;
         for (int i = 1; i < count(); ++i)
             m_tc.insertText(m_lastInsertion);
         m_tc.movePosition(Left, MoveAnchor, qMin(1, leftDist()));
+        m_mode = CommandMode;
+        m_tc.endEditBlock();
     } else if (key == Key_Left) {
         m_tc.movePosition(Left, MoveAnchor, 1);
         m_lastInsertion.clear();
diff --git a/src/plugins/fakevim/handler.h b/src/plugins/fakevim/handler.h
index 56184aa887fb32b9fe54dbbe8732710fe5a742f9..1ebf9adb8e47202bcc50d14da7c3a5cb1ce334c8 100644
--- a/src/plugins/fakevim/handler.h
+++ b/src/plugins/fakevim/handler.h
@@ -62,7 +62,7 @@ public:
 
 signals:
     void commandBufferChanged(const QString &msg);
-    void quitRequested(QObject *);
+    void quitRequested(QWidget *);
 
 private:
     bool eventFilter(QObject *ob, QEvent *ev);