From f48ff899886bf6d93cd8526ebfaf4d5f6e28ce86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Aum=C3=BCller?= <aumuell@reserv.at>
Date: Thu, 21 Jan 2010 17:23:30 +0100
Subject: [PATCH] fakevim: handle forward/backward search depending on initial
 search ('?'/'/')

Merge-request: 97
Reviewed-by: hjk <qtc-committer@nokia.com>
---
 src/plugins/fakevim/fakevimhandler.cpp | 31 +++++++++++++-------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index f23f9b30da8..bf4abb6773d 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -1160,7 +1160,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
     } else if (key == '/' || key == '?') {
         if (hasConfig(ConfigIncSearch)) {
             // re-use the core dialog.
-            emit q->findRequested(key == '?');
+            m_lastSearchForward = (key == '/');
+            emit q->findRequested(!m_lastSearchForward);
+            m_tc = EDITOR(textCursor());
+            m_tc.setPosition(m_tc.selectionStart());
         } else {
             // FIXME: make core find dialog sufficiently flexible to
             // produce the "default vi" behaviour too. For now, roll our own.
@@ -1509,24 +1512,20 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
         m_tc = EDITOR(cursorForPosition(QPoint(0, EDITOR(height()) / 2)));
         handleStartOfLine();
         finishMovement();
-    } else if (key == 'n') { // FIXME: see comment for '/'
-        if (hasConfig(ConfigIncSearch))
-        {
-            emit q->findNextRequested(false);
+    } else if (key == 'n' || key == 'N') {
+        bool forward = (key == 'n') ? m_lastSearchForward : !m_lastSearchForward;
+        if (hasConfig(ConfigIncSearch)) {
+            int pos = position();
+            emit q->findNextRequested(!forward);
+            if (forward && pos == EDITOR(textCursor()).selectionStart()) {
+                // if cursor is already positioned at the start of a find result, this is returned
+                emit q->findNextRequested(false);
+            }
             m_tc = EDITOR(textCursor());
-        }
-        else
+            m_tc.setPosition(m_tc.selectionStart());
+        } else
             search(lastSearchString(), m_lastSearchForward);
         recordJump();
-    } else if (key == 'N') {
-        if (hasConfig(ConfigIncSearch))
-        {
-            emit q->findNextRequested(true);
-            m_tc = EDITOR(textCursor());
-        }
-        else
-            search(lastSearchString(), !m_lastSearchForward);
-        recordJump();
     } else if (key == 'o' || key == 'O') {
         beginEditBlock();
         setDotCommand("%1o", count());
-- 
GitLab