diff --git a/src/plugins/fakevim/FakeVim.pluginspec b/src/plugins/fakevim/FakeVim.pluginspec index 66a091e283d4b367dce07e01d6c3af5bba0117f9..a420040ac8a8d8a39c572902d5c8aa191e084781 100644 --- a/src/plugins/fakevim/FakeVim.pluginspec +++ b/src/plugins/fakevim/FakeVim.pluginspec @@ -6,6 +6,7 @@ <url>http://www.trolltech.com/</url> <dependencyList> <dependency name="CppEditor" version="0.9.2"/><!-- Plugin adds items to the editor's context menu --> + <dependency name="TextEditor" version="0.9.2"/> <dependency name="ProjectExplorer" version="0.9.2"/> <dependency name="Core" version="0.9.2"/> </dependencyList> diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index b93bacb8236e191d9bf0997e679f7911ae5f6976..45c1d56b3327a322f0ade1d86396f0e0186f4094 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -669,6 +669,33 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) handleKey(c.unicode(), QString(c)); } else if (key == '=') { m_submode = IndentSubMode; + } else if (key == '%') { + bool undoFakeEOL = false; + if (atEol()) { + m_tc.movePosition(Left, KeepAnchor, 1); + undoFakeEOL = true; + } + TextEditor::TextBlockUserData::MatchType match + = TextEditor::TextBlockUserData::matchCursorForward(&m_tc); + if (match == TextEditor::TextBlockUserData::Match) { + if (m_submode == NoSubMode || m_submode == ZSubMode || m_submode == RegisterSubMode) + m_tc.movePosition(Left, KeepAnchor, 1); + } else { + if (undoFakeEOL) + m_tc.movePosition(Right, KeepAnchor, 1); + if (match == TextEditor::TextBlockUserData::NoMatch) { + // backward matching is according to the character before the cursor + bool undoMove = false; + if (!m_tc.atBlockEnd()) { + m_tc.movePosition(Right, KeepAnchor, 1); + undoMove = true; + } + match = TextEditor::TextBlockUserData::matchCursorBackward(&m_tc); + if (match != TextEditor::TextBlockUserData::Match && undoMove) + m_tc.movePosition(Left, KeepAnchor, 1); + } + } + finishMovement(); } else if (key == 'a') { m_mode = InsertMode; m_lastInsertion.clear();