From 33721acf82f97b14613796722b5515c3ccf6148b Mon Sep 17 00:00:00 2001
From: Martin Aumueller <aumuell@reserv.at>
Date: Thu, 25 Dec 2008 10:43:28 +0100
Subject: [PATCH] fakevim: implement '%' for moving between matching
 parentheses

---
 src/plugins/fakevim/FakeVim.pluginspec |  1 +
 src/plugins/fakevim/fakevimhandler.cpp | 27 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/src/plugins/fakevim/FakeVim.pluginspec b/src/plugins/fakevim/FakeVim.pluginspec
index 66a091e283d..a420040ac8a 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 b93bacb8236..45c1d56b332 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();
-- 
GitLab