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();