fakevim: improve behaviour of <Return> in various modes

This commit is contained in:
hjk
2009-01-15 16:57:11 +01:00
parent 3ce094e474
commit 0b22e71fee

View File

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