diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp index 5ccd4c802bd6817e84a29acab400e9cdccfb2f84..80fdc8fa4e6ba86ad6b47e288662da80985867de 100644 --- a/src/plugins/fakevim/handler.cpp +++ b/src/plugins/fakevim/handler.cpp @@ -95,6 +95,9 @@ enum SubSubMode FtSubSubMode, // used for f, F, t, T }; +static const QString ConfigStartOfLine = "startofline"; +static const QString ConfigOn = "on"; + class FakeVimHandler::Private { public: @@ -131,6 +134,7 @@ public: int columnsOnScreen() const; int cursorLineInDocument() const; int cursorColumnInDocument() const; + int linesInDocument() const { return m_tc.document()->blockCount(); } void scrollToLineInDocument(int line); void moveToFirstNonBlankOnLine(); @@ -176,6 +180,11 @@ public: // History for ':' QStringList m_commandHistory; int m_commandHistoryIndex; + + // + // vi style configuration + // + QHash<QString, QString> m_config; }; FakeVimHandler::Private::Private(FakeVimHandler *parent) @@ -191,6 +200,9 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent) m_gflag = false; m_textedit = 0; m_plaintextedit = 0; + + // vi style configuration + m_config[ConfigStartOfLine] = ConfigOn; } bool FakeVimHandler::Private::eventFilter(QObject *ob, QEvent *ev) @@ -399,6 +411,12 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text) m_subsubdata = key; } else if (key == 'g') { m_gflag = true; + } else if (key == 'G') { + int n = m_mvcount.isEmpty() ? linesInDocument() : count(); + m_tc.setPosition(m_tc.document()->findBlockByNumber(n - 1).position()); + if (m_config.contains(ConfigStartOfLine)) + moveToFirstNonBlankOnLine(); + finishMovement(); } else if (key == 'h' || key == Key_Left) { int n = qMin(count(), leftDist()); if (m_fakeEnd && m_tc.block().length() > 1)