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