From 76f57c8678823bd1a39871733ddfcb18c3d3a1fe Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 2 Jun 2009 15:08:23 +0200
Subject: [PATCH] fakevim: fix behaviour of 'r' at end of line

---
 src/plugins/fakevim/fakevimhandler.cpp | 13 +++++++------
 tests/auto/fakevim/main.cpp            | 20 ++++++++++++++++++--
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index fb3c3b15c49..ceda3253347 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -957,19 +957,20 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
             .arg(QChar(m_semicolonType))
             .arg(QChar(m_semicolonKey)));
     } else if (m_submode == ReplaceSubMode) {
-        if (count() < rightDist() && text.size() == 1
+        if (count() <= (rightDist() + atEndOfLine()) && text.size() == 1
                 && (text.at(0).isPrint() || text.at(0).isSpace())) {
+            if (atEndOfLine())
+                moveLeft();
             setAnchor();
             moveRight(count());
-            removeSelectedText();
+            QString rem = removeSelectedText();
             m_tc.insertText(QString(count(), text.at(0)));
             m_moveType = MoveExclusive;
-            m_submode = NoSubMode;
             setDotCommand("%1r" + text, count());
-            finishMovement();
-        } else {
-            m_submode = NoSubMode;
         }
+        setTargetColumn();
+        m_submode = NoSubMode;
+        finishMovement();
     } else if (m_subsubmode == MarkSubSubMode) {
         m_marks[key] = m_tc.position();
         m_subsubmode = NoSubSubMode;
diff --git a/tests/auto/fakevim/main.cpp b/tests/auto/fakevim/main.cpp
index 9e931526f92..66002c9380c 100644
--- a/tests/auto/fakevim/main.cpp
+++ b/tests/auto/fakevim/main.cpp
@@ -63,6 +63,7 @@ private slots:
     void command_e();
     void command_i();
     void command_left();
+    void command_r();
     void command_right();
     void command_up();
     void command_w();
@@ -325,12 +326,12 @@ void tst_FakeVim::command_i()
     check("ixxx" + escape, "xx@x" + lines);
     check("u", "@" + lines);
 
-return;
 
     // combine insertions
     check("ia" + escape, "@a" + lines);
     check("ibx" + escape, "b@xa" + lines);
     check("icyy" + escape, "bcy@yxa" + lines);
+return; // FIXME
     check("u", "b@xa" + lines);
     check("u", "@a" + lines);   // undo broken
     checkEx("redo", "b@xa" + lines);
@@ -344,11 +345,26 @@ void tst_FakeVim::command_left()
     move("4j",  "@int main");
     move("h",   "@int main"); // no move over left border
     move("$",   "argv[])@");
-    move("h",   "argv[]@)");
+    //move("h",   "argv[]@)");
+    check("h",   lmid(0, 4) + "\nint main(int argc, char *argv[]@)\n" + lmid(5));
     move("3h",  "arg@v[])");
     move("50h", "@int main");
 }
 
+void tst_FakeVim::command_r()
+{
+    setup();
+    move("4j",   "@int main");
+    move("$",    "int main(int argc, char *argv[])@");
+    check("rx",  lmid(0, 4) + "\nint main(int argc, char *argv[]x@\n" + lmid(5)); 
+    check("2h",  lmid(0, 4) + "\nint main(int argc, char *argv[@]x\n" + lmid(5));
+    check("4ra", lmid(0, 4) + "\nint main(int argc, char *argv[@]x\n" + lmid(5));
+return; // FIXME
+    check("3rb", lmid(0, 4) + "\nint main(int argc, char *argv[bb@b\n" + lmid(5));
+    check("2rc", lmid(0, 4) + "\nint main(int argc, char *argv[bb@b\n" + lmid(5));
+    check("h2rc",lmid(0, 4) + "\nint main(int argc, char *argv[bc@c\n" + lmid(5));
+}
+
 void tst_FakeVim::command_right()
 {
     setup();
-- 
GitLab