Commit 9f99bdb6 authored by Martin Aumüller's avatar Martin Aumüller Committed by hjk
Browse files

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: default avatarhjk <qtc-committer@nokia.com>
parent 26339061
......@@ -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());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment