forked from qt-creator/qt-creator
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:
@@ -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();
|
insertText(text.repeated(count()));
|
||||||
setAnchor();
|
if (!pasteAfter && atEndOfLine())
|
||||||
insertText(text);
|
|
||||||
if (!afterCursor && atEndOfLine())
|
|
||||||
moveLeft();
|
|
||||||
moveLeft();
|
moveLeft();
|
||||||
}
|
moveLeft();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RangeLineMode:
|
case RangeLineMode:
|
||||||
case RangeLineModeExclusive: {
|
case RangeLineModeExclusive: {
|
||||||
moveToStartOfLine();
|
|
||||||
m_targetColumn = 0;
|
|
||||||
QTextCursor tc = cursor();
|
QTextCursor tc = cursor();
|
||||||
for (int i = count(); --i >= 0; ) {
|
if (visualCharMode)
|
||||||
|
tc.insertBlock();
|
||||||
|
else
|
||||||
|
moveToStartOfLine();
|
||||||
|
m_targetColumn = 0;
|
||||||
|
if (pasteAfter) {
|
||||||
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();
|
|
||||||
}
|
|
||||||
setAnchor();
|
|
||||||
insertText(text);
|
|
||||||
if (afterCursor && lastLine) {
|
|
||||||
tc.movePosition(Left, KeepAnchor);
|
|
||||||
tc.removeSelectedText();
|
|
||||||
setAnchor();
|
|
||||||
moveUp(lines.size() - 2);
|
|
||||||
} else {
|
|
||||||
moveUp(lines.size() - 1);
|
|
||||||
}
|
}
|
||||||
|
moveDown();
|
||||||
}
|
}
|
||||||
|
const int pos = position();
|
||||||
|
insertText(text.repeated(count()));
|
||||||
|
setPosition(pos);
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user