diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index af32068b83314e58965db1efda5e720c9ac63f38..ef8e5844bcfb0ae18aa7172f970e9e991fb504e9 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -1591,7 +1591,10 @@ static bool subModeCanUseTextObjects(int submode) { return submode == DeleteSubMode || submode == YankSubMode - || submode == ChangeSubMode; + || submode == ChangeSubMode + || submode == IndentSubMode + || submode == ShiftLeftSubMode + || submode == ShiftRightSubMode; } EventResult FakeVimHandler::Private::handleCommandSubSubMode(const Input &input) @@ -1627,6 +1630,8 @@ EventResult FakeVimHandler::Private::handleCommandSubSubMode(const Input &input) selectBlockTextObject(m_subsubdata.is('i'), '(', ')'); else if (input.is('<') || input.is('>')) selectBlockTextObject(m_subsubdata.is('i'), '<', '>'); + else if (input.is('{') || input.is('}') || input.is('B')) + selectBlockTextObject(m_subsubdata.is('i'), '{', '}'); else if (input.is('"') || input.is('\'') || input.is('`')) selectQuotedStringTextObject(m_subsubdata.is('i'), input.key()); m_subsubmode = NoSubSubMode; @@ -4515,9 +4520,22 @@ void FakeVimHandler::Private::selectParagraphTextObject(bool inner) void FakeVimHandler::Private::selectBlockTextObject(bool inner, char left, char right) { - Q_UNUSED(inner); - Q_UNUSED(left); - Q_UNUSED(right); + QTextDocument *doc = m_tc.document(); + QString sleft = QString(QLatin1Char(left)); + QString sright = QString(QLatin1Char(right)); + QTextCursor tc2 = doc->find(sright, m_tc); + if (tc2.isNull()) + return; + QTextCursor tc1 = doc->find(sleft, m_tc, QTextDocument::FindBackward); + if (tc1.isNull()) + return; + const int p1 = tc1.position() + inner - sleft.size(); + const int p2 = tc2.position() - inner - sright.size(); + setMark('>', p1); + m_anchor = p2; + setMark('<', p2); + setPosition(p1); + m_movetype = MoveInclusive; } void FakeVimHandler::Private::selectQuotedStringTextObject(bool inner, int type)