From 0c4c66f228a9c815e34c0b8bc7e5f4972c4d10eb Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 20 May 2010 16:32:54 +0200
Subject: [PATCH] fakevim: fix undo after cjaaa<Esc>

---
 src/plugins/fakevim/fakevimhandler.cpp | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index c5ffba8e76f..2444135062d 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -1338,6 +1338,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         if (m_movetype == MoveLineWise)
             insertAutomaticIndentation(true);
         endEditBlock();
+        setUndoPosition(position());
         enterInsertMode();
         m_submode = NoSubMode;
     } else if (m_submode == DeleteSubMode) {
@@ -1940,12 +1941,16 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         finishMovement();
     } else if ((!isVisualMode() && input.is('a')) || (isVisualMode() && input.is('A'))) {
         leaveVisualMode();
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
         m_lastInsertion.clear();
         if (!atEndOfLine())
             moveRight();
         updateMiniBuffer();
     } else if (input.is('A')) {
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
         moveBehindEndOfLine();
         setDotCommand(QString(QLatin1Char('A')));
@@ -2107,6 +2112,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         finishMovement();
     } else if (!isVisualMode() && (input.is('i') || input.isKey(Key_Insert))) {
         setDotCommand(QString(QLatin1Char('i'))); // setDotCommand("%1i", count());
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
         updateMiniBuffer();
         if (atEndOfLine())
@@ -2126,6 +2133,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
             m_gflag = false;
             m_tc.clearSelection();
         }
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
     } else if (input.isControl('i')) {
         if (!m_jumpListRedo.isEmpty()) {
@@ -2208,6 +2217,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         updateSelection();
     } else if (input.is('o')) {
         setDotCommand("%1o", count());
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
         beginEditBlock(position());
         moveToFirstNonBlankOnLine();
@@ -2217,6 +2228,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         endEditBlock();
     } else if (input.is('O')) {
         setDotCommand("%1O", count());
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
         beginEditBlock(position());
         moveToFirstNonBlankOnLine();
@@ -2240,6 +2253,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         m_submode = TransformSubMode;
         m_subsubmode = ReplaceSubSubMode;
     } else if (!isVisualMode() && input.is('R')) {
+        setUndoPosition(position());
+        breakEditBlock();
         enterReplaceMode();
         updateMiniBuffer();
     } else if (input.isControl('r')) {
@@ -2255,6 +2270,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         setDotCommand("%1s", count());
         m_opcount.clear();
         m_mvcount.clear();
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
     } else if (input.is('S')) {
         if (!isVisualMode()) {
@@ -2263,6 +2280,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
             setPosition(lastPositionInLine(line + count() - 1));
         }
         setDotCommand("%1S", count());
+        setUndoPosition(position());
+        breakEditBlock();
         enterInsertMode();
         m_submode = ChangeSubMode;
         m_movetype = MoveLineWise;
@@ -4333,8 +4352,6 @@ void FakeVimHandler::Private::enterReplaceMode()
     m_commandPrefix.clear();
     m_lastInsertion.clear();
     m_lastDeletion.clear();
-    setUndoPosition(position());
-    breakEditBlock();
     updateCursor();
 }
 
@@ -4346,8 +4363,6 @@ void FakeVimHandler::Private::enterInsertMode()
     m_commandPrefix.clear();
     m_lastInsertion.clear();
     m_lastDeletion.clear();
-    setUndoPosition(position());
-    breakEditBlock();
     updateCursor();
 }
 
-- 
GitLab