diff --git a/src/plugins/fakevim/fakevim_test.cpp b/src/plugins/fakevim/fakevim_test.cpp index 6b9144da5d9..06e732202b6 100644 --- a/src/plugins/fakevim/fakevim_test.cpp +++ b/src/plugins/fakevim/fakevim_test.cpp @@ -1902,6 +1902,19 @@ void FakeVimPlugin::test_vim_letter_case() KEYS("2gUU", " " X "ABC" N "DEF"); KEYS("u", " " X "abc" N "def"); KEYS("", " " X "ABC" N "DEF"); + + // undo, redo and dot command + data.setText(" abcde" N " fgh" N " ijk"); + KEYS("3l" "2l2j" "U", " a" X "BCDe" N " fGH" N " iJK"); + KEYS("u", " a" X "bcde" N " fgh" N " ijk"); + KEYS("", " a" X "BCDe" N " fGH" N " iJK"); + KEYS("u", " a" X "bcde" N " fgh" N " ijk"); + KEYS("h.", " " X "ABCde" N " FGH" N " IJK"); + KEYS("u", " " X "abcde" N " fgh" N " ijk"); + KEYS("h.", " " X " ABcde" N " FGh" N " IJk"); + KEYS("u", " " X " abcde" N " fgh" N " ijk"); + KEYS("j.", " abcde" N " " X " FGh" N " IJk"); + KEYS("u", " abcde" N " " X " fgh" N " ijk"); } void FakeVimPlugin::test_vim_code_autoindent() diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index db4e001253d..9379af6cd87 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -4219,7 +4219,9 @@ bool FakeVimHandler::Private::handleNoSubMode(const Input &input) g.submode = CapitalZSubMode; } else if ((input.is('~') || input.is('u') || input.is('U'))) { g.movetype = MoveExclusive; + pushUndoState(); if (isVisualMode()) { + setDotCommand(visualDotCommand() + QString::number(count()) + input.raw()); if (isVisualLineMode()) g.rangemode = RangeLineMode; else if (isVisualBlockMode()) @@ -4233,7 +4235,6 @@ bool FakeVimHandler::Private::handleNoSubMode(const Input &input) g.submode = UpCaseSubMode; finishMovement(); } else if (g.gflag || (input.is('~') && hasConfig(ConfigTildeOp))) { - pushUndoState(); if (atEndOfLine()) moveLeft(); setAnchor();