diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp index 6e724feabc9..24f33aeded9 100644 --- a/src/plugins/fakevim/fakevim_test.cpp +++ b/src/plugins/fakevim/fakevim_test.cpp @@ -383,6 +383,25 @@ void FakeVimPlugin::test_vim_movement() KEYS("A", "abc def" X N "ghi"); data.setText("abc def" N "ghi"); KEYS("$a", "abc def" X N "ghi"); + + // paragraph movement + data.setText("abc" N N "def"); + KEYS("}", "abc" N X N "def"); + KEYS("}", "abc" N N "de" X "f"); + KEYS("{", "abc" N X N "def"); + KEYS("{", X "abc" N N "def"); + + data.setText("abc" N N N N "def"); + KEYS("}", "abc" N X N N N "def"); + KEYS("}", "abc" N N N N "de" X "f"); + KEYS("3{", "abc" N N N N "de" X "f"); + KEYS("{", "abc" N N N X N "def"); + KEYS("{", X "abc" N N N N "def"); + KEYS("3}", X "abc" N N N N "def"); + + data.setText("abc def"); + KEYS("}", "abc de" X "f"); + KEYS("{", X "abc def"); } void FakeVimPlugin::test_vim_insert() diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index beea46ff5b7..b2d7a168346 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -1530,6 +1530,9 @@ public: EDITOR(setTextCursor(tc)); } + bool moveToPreviousParagraph(int count) { return moveToNextParagraph(-count); } + bool moveToNextParagraph(int count); + bool handleFfTt(QString key); void enterInsertMode(); @@ -2450,6 +2453,37 @@ void FakeVimHandler::Private::moveDown(int n) moveToTargetColumn(); } +bool FakeVimHandler::Private::moveToNextParagraph(int count) +{ + const bool forward = count > 0; + int repeat = forward ? count : -count; + QTextBlock block = this->block(); + + if (block.isValid() && block.length() == 1) + ++repeat; + + for (; block.isValid(); block = forward ? block.next() : block.previous()) { + if (block.length() == 1) { + if (--repeat == 0) + break; + while (block.isValid() && block.length() == 1) + block = forward ? block.next() : block.previous(); + } + } + + if (repeat == 0) + setPosition(block.position()); + else if (repeat == 1) + setPosition(forward ? lastPositionInDocument() : 0); + else + return false; + + setTargetColumn(); + m_movetype = MoveExclusive; + + return true; +} + void FakeVimHandler::Private::moveToEndOfLine() { // Additionally select (in visual mode) or apply current command on hidden lines following @@ -2986,6 +3020,10 @@ bool FakeVimHandler::Private::handleMovement(const Input &input) moveToStartOfLine(); moveRight(qMin(count, rightDist()) - 1); setTargetColumn(); + } else if (input.is('}')) { + handled = moveToNextParagraph(count); + } else if (input.is('{')) { + handled = moveToPreviousParagraph(count); } else if (input.isReturn()) { moveToStartOfLine(); moveDown();