From ff4bb681f64d62e90ecb5ad49356a166268299ac Mon Sep 17 00:00:00 2001
From: Martin Aumueller <aumuell@reserv.at>
Date: Fri, 26 Dec 2008 14:31:34 +0100
Subject: [PATCH] fakevim: implement 'R' for overwriting in current line

---
 src/plugins/fakevim/fakevimhandler.cpp | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index b6bb00f426e..395f7748909 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -796,6 +796,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
     } else if (key == 'r') {
         m_submode = ReplaceSubMode;
         m_dotCommand = "r";
+    } else if (key == 'R') {
+        m_mode = InsertMode;
+        m_submode = ReplaceSubMode;
+        m_dotCommand = "R";
     } else if (key == control('r')) {
         redo();
     } else if (key == 's') {
@@ -888,15 +892,18 @@ bool FakeVimHandler::Private::handleInsertMode(int key, const QString &text)
         m_tc.movePosition(Left, MoveAnchor, 1);
         m_lastInsertion.clear();
     } else if (key == Key_Down) {
+        m_submode = NoSubMode;
         m_tc.movePosition(Down, MoveAnchor, 1);
         m_lastInsertion.clear();
     } else if (key == Key_Up) {
+        m_submode = NoSubMode;
         m_tc.movePosition(Up, MoveAnchor, 1);
         m_lastInsertion.clear();
     } else if (key == Key_Right) {
         m_tc.movePosition(Right, MoveAnchor, 1);
         m_lastInsertion.clear();
     } else if (key == Key_Return) {
+        m_submode = NoSubMode;
         m_tc.insertBlock();
         m_lastInsertion += "\n";
     } else if (key == Key_Backspace || key == control('h')) {
@@ -917,6 +924,12 @@ bool FakeVimHandler::Private::handleInsertMode(int key, const QString &text)
         m_tc.insertText(str);
     } else if (!text.isEmpty()) {
         m_lastInsertion.append(text);
+        if (m_submode == ReplaceSubMode) {
+            if (atEol())
+                m_submode = NoSubMode;
+            else
+                m_tc.deleteChar();
+        }
         m_tc.insertText(text);
     } else {
         return false;
-- 
GitLab