Commit 46fa3aa7 authored by hjk's avatar hjk
Browse files

fakevim: fix a few search related peculiarities

parent a4a56a75
......@@ -169,8 +169,7 @@ enum SubSubMode
UpCaseSubSubMode, // used for gU
ReplaceSubSubMode, // used for r after visual mode
TextObjectSubSubMode, // used for thing like iw, aW, as etc.
SearchForwardSubSubMode,
SearchBackwardSubSubMode,
SearchSubSubMode,
};
enum VisualMode
......@@ -592,13 +591,9 @@ public:
bool m_anchorPastEnd;
bool m_positionPastEnd; // '$' & 'l' in visual mode can move past eol
bool isSearchSubSubMode() const
{
return m_subsubmode == SearchForwardSubSubMode
|| m_subsubmode == SearchBackwardSubSubMode;
}
int m_gflag; // whether current command started with 'g'
QString m_commandPrefix;
QString m_commandBuffer;
QString m_currentFileName;
QString m_currentMessage;
......@@ -792,7 +787,7 @@ bool FakeVimHandler::Private::wantsOverride(QKeyEvent *ev)
KEY_DEBUG("SHORTCUT OVERRIDE" << key << " PASSING: " << m_passing);
if (key == Key_Escape) {
if (isSearchSubSubMode())
if (m_subsubmode == SearchSubSubMode)
return true;
// Not sure this feels good. People often hit Esc several times
if (isNoVisualMode() && m_mode == CommandMode)
......@@ -980,7 +975,7 @@ EventResult FakeVimHandler::Private::handleKey(const Input &input)
{
if (m_mode == ExMode)
return handleExMode(input);
if (isSearchSubSubMode())
if (m_subsubmode == SearchSubSubMode)
return handleSearchSubSubMode(input);
if (m_mode == InsertMode || m_mode == CommandMode) {
g.pendingInput.append(input);
......@@ -1113,6 +1108,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
setPosition(qMin(anchor(), position()));
enterExMode();
m_currentMessage.clear();
m_commandPrefix = QChar();
m_commandBuffer = QString(".,+%1!").arg(qAbs(endLine - beginLine));
g.commandHistory.append(QString());
g.commandHistoryIndex = g.commandHistory.size() - 1;
......@@ -1341,12 +1337,10 @@ void FakeVimHandler::Private::updateMiniBuffer()
else
msg = "-- INSERT --";
} else {
if (m_subsubmode == SearchForwardSubSubMode)
msg += '/';
else if (m_subsubmode == SearchBackwardSubSubMode)
msg += '?';
if (m_subsubmode == SearchSubSubMode)
msg += m_commandPrefix;
else if (m_mode == ExMode)
msg += ':';
msg += m_commandPrefix;
foreach (QChar c, m_commandBuffer) {
if (c.unicode() < 32) {
msg += '^';
......@@ -1631,6 +1625,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
} else if (input.is(':')) {
enterExMode();
m_currentMessage.clear();
m_commandPrefix = input.text().at(0);
m_commandBuffer.clear();
if (isVisualMode())
m_commandBuffer = "'<,'>";
......@@ -1638,10 +1633,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
g.commandHistoryIndex = g.commandHistory.size() - 1;
updateMiniBuffer();
} else if (input.is('/') || input.is('?')) {
m_lastSearchForward = input.is('/');
if (hasConfig(ConfigUseCoreSearch)) {
// re-use the core dialog.
m_findPending = true;
m_lastSearchForward = (input.is('/'));
EDITOR(setTextCursor(m_tc));
emit q->findRequested(!m_lastSearchForward);
m_tc = EDITOR(textCursor());
......@@ -1650,9 +1645,9 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
// FIXME: make core find dialog sufficiently flexible to
// produce the "default vi" behaviour too. For now, roll our own.
m_currentMessage.clear();
m_subsubmode = (input.is('/'))
? SearchForwardSubSubMode : SearchBackwardSubSubMode;
m_commandBuffer.clear();
m_subsubmode = SearchSubSubMode;
m_commandPrefix = QLatin1Char(m_lastSearchForward ? '/' : '?');
m_commandBuffer = QString();
g.searchHistory.append(QString());
g.searchHistoryIndex = g.searchHistory.size() - 1;
updateCursor();
......@@ -1665,7 +1660,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
m_tc.select(QTextCursor::WordUnderCursor);
QString needle = "\\<" + m_tc.selection().toPlainText() + "\\>";
g.searchHistory.append(needle);
m_lastSearchForward = (input.is('*'));
m_lastSearchForward = input.is('*');
m_currentMessage.clear();
m_commandPrefix = QLatin1Char(m_lastSearchForward ? '/' : '?');
m_commandBuffer = needle;
updateMiniBuffer();
search(needle, m_lastSearchForward);
recordJump();
......@@ -2003,9 +2001,12 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
m_tc = EDITOR(cursorForPosition(QPoint(0, EDITOR(height()) / 2)));
handleStartOfLine();
finishMovement();
} else if (input.is('n') || input.is('N')) {
} else if (input.is('n')) {
search(lastSearchString(), m_lastSearchForward);
recordJump();
} else if (input.is('N')) {
search(lastSearchString(), !m_lastSearchForward);
recordJump();
} else if (isVisualMode() && (input.is('o') || input.is('O'))) {
int pos = position();
setPosition(anchor());
......@@ -2512,27 +2513,24 @@ EventResult FakeVimHandler::Private::handleSearchSubSubMode(const Input &input)
enterCommandMode();
updateMiniBuffer();
} else if (input.isKey(Key_Backspace)) {
if (m_commandBuffer.isEmpty()) {
if (m_commandBuffer.isEmpty())
enterCommandMode();
} else {
else
m_commandBuffer.chop(1);
}
updateMiniBuffer();
} else if (input.isKey(Key_Left)) {
// FIXME:
if (!m_commandBuffer.isEmpty())
m_commandBuffer.chop(1);
updateMiniBuffer();
} else if (input.isKey(Key_Return) && !hasConfig(ConfigIncSearch)) {
if (!m_commandBuffer.isEmpty()) {
QString needle = m_commandBuffer;
if (!needle.isEmpty()) {
g.searchHistory.takeLast();
g.searchHistory.append(m_commandBuffer);
m_lastSearchForward = (m_subsubmode == SearchForwardSubSubMode);
g.searchHistory.append(needle);
search(lastSearchString(), m_lastSearchForward);
recordJump();
}
QString needle = m_commandBuffer.mid(1); // FIXME: why
finishMovement("/" + needle + "\n");
finishMovement(m_commandPrefix + needle + "\n");
enterCommandMode();
highlightMatches(needle);
updateMiniBuffer();
......@@ -2552,12 +2550,11 @@ EventResult FakeVimHandler::Private::handleSearchSubSubMode(const Input &input)
m_commandBuffer += QChar(9);
updateMiniBuffer();
} else if (input.isKey(Key_Return) && hasConfig(ConfigIncSearch)) {
QString needle = m_commandBuffer;
enterCommandMode();
QString needle = m_commandBuffer.mid(1); // FIXME: why
highlightMatches(needle);
updateMiniBuffer();
} else if (hasConfig(ConfigIncSearch)) {
m_commandBuffer = m_commandBuffer.mid(1); // FIXME: why
QString needle = m_commandBuffer + input.text();
search(needle, m_lastSearchForward, true);
updateMiniBuffer();
......@@ -3192,7 +3189,7 @@ static void vimPatternToQtPattern(QString *needle, QTextDocument::FindFlags *fla
void FakeVimHandler::Private::search(const QString &needle0, bool forward,
bool incSearch)
{
showBlackMessage((forward ? '/' : '?') + needle0);
showBlackMessage(QLatin1Char(forward ? '/' : '?') + needle0);
CursorPosition origPosition = cursorPosition();
QTextDocument::FindFlags flags = QTextDocument::FindCaseSensitively;
if (!forward)
......@@ -3270,7 +3267,6 @@ void FakeVimHandler::Private::highlightMatches(const QString &needle0)
QString needle = needle0;
vimPatternToQtPattern(&needle, &flags);
EDITOR(setTextCursor(tc));
while (EDITOR(find(needle, flags))) {
tc = EDITOR(textCursor());
......
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