forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user