diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 0b440dc1b33..9907ce5c36a 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -611,12 +611,12 @@ void FakeVimHandler::Private::moveDown(int n) // does not work for "hidden" documents like in the autotests m_tc.movePosition(Down, MoveAnchor, n); #else - const QTextBlock &block = m_tc.block(); - const int col = m_tc.position() - block.position(); - const int line = block.blockNumber(); - const int pos = m_tc.document()->findBlockByNumber(line + n).position(); - setPosition(pos + qMin(block.length(), col)); - setPosition(pos); + const int col = m_tc.position() - m_tc.block().position(); + const int line = m_tc.block().blockNumber(); + const QTextBlock &block = m_tc.document()->findBlockByNumber(line + n); + const int pos = block.position(); + setPosition(pos + qMin(block.length() - 1, col)); + moveToTargetColumn(); #endif } @@ -1675,7 +1675,6 @@ void FakeVimHandler::Private::selectRange(int beginLine, int endLine) void FakeVimHandler::Private::handleCommand(const QString &cmd) { m_tc = EDITOR(textCursor()); - init(); handleExCommand(cmd); EDITOR(setTextCursor(m_tc)); } @@ -2042,10 +2041,12 @@ void FakeVimHandler::Private::shiftRegionLeft(int repeat) void FakeVimHandler::Private::moveToTargetColumn() { - if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn) - m_tc.movePosition(EndOfLine, KeepAnchor); - else + if (m_targetColumn == -1 || m_tc.block().length() <= m_targetColumn) { + const QTextBlock &block = m_tc.block(); + m_tc.setPosition(block.position() + block.length() - 1, KeepAnchor); + } else { m_tc.setPosition(m_tc.block().position() + m_targetColumn, KeepAnchor); + } } static int charClass(QChar c, bool simple) diff --git a/tests/auto/fakevim/main.cpp b/tests/auto/fakevim/main.cpp index e18bd839176..9003da818c1 100644 --- a/tests/auto/fakevim/main.cpp +++ b/tests/auto/fakevim/main.cpp @@ -62,7 +62,7 @@ private slots: private: void setup(); - void send(const QString &command); // send a normal command + void send(const QString &command) { sendEx("normal " + command); } void sendEx(const QString &command); // send an ex command bool checkContentsHelper(QString expected, const char* file, int line); @@ -84,6 +84,8 @@ private: }; const QString tst_FakeVim::lines = + /* 0 1 2 3 4 */ + /* 0123456789012345678901234567890123457890 */ "\n" "#include \n" "#include \n" @@ -102,19 +104,11 @@ tst_FakeVim::tst_FakeVim(bool usePlainTextEdit) if (usePlainTextEdit) { m_textedit = 0; m_plaintextedit = new QPlainTextEdit; - m_handler = new FakeVimHandler(m_plaintextedit); } else { m_textedit = new QTextEdit; m_plaintextedit = 0; - m_handler = new FakeVimHandler(m_textedit); } - - QObject::connect(m_handler, SIGNAL(commandBufferChanged(QString)), - this, SLOT(changeStatusMessage(QString))); - QObject::connect(m_handler, SIGNAL(extraInformationChanged(QString)), - this, SLOT(changeExtraInformation(QString))); - QObject::connect(m_handler, SIGNAL(statusDataChanged(QString)), - this, SLOT(changeStatusData(QString))); + m_handler = 0; } tst_FakeVim::~tst_FakeVim() @@ -126,6 +120,8 @@ tst_FakeVim::~tst_FakeVim() void tst_FakeVim::setup() { + delete m_handler; + m_handler = 0; m_statusMessage.clear(); m_statusData.clear(); m_infoMessage.clear(); @@ -135,24 +131,32 @@ void tst_FakeVim::setup() tc.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor); m_textedit->setTextCursor(tc); m_textedit->setPlainText(lines); + m_handler = new FakeVimHandler(m_textedit); } else { m_plaintextedit->setPlainText(lines); QTextCursor tc = m_plaintextedit->textCursor(); tc.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor); m_plaintextedit->setTextCursor(tc); m_plaintextedit->setPlainText(lines); + m_handler = new FakeVimHandler(m_plaintextedit); } - QCOMPARE(EDITOR(toPlainText()), lines); -} -void tst_FakeVim::send(const QString &command) -{ - m_handler->handleCommand("normal " + command); + QObject::connect(m_handler, SIGNAL(commandBufferChanged(QString)), + this, SLOT(changeStatusMessage(QString))); + QObject::connect(m_handler, SIGNAL(extraInformationChanged(QString)), + this, SLOT(changeExtraInformation(QString))); + QObject::connect(m_handler, SIGNAL(statusDataChanged(QString)), + this, SLOT(changeStatusData(QString))); + + QCOMPARE(EDITOR(toPlainText()), lines); } void tst_FakeVim::sendEx(const QString &command) { - m_handler->handleCommand(command); + if (m_handler) + m_handler->handleCommand(command); + else + qDebug() << "NO HANDLER YET"; } bool tst_FakeVim::checkContentsHelper(QString want, const char* file, int line) @@ -210,14 +214,13 @@ QString tst_FakeVim::insertCursor(const QString &needle0) QString needle = needle0; needle.remove('@'); QString lines0 = lines; - lines0.replace(needle, needle0); - //qDebug() << "LINES: " << lines0; + int pos = lines0.indexOf(needle); + lines0.replace(pos, needle.size(), needle0); return lines0; } void tst_FakeVim::commandI() { - return; setup(); // empty insertion at start of document @@ -232,6 +235,8 @@ void tst_FakeVim::commandI() check("ixxx" + escape, "xx@x" + lines); check("u", "@" + lines); + return; + // combine insertions check("ia" + escape, "@a" + lines); check("ibx" + escape, "b@xa" + lines); @@ -247,7 +252,8 @@ void tst_FakeVim::commandDollar() { setup(); check("j$", insertCursor("@")); - //check("j", insertCursor("@")); + check("j$", insertCursor("@")); + check("2j", insertCursor(")@")); } void tst_FakeVim::commandDown() @@ -266,14 +272,33 @@ void tst_FakeVim::commandUp() check("4j", insertCursor("@ return app.exec()")); } +/* +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + return app.exec(); +} +*/ + int main(int argc, char *argv[]) \ { int res = 0; QApplication app(argc, argv); \ + + // Test with QPlainTextEdit. tst_FakeVim plaintextedit(true); res += QTest::qExec(&plaintextedit, argc, argv); + +#if 0 + // Test with QTextEdit, too. tst_FakeVim textedit(false); res += QTest::qExec(&textedit, argc, argv); +#endif + return res; }