diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index b91326d6e78524e1dc2c447c5b8a1e432f857849..96f4598bab2dd2f1610145e2b569d617a4e573c7 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -814,6 +814,7 @@ public: bool m_lastSearchForward; bool m_findPending; + int m_findStartPosition; QString m_lastInsertion; QString m_lastDeletion; @@ -984,6 +985,7 @@ void FakeVimHandler::Private::init() m_subsubmode = NoSubSubMode; m_passing = false; m_findPending = false; + m_findStartPosition = -1; m_fakeEnd = false; m_positionPastEnd = false; m_anchorPastEnd = false; @@ -1326,8 +1328,9 @@ void FakeVimHandler::Private::stopIncrementalFind() if (m_findPending) { m_findPending = false; QTextCursor tc = cursor(); - tc.setPosition(tc.selectionStart()); - setCursor(tc); + setAnchorAndPosition(m_findStartPosition, tc.selectionStart()); + finishMovement(); + setAnchor(); } } @@ -1924,8 +1927,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input) if (hasConfig(ConfigUseCoreSearch)) { // re-use the core dialog. m_findPending = true; + m_findStartPosition = position(); + m_movetype = MoveExclusive; + setAnchor(); // clear selection: otherwise, search is restricted to selection emit q->findRequested(!m_lastSearchForward); - //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. @@ -2306,12 +2311,23 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input) handleStartOfLine(); finishMovement(); } else if (input.is('n') || input.is('N')) { - SearchData sd; - sd.needle = g.searchHistory.current(); - sd.forward = input.is('n') ? m_lastSearchForward : !m_lastSearchForward; - sd.highlightCursor = false; - sd.highlightMatches = true; - search(sd); + if (hasConfig(ConfigUseCoreSearch)) { + bool forward = (input.is('n')) ? m_lastSearchForward : !m_lastSearchForward; + int pos = position(); + emit q->findNextRequested(!forward); + if (forward && pos == cursor().selectionStart()) { + // if cursor is already positioned at the start of a find result, this is returned + emit q->findNextRequested(false); + } + setPosition(cursor().selectionStart()); + } else { + SearchData sd; + sd.needle = g.searchHistory.current(); + sd.forward = input.is('n') ? m_lastSearchForward : !m_lastSearchForward; + sd.highlightCursor = false; + sd.highlightMatches = true; + search(sd); + } } else if (isVisualMode() && (input.is('o') || input.is('O'))) { int pos = position(); setAnchorAndPosition(pos, anchor());