From 9f99bdb6f16a76ceb80446dbfef718626a5ce5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Aum=C3=BCller?= <aumuell@reserv.at> Date: Tue, 26 Oct 2010 10:56:32 +0200 Subject: [PATCH] fakevim: fixes for search using Core find dialog - repeated searching ('n'/'N') would not work - search would have been restricted to selection - fix search when used as motion in an edit command ('c/...') Merge-request: 190 Reviewed-by: hjk <qtc-committer@nokia.com> --- src/plugins/fakevim/fakevimhandler.cpp | 34 +++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index b91326d6e78..96f4598bab2 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()); -- GitLab