FakeVim: Correct behavior of command "D" in visual block mode

Command "<C-V>...D" deletes characters inside and behind
block selection.

Change-Id: I2589bc560306a9a5a893f810c8c8037f44517af7
Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
Lukas Holecek
2014-11-16 13:04:03 +01:00
committed by hjk
parent 0790ee8159
commit 3a03162fba
3 changed files with 24 additions and 7 deletions

View File

@@ -3584,6 +3584,21 @@ void FakeVimPlugin::test_vim_Visual_d()
KEYS("P", '|' + lmid(0,1)+'\n' + lmid(3)); KEYS("P", '|' + lmid(0,1)+'\n' + lmid(3));
} }
void FakeVimPlugin::test_vim_visual_block_D()
{
TestData data;
setup(&data);
data.setText("abc def" N "ghi" N "" N "jklm");
KEYS("l<C-V>3j", "abc def" N "ghi" N "" N "jk" X "lm");
KEYS("D", X "a" N "g" N "" N "j");
KEYS("u", "a" X "bc def" N "ghi" N "" N "jklm");
KEYS("<C-R>", X "a" N "g" N "" N "j");
KEYS("u", "a" X "bc def" N "ghi" N "" N "jklm");
KEYS(".", X "a" N "g" N "" N "j");
}
void FakeVimPlugin::test_macros() void FakeVimPlugin::test_macros()
{ {
TestData data; TestData data;

View File

@@ -2940,6 +2940,8 @@ void FakeVimHandler::Private::pushUndoState(bool overwrite)
pos = qMin(pos, anchor()); pos = qMin(pos, anchor());
if (isVisualLineMode()) if (isVisualLineMode())
pos = firstPositionInLine(lineForPosition(pos)); pos = firstPositionInLine(lineForPosition(pos));
else if (isVisualBlockMode())
pos = blockAt(pos).position() + qMin(columnAt(anchor()), columnAt(position()));
} else if (g.movetype == MoveLineWise && hasConfig(ConfigStartOfLine)) { } else if (g.movetype == MoveLineWise && hasConfig(ConfigStartOfLine)) {
QTextCursor tc = m_cursor; QTextCursor tc = m_cursor;
if (g.submode == ShiftLeftSubMode || g.submode == ShiftRightSubMode if (g.submode == ShiftLeftSubMode || g.submode == ShiftRightSubMode
@@ -3885,10 +3887,7 @@ bool FakeVimHandler::Private::handleMovement(const Input &input)
moveVertically(-count); moveVertically(-count);
} else if (input.is('l') || input.isKey(Key_Right) || input.is(' ')) { } else if (input.is('l') || input.isKey(Key_Right) || input.is(' ')) {
g.movetype = MoveExclusive; g.movetype = MoveExclusive;
bool pastEnd = count >= rightDist() - 1;
moveRight(qMax(0, qMin(count, rightDist() - (g.submode == NoSubMode)))); moveRight(qMax(0, qMin(count, rightDist() - (g.submode == NoSubMode))));
if (pastEnd && isVisualMode())
m_visualTargetColumn = -1;
} else if (input.is('L')) { } else if (input.is('L')) {
const CursorPosition pos(lineToBlockNumber(lineOnBottom(count)), 0); const CursorPosition pos(lineToBlockNumber(lineOnBottom(count)), 0);
setCursorPosition(&m_cursor, pos); setCursorPosition(&m_cursor, pos);
@@ -4156,15 +4155,16 @@ bool FakeVimHandler::Private::handleNoSubMode(const Input &input)
leaveVisualMode(); leaveVisualMode();
} else if ((input.is('d') || input.is('x') || input.isKey(Key_Delete)) } else if ((input.is('d') || input.is('x') || input.isKey(Key_Delete))
&& isVisualMode()) { && isVisualMode()) {
pushUndoState();
setDotCommand(visualDotCommand() + QLatin1Char('x')); setDotCommand(visualDotCommand() + QLatin1Char('x'));
cutSelectedText(); cutSelectedText();
} else if (input.is('D') && isNoVisualMode()) { } else if (input.is('D') && isNoVisualMode()) {
handleAs(_("%1d$")); handleAs(_("%1d$"));
} else if ((input.is('D') || input.is('X')) && isVisualMode()) { } else if ((input.is('D') || input.is('X')) && isVisualMode()) {
setDotCommand(visualDotCommand() + QLatin1Char('X')); setDotCommand(visualDotCommand() + input.toString());
if (isVisualCharMode()) if (isVisualCharMode())
toggleVisualMode(VisualLineMode); toggleVisualMode(VisualLineMode);
if (isVisualBlockMode() && input.is('D'))
m_visualTargetColumn = -1;
cutSelectedText(); cutSelectedText();
} else if (input.isControl('d')) { } else if (input.isControl('d')) {
const int scrollOffset = windowScrollOffset(); const int scrollOffset = windowScrollOffset();
@@ -7161,6 +7161,8 @@ void FakeVimHandler::Private::pasteText(bool afterCursor)
void FakeVimHandler::Private::cutSelectedText() void FakeVimHandler::Private::cutSelectedText()
{ {
pushUndoState();
bool visualMode = isVisualMode(); bool visualMode = isVisualMode();
leaveVisualMode(); leaveVisualMode();
@@ -7439,7 +7441,7 @@ void FakeVimHandler::Private::leaveVisualMode()
g.rangemode = RangeCharMode; g.rangemode = RangeCharMode;
g.movetype = MoveInclusive; g.movetype = MoveInclusive;
} else if (isVisualBlockMode()) { } else if (isVisualBlockMode()) {
g.rangemode = RangeBlockMode; g.rangemode = m_visualTargetColumn == -1 ? RangeBlockAndTailMode : RangeBlockMode;
g.movetype = MoveInclusive; g.movetype = MoveInclusive;
} }
@@ -7735,7 +7737,6 @@ void FakeVimHandler::Private::enterVisualInsertMode(QChar command)
: AppendBlockInsertMode; : AppendBlockInsertMode;
} else if (change) { } else if (change) {
m_visualBlockInsert = ChangeBlockInsertMode; m_visualBlockInsert = ChangeBlockInsertMode;
pushUndoState();
beginEditBlock(); beginEditBlock();
cutSelectedText(); cutSelectedText();
endEditBlock(); endEditBlock();

View File

@@ -148,6 +148,7 @@ private slots:
void test_vim_visual_d(); void test_vim_visual_d();
void test_vim_Visual_d(); void test_vim_Visual_d();
void test_vim_visual_block_D();
void test_macros(); void test_macros();