forked from qt-creator/qt-creator
fakevim: Fix exclusive movement type for some commands
Change-Id: Ia9dc3a7063b921bd90bddd52e1df1e6b8b8b3796 Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
@@ -192,8 +192,12 @@ struct FakeVimPlugin::TestData
|
|||||||
|
|
||||||
QString text() const { return editor()->toPlainText(); }
|
QString text() const { return editor()->toPlainText(); }
|
||||||
|
|
||||||
|
void doCommand(const QString &cmd) { handler->handleCommand(cmd); }
|
||||||
|
void doKeys(const QString &keys) { handler->handleInput(keys); }
|
||||||
|
|
||||||
void setText(const QString &text)
|
void setText(const QString &text)
|
||||||
{
|
{
|
||||||
|
doKeys("<ESC>");
|
||||||
QString str = text;
|
QString str = text;
|
||||||
int i = str.indexOf(cursorString);
|
int i = str.indexOf(cursorString);
|
||||||
if (!cursorString.isEmpty() && i != -1)
|
if (!cursorString.isEmpty() && i != -1)
|
||||||
@@ -202,9 +206,6 @@ struct FakeVimPlugin::TestData
|
|||||||
setPosition(i);
|
setPosition(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void doCommand(const QString &cmd) { handler->handleCommand(cmd); }
|
|
||||||
void doKeys(const QString &keys) { handler->handleInput(keys); }
|
|
||||||
|
|
||||||
int lines() const
|
int lines() const
|
||||||
{
|
{
|
||||||
QTextDocument *doc = editor()->document();
|
QTextDocument *doc = editor()->document();
|
||||||
@@ -550,6 +551,27 @@ void FakeVimPlugin::test_vim_delete()
|
|||||||
// delete in empty document
|
// delete in empty document
|
||||||
data.setText("");
|
data.setText("");
|
||||||
KEYS("dd", X);
|
KEYS("dd", X);
|
||||||
|
|
||||||
|
// delete to start of line
|
||||||
|
data.setText(" abc" N " de" X "f" N " ghi");
|
||||||
|
KEYS("d0", " abc" N X "f" N " ghi");
|
||||||
|
INTEGRITY(false);
|
||||||
|
data.setText(" abc" N " de" X "f" N " ghi");
|
||||||
|
KEYS("d^", " abc" N " " X "f" N " ghi");
|
||||||
|
INTEGRITY(false);
|
||||||
|
|
||||||
|
// delete to mark
|
||||||
|
data.setText("abc " X "def ghi");
|
||||||
|
KEYS("ma" "3l" "d`a", "abc " X " ghi");
|
||||||
|
KEYS("u" "gg" "d`a", X "def ghi");
|
||||||
|
|
||||||
|
// delete lines
|
||||||
|
data.setText(" abc" N " de" X "f" N " ghi" N " jkl");
|
||||||
|
KEYS("dj", " abc" N " " X "jkl");
|
||||||
|
INTEGRITY(false);
|
||||||
|
data.setText(" abc" N " def" N " gh" X "i" N " jkl");
|
||||||
|
KEYS("dk", " abc" N " " X "jkl");
|
||||||
|
INTEGRITY(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimPlugin::test_vim_delete_inner_word()
|
void FakeVimPlugin::test_vim_delete_inner_word()
|
||||||
@@ -724,6 +746,27 @@ void FakeVimPlugin::test_vim_change_replace()
|
|||||||
" int j = 1;" X N
|
" int j = 1;" X N
|
||||||
"}" N
|
"}" N
|
||||||
"");
|
"");
|
||||||
|
|
||||||
|
// change to start of line
|
||||||
|
data.setText(" abc" N " de" X "f" N " ghi");
|
||||||
|
KEYS("c0123<ESC>", " abc" N "12" X "3f" N " ghi");
|
||||||
|
INTEGRITY(false);
|
||||||
|
data.setText(" abc" N " de" X "f" N " ghi");
|
||||||
|
KEYS("c^123<ESC>", " abc" N " 12" X "3f" N " ghi");
|
||||||
|
INTEGRITY(false);
|
||||||
|
|
||||||
|
// change to mark
|
||||||
|
data.setText("abc " X "def ghi");
|
||||||
|
KEYS("ma" "3l" "c`a123<ESC>", "abc 12" X "3 ghi");
|
||||||
|
KEYS("u" "gg" "c`a123<ESC>", "12" X "3def ghi");
|
||||||
|
|
||||||
|
// change lines
|
||||||
|
data.setText(" abc" N " de" X "f" N " ghi" N " jkl");
|
||||||
|
KEYS("cj123<ESC>", " abc" N " 12" X "3" N " jkl");
|
||||||
|
INTEGRITY(false);
|
||||||
|
data.setText(" abc" N " def" N " gh" X "i" N " jkl");
|
||||||
|
KEYS("ck123<ESC>", " abc" N " 12" X "3" N " jkl");
|
||||||
|
INTEGRITY(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeVimPlugin::test_vim_block_selection()
|
void FakeVimPlugin::test_vim_block_selection()
|
||||||
|
|||||||
@@ -2286,7 +2286,7 @@ void FakeVimHandler::Private::moveToStartOfLine()
|
|||||||
void FakeVimHandler::Private::fixSelection()
|
void FakeVimHandler::Private::fixSelection()
|
||||||
{
|
{
|
||||||
if (m_movetype == MoveExclusive) {
|
if (m_movetype == MoveExclusive) {
|
||||||
if (anchor() != position() && atBlockStart()) {
|
if (anchor() < position() && atBlockStart()) {
|
||||||
// Exlusive motion ending at the beginning of line
|
// Exlusive motion ending at the beginning of line
|
||||||
// becomes inclusive and end is moved to end of previous line.
|
// becomes inclusive and end is moved to end of previous line.
|
||||||
m_movetype = MoveInclusive;
|
m_movetype = MoveInclusive;
|
||||||
@@ -2391,8 +2391,8 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommandMovement)
|
|||||||
|
|
||||||
QString dotCommand;
|
QString dotCommand;
|
||||||
if (m_submode == ChangeSubMode) {
|
if (m_submode == ChangeSubMode) {
|
||||||
if (m_rangemode == RangeLineMode)
|
if (m_rangemode != RangeLineModeExclusive)
|
||||||
m_rangemode = RangeLineModeExclusive;
|
setUndoPosition();
|
||||||
removeText(currentRange());
|
removeText(currentRange());
|
||||||
dotCommand = QString('c');
|
dotCommand = QString('c');
|
||||||
if (m_movetype == MoveLineWise)
|
if (m_movetype == MoveLineWise)
|
||||||
@@ -2401,8 +2401,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommandMovement)
|
|||||||
enterInsertMode();
|
enterInsertMode();
|
||||||
} else if (m_submode == DeleteSubMode) {
|
} else if (m_submode == DeleteSubMode) {
|
||||||
setUndoPosition();
|
setUndoPosition();
|
||||||
Range range = currentRange();
|
removeText(currentRange());
|
||||||
removeText(range);
|
|
||||||
dotCommand = QString('d');
|
dotCommand = QString('d');
|
||||||
if (m_movetype == MoveLineWise)
|
if (m_movetype == MoveLineWise)
|
||||||
handleStartOfLine();
|
handleStartOfLine();
|
||||||
@@ -2904,8 +2903,6 @@ EventResult FakeVimHandler::Private::handleCommandMode1(const Input &input)
|
|||||||
}
|
}
|
||||||
} else if (input.is('`')) {
|
} else if (input.is('`')) {
|
||||||
m_subsubmode = BackTickSubSubMode;
|
m_subsubmode = BackTickSubSubMode;
|
||||||
if (m_submode != NoSubMode)
|
|
||||||
m_movetype = MoveLineWise;
|
|
||||||
} else if (input.is('#') || input.is('*')) {
|
} else if (input.is('#') || input.is('*')) {
|
||||||
// FIXME: That's not proper vim behaviour
|
// FIXME: That's not proper vim behaviour
|
||||||
QString needle;
|
QString needle;
|
||||||
@@ -3047,12 +3044,12 @@ EventResult FakeVimHandler::Private::handleCommandMode1(const Input &input)
|
|||||||
moveToNextWordStart(count(), true, false);
|
moveToNextWordStart(count(), true, false);
|
||||||
setTargetColumn();
|
setTargetColumn();
|
||||||
finishMovement();
|
finishMovement();
|
||||||
} else if (input.is('c') && isNoVisualMode()) {
|
} else if ((input.is('c') || input.is('d')) && isNoVisualMode()) {
|
||||||
setUndoPosition();
|
|
||||||
if (atEndOfLine())
|
|
||||||
moveLeft();
|
|
||||||
setAnchor();
|
setAnchor();
|
||||||
m_submode = ChangeSubMode;
|
m_opcount = m_mvcount;
|
||||||
|
m_mvcount.clear();
|
||||||
|
m_movetype = MoveExclusive;
|
||||||
|
m_submode = input.is('c') ? ChangeSubMode : DeleteSubMode;
|
||||||
} else if ((input.is('c') || input.is('C') || input.is('s') || input.is('R'))
|
} else if ((input.is('c') || input.is('C') || input.is('s') || input.is('R'))
|
||||||
&& (isVisualCharMode() || isVisualLineMode())) {
|
&& (isVisualCharMode() || isVisualLineMode())) {
|
||||||
setDotCommand(visualDotCommand() + input.asChar());
|
setDotCommand(visualDotCommand() + input.asChar());
|
||||||
@@ -3078,18 +3075,6 @@ EventResult FakeVimHandler::Private::handleCommandMode1(const Input &input)
|
|||||||
showMessage(MessageInfo, "Type Alt-v,Alt-v to quit FakeVim mode");
|
showMessage(MessageInfo, "Type Alt-v,Alt-v to quit FakeVim mode");
|
||||||
else
|
else
|
||||||
leaveVisualMode();
|
leaveVisualMode();
|
||||||
} else if (input.is('d') && isNoVisualMode()) {
|
|
||||||
if (m_rangemode == RangeLineMode) {
|
|
||||||
int pos = position();
|
|
||||||
moveToEndOfLine();
|
|
||||||
setAnchor();
|
|
||||||
setPosition(pos);
|
|
||||||
} else {
|
|
||||||
setAnchor();
|
|
||||||
}
|
|
||||||
m_opcount = m_mvcount;
|
|
||||||
m_mvcount.clear();
|
|
||||||
m_submode = DeleteSubMode;
|
|
||||||
} 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()) {
|
||||||
setUndoPosition();
|
setUndoPosition();
|
||||||
@@ -3501,6 +3486,7 @@ EventResult FakeVimHandler::Private::handleCommandMode2(const Input &input)
|
|||||||
finishMovement();
|
finishMovement();
|
||||||
} else if (input.is('y') && isNoVisualMode()) {
|
} else if (input.is('y') && isNoVisualMode()) {
|
||||||
setAnchor();
|
setAnchor();
|
||||||
|
m_movetype = MoveExclusive;
|
||||||
m_submode = YankSubMode;
|
m_submode = YankSubMode;
|
||||||
} else if (input.is('y') && isVisualCharMode()) {
|
} else if (input.is('y') && isVisualCharMode()) {
|
||||||
Range range(position(), anchor(), RangeCharMode);
|
Range range(position(), anchor(), RangeCharMode);
|
||||||
@@ -6569,7 +6555,8 @@ bool FakeVimHandler::Private::jumpToMark(QChar mark, bool backTickMode)
|
|||||||
setCursorPosition(m.position);
|
setCursorPosition(m.position);
|
||||||
if (!backTickMode)
|
if (!backTickMode)
|
||||||
moveToFirstNonBlankOnLine();
|
moveToFirstNonBlankOnLine();
|
||||||
setAnchor();
|
if (m_submode == NoSubMode)
|
||||||
|
setAnchor();
|
||||||
setTargetColumn();
|
setTargetColumn();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user