fakevim: Paragraph movement using '{' and '}'

Change-Id: Ie156438b6633b7e9680e028fca7eca1b8788a63d
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Lukas Holecek
2012-11-26 18:50:19 +01:00
committed by hjk
parent 6868fedf4d
commit 0e6041ed45
2 changed files with 57 additions and 0 deletions

View File

@@ -383,6 +383,25 @@ void FakeVimPlugin::test_vim_movement()
KEYS("A", "abc def" X N "ghi"); KEYS("A", "abc def" X N "ghi");
data.setText("abc def" N "ghi"); data.setText("abc def" N "ghi");
KEYS("$a", "abc def" X 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() void FakeVimPlugin::test_vim_insert()

View File

@@ -1530,6 +1530,9 @@ public:
EDITOR(setTextCursor(tc)); EDITOR(setTextCursor(tc));
} }
bool moveToPreviousParagraph(int count) { return moveToNextParagraph(-count); }
bool moveToNextParagraph(int count);
bool handleFfTt(QString key); bool handleFfTt(QString key);
void enterInsertMode(); void enterInsertMode();
@@ -2450,6 +2453,37 @@ void FakeVimHandler::Private::moveDown(int n)
moveToTargetColumn(); 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() void FakeVimHandler::Private::moveToEndOfLine()
{ {
// Additionally select (in visual mode) or apply current command on hidden lines following // 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(); moveToStartOfLine();
moveRight(qMin(count, rightDist()) - 1); moveRight(qMin(count, rightDist()) - 1);
setTargetColumn(); setTargetColumn();
} else if (input.is('}')) {
handled = moveToNextParagraph(count);
} else if (input.is('{')) {
handled = moveToPreviousParagraph(count);
} else if (input.isReturn()) { } else if (input.isReturn()) {
moveToStartOfLine(); moveToStartOfLine();
moveDown(); moveDown();