fakevim: fix undoing of commands that enter insert mode

atomically undo command that entered insert mode together with undoing the insertion of new characters

Merge-request: 96
Reviewed-by: hjk <qtc-committer@nokia.com>
This commit is contained in:
Martin Aumüller
2010-01-05 18:42:24 +01:00
committed by hjk
parent 833a266319
commit 869782df18

View File

@@ -437,6 +437,7 @@ public:
void redo(); void redo();
void setUndoPosition(int pos); void setUndoPosition(int pos);
QMap<int, int> m_undoCursorPosition; // revision -> position QMap<int, int> m_undoCursorPosition; // revision -> position
bool m_beginEditBlock;
// extra data for '.' // extra data for '.'
void replay(const QString &text, int count); void replay(const QString &text, int count);
@@ -528,6 +529,7 @@ void FakeVimHandler::Private::init()
m_inReplay = false; m_inReplay = false;
m_justAutoIndented = 0; m_justAutoIndented = 0;
m_rangemode = RangeCharMode; m_rangemode = RangeCharMode;
m_beginEditBlock = true;
} }
bool FakeVimHandler::Private::wantsOverride(QKeyEvent *ev) bool FakeVimHandler::Private::wantsOverride(QKeyEvent *ev)
@@ -793,6 +795,7 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
yankSelectedText(); yankSelectedText();
removeSelectedText(); removeSelectedText();
enterInsertMode(); enterInsertMode();
m_beginEditBlock = false;
m_submode = NoSubMode; m_submode = NoSubMode;
} else if (m_submode == DeleteSubMode) { } else if (m_submode == DeleteSubMode) {
if (m_rangemode == RangeCharMode) { if (m_rangemode == RangeCharMode) {
@@ -1275,6 +1278,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
yankSelectedText(); yankSelectedText();
removeSelectedText(); removeSelectedText();
enterInsertMode(); enterInsertMode();
m_beginEditBlock = false;
setDotCommand("C"); setDotCommand("C");
finishMovement(); finishMovement();
} else if (key == control('c')) { } else if (key == control('c')) {
@@ -1490,6 +1494,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
beginEditBlock(); beginEditBlock();
setDotCommand("%1o", count()); setDotCommand("%1o", count());
enterInsertMode(); enterInsertMode();
m_beginEditBlock = false;
moveToFirstNonBlankOnLine(); moveToFirstNonBlankOnLine();
if (key == 'O') if (key == 'O')
moveUp(); moveUp();
@@ -1541,6 +1546,7 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified,
m_opcount.clear(); m_opcount.clear();
m_mvcount.clear(); m_mvcount.clear();
enterInsertMode(); enterInsertMode();
m_beginEditBlock = false;
} else if (key == 't') { } else if (key == 't') {
m_movetype = MoveInclusive; m_movetype = MoveInclusive;
m_subsubmode = FtSubSubMode; m_subsubmode = FtSubSubMode;
@@ -1751,6 +1757,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
insertAutomaticIndentation(true); insertAutomaticIndentation(true);
setTargetColumn(); setTargetColumn();
} else if (key == Key_Backspace || key == control('h')) { } else if (key == Key_Backspace || key == control('h')) {
joinPreviousEditBlock();
if (!removeAutomaticIndentation() if (!removeAutomaticIndentation()
&& (!m_lastInsertion.isEmpty() && (!m_lastInsertion.isEmpty()
|| hasConfig(ConfigBackspace, "start"))) || hasConfig(ConfigBackspace, "start")))
@@ -1771,6 +1778,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
} }
setTargetColumn(); setTargetColumn();
} }
endEditBlock();
} else if (key == Key_Delete) { } else if (key == Key_Delete) {
m_tc.deleteChar(); m_tc.deleteChar();
m_lastInsertion.clear(); m_lastInsertion.clear();
@@ -1792,6 +1800,13 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
} else if (key >= control('a') && key <= control('z')) { } else if (key >= control('a') && key <= control('z')) {
// ignore these // ignore these
} else if (!text.isEmpty()) { } else if (!text.isEmpty()) {
if (m_beginEditBlock)
{
beginEditBlock();
m_beginEditBlock = false;
}
else
joinPreviousEditBlock();
m_justAutoIndented = false; m_justAutoIndented = false;
m_lastInsertion.append(text); m_lastInsertion.append(text);
if (m_submode == ReplaceSubMode) { if (m_submode == ReplaceSubMode) {
@@ -1811,6 +1826,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(int key, int,
if (!m_inReplay) if (!m_inReplay)
emit q->completionRequested(); emit q->completionRequested();
setTargetColumn(); setTargetColumn();
endEditBlock();
} else { } else {
return EventUnhandled; return EventUnhandled;
} }
@@ -2940,6 +2956,7 @@ void FakeVimHandler::Private::enterInsertMode()
EDITOR(setOverwriteMode(false)); EDITOR(setOverwriteMode(false));
m_mode = InsertMode; m_mode = InsertMode;
m_lastInsertion.clear(); m_lastInsertion.clear();
m_beginEditBlock = true;
} }
void FakeVimHandler::Private::enterCommandMode() void FakeVimHandler::Private::enterCommandMode()