diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 087d225207f76bf440fe9800f54e6d0a6fb83d01..bedd2ccb38d2773a0727c6c19d598cba954e050d 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -161,11 +161,11 @@ private: static int control(int key) { return key + 256; } void init(); - bool handleKey(int key, const QString &text); - bool handleInsertMode(int key, const QString &text); - bool handleCommandMode(int key, const QString &text); - bool handleRegisterMode(int key, const QString &text); - bool handleMiniBufferModes(int key, const QString &text); + bool handleKey(int key, int unmodified, const QString &text); + bool handleInsertMode(int key, int unmodified, const QString &text); + bool handleCommandMode(int key, int unmodified, const QString &text); + bool handleRegisterMode(int key, int unmodified, const QString &text); + bool handleMiniBufferModes(int key, int unmodified, const QString &text); void finishMovement(const QString &text = QString()); void search(const QString &needle, bool forward); @@ -314,6 +314,7 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent) bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) { int key = ev->key(); + const int um = key; // keep unmodified key around // FIXME if (m_mode == PassingMode && key != Qt::Key_Control && key != Qt::Key_Shift) { @@ -342,7 +343,7 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) && (ev->modifiers() & Qt::ShiftModifier) == 0) { key += 32; } - bool handled = handleKey(key, ev->text()); + bool handled = handleKey(key, um, ev->text()); // We fake vi-style end-of-line behaviour m_fakeEnd = (atEol() && m_mode == CommandMode); @@ -355,18 +356,18 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) return handled; } -bool FakeVimHandler::Private::handleKey(int key, const QString &text) +bool FakeVimHandler::Private::handleKey(int key, int unmodified, const QString &text) { //qDebug() << "KEY: " << key << text << "POS: " << m_tc.position(); //qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack; m_savedPosition = m_tc.position(); if (m_mode == InsertMode) - return handleInsertMode(key, text); + return handleInsertMode(key, unmodified, text); if (m_mode == CommandMode) - return handleCommandMode(key, text); + return handleCommandMode(key, unmodified, text); if (m_mode == ExMode || m_mode == SearchForwardMode || m_mode == SearchBackwardMode) - return handleMiniBufferModes(key, text); + return handleMiniBufferModes(key, unmodified, text); return false; } @@ -549,7 +550,8 @@ void FakeVimHandler::Private::showBlackMessage(const QString &msg) updateMiniBuffer(); } -bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) +bool FakeVimHandler::Private::handleCommandMode(int key, int unmodified, + const QString &text) { bool handled = true; @@ -647,9 +649,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) updateMiniBuffer(); } else if (key == '"') { m_submode = RegisterSubMode; - } else if (key == Key_Return) { + } else if (unmodified == Key_Return) { m_tc.movePosition(StartOfLine); m_tc.movePosition(Down); + moveToFirstNonBlankOnLine(); finishMovement(); } else if (key == Key_Home) { m_tc.movePosition(StartOfLine, KeepAnchor); @@ -668,7 +671,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) qDebug() << "REPEATING" << m_dotCommand; for (int i = count(); --i >= 0; ) foreach (QChar c, m_dotCommand) - handleKey(c.unicode(), QString(c)); + handleKey(c.unicode(), c.unicode(), QString(c)); } else if (key == '=') { m_submode = IndentSubMode; } else if (key == '%') { @@ -916,7 +919,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) return handled; } -bool FakeVimHandler::Private::handleInsertMode(int key, const QString &text) +bool FakeVimHandler::Private::handleInsertMode(int key, int, const QString &text) { if (key == Key_Escape) { // start with '1', as one instance was already physically inserted @@ -997,7 +1000,8 @@ bool FakeVimHandler::Private::handleInsertMode(int key, const QString &text) return true; } -bool FakeVimHandler::Private::handleMiniBufferModes(int key, const QString &text) +bool FakeVimHandler::Private::handleMiniBufferModes(int key, int unmodified, + const QString &text) { Q_UNUSED(text) @@ -1016,14 +1020,14 @@ bool FakeVimHandler::Private::handleMiniBufferModes(int key, const QString &text if (!m_commandBuffer.isEmpty()) m_commandBuffer.chop(1); updateMiniBuffer(); - } else if (key == Key_Return && m_mode == ExMode) { + } else if (unmodified == Key_Return && m_mode == ExMode) { if (!m_commandBuffer.isEmpty()) { m_commandHistory.takeLast(); m_commandHistory.append(m_commandBuffer); handleExCommand(m_commandBuffer); leaveVisualMode(); } - } else if (key == Key_Return && isSearchMode()) { + } else if (unmodified == Key_Return && isSearchMode()) { if (!m_commandBuffer.isEmpty()) { m_searchHistory.takeLast(); m_searchHistory.append(m_commandBuffer);