forked from qt-creator/qt-creator
		
	fakevim: fix a few search related peculiarities
This commit is contained in:
		@@ -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());
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user