From c8c362aa7d53692cb642ef706ece9303674f9a5f Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 8 Jan 2009 17:58:42 +0100
Subject: [PATCH] fix some cases where deletions were not recorded in the undo
 stack

---
 src/plugins/fakevim/handler.cpp | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp
index af67103e70b..5103db105c8 100644
--- a/src/plugins/fakevim/handler.cpp
+++ b/src/plugins/fakevim/handler.cpp
@@ -232,6 +232,7 @@ private:
     void recordRemove(int position, const QString &data);
     void recordRemove(int position, int length);
     void recordMove(int position, int nestedCount);
+    void removeSelectedText(QTextCursor &tc);
     void undo();
     void redo();
     QStack<EditOperation> m_undoStack;
@@ -349,7 +350,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
         if (!dotCommand.isEmpty())
             m_dotCommand = "c" + dotCommand;
         m_registers[m_register] = m_tc.selectedText();
-        m_tc.removeSelectedText();
+        removeSelectedText(m_tc);
         m_mode = InsertMode;
         m_submode = NoSubMode;
     } else if (m_submode == DeleteSubMode) {
@@ -357,7 +358,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
             m_dotCommand = "d" + dotCommand;
         recordRemove(qMin(m_tc.position(), m_tc.anchor()), m_tc.selectedText());
         m_registers[m_register] = m_tc.selectedText();
-        m_tc.removeSelectedText();
+        removeSelectedText(m_tc);
         m_submode = NoSubMode;
         if (atEol())
             m_tc.movePosition(Left, MoveAnchor, 1);
@@ -620,7 +621,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         int beginLine = lineForPosition(m_marks['<']);
         int endLine = lineForPosition(m_marks['>']);
         m_tc = selectRange(beginLine, endLine);
-        m_tc.removeSelectedText();
+        removeSelectedText(m_tc);
     } else if (key == 'D') {
         m_submode = DeleteSubMode;
         m_tc.movePosition(Down, KeepAnchor, qMax(count() - 1, 0));
@@ -734,6 +735,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
         m_subsubdata = key;
     } else if (key == 'u') {
         undo();
+    } else if (key == 'U') {
+        // FIXME: this is non-vim, but as Ctrl-R is taken globally
+        // we have a substitute here
+        redo();
     } else if (key == 'v') {
         enterVisualMode(VisualCharMode);
     } else if (key == 'V') {
@@ -1071,6 +1076,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
 
         m_tc.setPosition(positionForLine(beginLine));
         EditOperation op;
+        // FIXME: broken for "upward selection"
         op.m_position = m_tc.position();
         op.m_from = text;
         op.m_to = result;
@@ -1346,6 +1352,7 @@ void FakeVimHandler::Private::undo()
             m_tc.setPosition(op.m_position, MoveAnchor);
         }
         m_redoStack.push(op);
+        showBlackMessage(QString());
     }
 #endif
 }
@@ -1374,10 +1381,20 @@ void FakeVimHandler::Private::redo()
             m_tc.setPosition(op.m_position, MoveAnchor);
         }
         m_undoStack.push(op);
+        showBlackMessage(QString());
     }
 #endif
 }
 
+void FakeVimHandler::Private::removeSelectedText(QTextCursor &tc)
+{
+    EditOperation op;
+    op.m_position = qMin(tc.position(), tc.anchor());
+    op.m_from = tc.selection().toPlainText();
+    recordOperation(op);
+    tc.removeSelectedText();
+}
+
 void FakeVimHandler::Private::recordOperation(const EditOperation &op)
 {
     m_undoStack.push(op);
-- 
GitLab