From 354fd8d8953c5a18f9ef994b86a317792a35e388 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 12 Feb 2010 15:24:54 +0100
Subject: [PATCH] fakevim: implement 'I' in visual block mode

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

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 65f0efe8b07..fb04603df71 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -423,6 +423,7 @@ public:
     QString m_opcount;
     MoveType m_movetype;
     RangeMode m_rangemode;
+    int m_visualInsertCount;
 
     bool m_fakeEnd;
     bool m_anchorPastEnd;
@@ -1564,13 +1565,20 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             moveLeft();
     } else if (key == 'I') {
         setDotCommand(QString(QLatin1Char('I'))); // setDotCommand("%1I", count());
-        enterInsertMode();
-        if (m_gflag)
-            moveToStartOfLine();
-        else
-            moveToFirstNonBlankOnLine();
-        m_gflag = false;
-        m_tc.clearSelection();
+        if (isVisualMode()) {
+            int beginLine = lineForPosition(anchor());
+            int endLine = lineForPosition(position());
+            m_visualInsertCount = qAbs(endLine - beginLine);
+            setPosition(qMin(position(), anchor()));
+            enterInsertMode();
+        } else {
+            if (m_gflag)
+                moveToStartOfLine();
+            else
+                moveToFirstNonBlankOnLine();
+            m_gflag = false;
+            m_tc.clearSelection();
+        }
     } else if (key == control('i')) {
         if (!m_jumpListRedo.isEmpty()) {
             m_jumpListUndo.append(cursorPosition());
@@ -1918,18 +1926,38 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
 {
     if (key == Key_Escape || key == 27 || key == control('c') ||
 			key == 379 /* ^[ */) {
-        // start with '1', as one instance was already physically inserted
-        // while typing
-        QString data = m_lastInsertion;
-        for (int i = 1; i < count(); ++i) {
-            m_tc.insertText(m_lastInsertion);
-            data += m_lastInsertion;
-        }
-        moveLeft(qMin(1, leftDist()));
-        setTargetColumn();
+        if (isVisualBlockMode() && !m_lastInsertion.contains('\n')) {
+            leaveVisualMode();
+            joinPreviousEditBlock();
+            moveLeft(m_lastInsertion.size());
+            setAnchor();
+            int pos = position();
+            setTargetColumn();
+            for (int i = 0; i < m_visualInsertCount; ++i) {
+                moveDown();
+                m_tc.insertText(m_lastInsertion);
+            }
+            moveLeft(1);
+            Range range(pos, position(), RangeBlockMode);
+            yankText(range);
+            setPosition(pos);
+            setDotCommand("p");
+            endEditBlock();
+        } else {
+            // normal insertion. start with '1', as one instance was
+            // already physically inserted while typing
+            QString data = m_lastInsertion;
+            for (int i = 1; i < count(); ++i) {
+                m_tc.insertText(m_lastInsertion);
+                data += m_lastInsertion;
+            }
+            moveLeft(qMin(1, leftDist()));
+            setTargetColumn();
+            leaveVisualMode();
+            recordNewUndo();
+        }
         m_dotCommand += m_lastInsertion;
         m_dotCommand += QChar(27);
-        recordNewUndo();
         enterCommandMode();
         m_submode = NoSubMode;
     } else if (key == Key_Insert) {
@@ -2954,7 +2982,6 @@ QString FakeVimHandler::Private::text(const Range &range) const
         int column2 = range.endPos - firstPositionInLine(endLine);
         beginColumn = qMin(column1, column2);
         endColumn = qMax(column1, column2);
-        qDebug() << "COLS: " << beginColumn << endColumn;
     }
     int len = endColumn - beginColumn + 1;
     QString contents;
@@ -3315,7 +3342,7 @@ void FakeVimHandler::Private::enterInsertMode()
 {
     EDITOR(setCursorWidth(m_cursorWidth));
     EDITOR(setOverwriteMode(false));
-    leaveVisualMode();
+    //leaveVisualMode();
     m_mode = InsertMode;
     m_lastInsertion.clear();
     m_beginEditBlock = true;
-- 
GitLab