fakevim: Fixed pasting text [count] times and in selection

Text pasted correctly [count] times and text cursor position
after the operation is same as in Vim.

P and p keys should work the same if pasting to selection.

Change-Id: Ic1cc82a71a2103b13a37e270ad9b7745ff95954d
Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
Lukas Holecek
2012-08-09 13:05:06 +02:00
committed by hjk
parent 64fece4d28
commit a1834bba8e

View File

@@ -4799,99 +4799,107 @@ void FakeVimHandler::Private::replaceByCharTransform(TransformationData *td)
void FakeVimHandler::Private::pasteText(bool afterCursor) void FakeVimHandler::Private::pasteText(bool afterCursor)
{ {
const QString text = registerContents(m_register); const QString text = registerContents(m_register);
const QStringList lines = text.split(QChar('\n')); const RangeMode rangeMode = registerRangeMode(m_register);
beginEditBlock(); beginEditBlock();
if (isVisualCharMode()) { // In visual mode paste text only inside selection.
bool pasteAfter = isVisualMode() ? false : afterCursor;
bool visualCharMode = isVisualCharMode();
if (visualCharMode) {
leaveVisualMode(); leaveVisualMode();
m_submode = DeleteSubMode; m_rangemode = RangeCharMode;
finishMovement(); Range range = currentRange();
range.endPos++;
yankText(range, m_register);
removeText(range);
} else if (isVisualLineMode()) { } else if (isVisualLineMode()) {
leaveVisualMode(); leaveVisualMode();
m_rangemode = RangeLineMode; m_rangemode = RangeLineMode;
yankText(currentRange(), m_register); Range range = currentRange();
removeText(currentRange()); range.endPos++;
yankText(range, m_register);
removeText(range);
handleStartOfLine(); handleStartOfLine();
} else if (isVisualBlockMode()) { } else if (isVisualBlockMode()) {
leaveVisualMode(); leaveVisualMode();
m_rangemode = RangeBlockMode; m_rangemode = RangeBlockMode;
yankText(currentRange(), m_register); Range range = currentRange();
removeText(currentRange()); yankText(range, m_register);
removeText(range);
setPosition(qMin(position(), anchor())); setPosition(qMin(position(), anchor()));
} }
switch (registerRangeMode(m_register)) { switch (rangeMode) {
case RangeCharMode: { case RangeCharMode: {
m_targetColumn = 0; m_targetColumn = 0;
for (int i = count(); --i >= 0; ) { if (pasteAfter && rightDist() > 0)
if (afterCursor && rightDist() > 0)
moveRight(); moveRight();
setAnchor(); insertText(text.repeated(count()));
insertText(text); if (!pasteAfter && atEndOfLine())
if (!afterCursor && atEndOfLine())
moveLeft(); moveLeft();
moveLeft(); moveLeft();
}
break; break;
} }
case RangeLineMode: case RangeLineMode:
case RangeLineModeExclusive: { case RangeLineModeExclusive: {
QTextCursor tc = cursor();
if (visualCharMode)
tc.insertBlock();
else
moveToStartOfLine(); moveToStartOfLine();
m_targetColumn = 0; m_targetColumn = 0;
QTextCursor tc = cursor(); if (pasteAfter) {
for (int i = count(); --i >= 0; ) {
bool lastLine = document()->lastBlock() == this->block(); bool lastLine = document()->lastBlock() == this->block();
if (afterCursor) {
if (lastLine) { if (lastLine) {
tc.movePosition(EndOfLine, MoveAnchor); tc.movePosition(EndOfLine, MoveAnchor);
tc.insertBlock(); tc.insertBlock();
} }
moveDown(); moveDown();
} }
setAnchor(); const int pos = position();
insertText(text); insertText(text.repeated(count()));
if (afterCursor && lastLine) { setPosition(pos);
tc.movePosition(Left, KeepAnchor);
tc.removeSelectedText();
setAnchor();
moveUp(lines.size() - 2);
} else {
moveUp(lines.size() - 1);
}
}
moveToFirstNonBlankOnLine(); moveToFirstNonBlankOnLine();
break; break;
} }
case RangeBlockAndTailMode: case RangeBlockAndTailMode:
case RangeBlockMode: { case RangeBlockMode: {
QTextBlock block = this->block(); const int pos = position();
if (afterCursor) if (pasteAfter && rightDist() > 0)
moveRight(); moveRight();
QTextCursor tc = cursor(); QTextCursor tc = cursor();
const int col = tc.position() - block.position(); const int col = tc.columnNumber();
//for (int i = lines.size(); --i >= 0; ) { QTextBlock block = tc.block();
for (int i = 0; i < lines.size(); ++i) { const QStringList lines = text.split(QChar('\n'));
const QString line = lines.at(i); for (int i = 0; i < lines.size() - 1; ++i) {
tc.movePosition(StartOfLine, MoveAnchor); if (!block.isValid()) {
if (col >= block.length()) { tc.movePosition(EndOfDocument);
tc.movePosition(EndOfLine, MoveAnchor); tc.insertBlock();
tc.insertText(QString(col - line.size() + 1, QChar(' '))); block = tc.block();
}
// resize line
int length = block.length();
int begin = block.position();
if (col >= length) {
tc.setPosition(begin + length - 1);
tc.insertText(QString(col - length + 1, QChar(' ')));
} else { } else {
tc.movePosition(Right, MoveAnchor, col - 1 + afterCursor); tc.setPosition(begin + col);
} }
//qDebug() << "INSERT " << line << " AT " << tc.position()
// << "COL: " << col; // insert text
const QString line = lines.at(i).repeated(count());
tc.insertText(line); tc.insertText(line);
tc.movePosition(StartOfLine, MoveAnchor);
tc.movePosition(Down, MoveAnchor, 1); // next line
if (tc.position() >= lastPositionInDocument() - 1) {
tc.insertText(QString(QChar('\n')));
tc.movePosition(Up, MoveAnchor, 1);
}
block = block.next(); block = block.next();
} }
moveLeft(); setPosition(pos);
if (pasteAfter)
moveRight();
break; break;
} }
} }