start with '.'

This commit is contained in:
hjk
2009-01-06 11:43:49 +01:00
parent 1caa69f241
commit 8f4818989a

View File

@@ -118,7 +118,7 @@ public:
void handleCommandMode(int key, const QString &text); void handleCommandMode(int key, const QString &text);
void handleRegisterMode(int key, const QString &text); void handleRegisterMode(int key, const QString &text);
void handleExMode(int key, const QString &text); void handleExMode(int key, const QString &text);
void finishMovement(); void finishMovement(const QString &text = QString());
void updateMiniBuffer(); void updateMiniBuffer();
void search(const QString &needle, bool forward); void search(const QString &needle, bool forward);
void showMessage(const QString &msg); void showMessage(const QString &msg);
@@ -185,6 +185,10 @@ public:
bool m_lastSearchForward; bool m_lastSearchForward;
QString m_lastInsertion; QString m_lastInsertion;
// extra data for '.'
QString m_dotCount;
QString m_dotCommand;
// history for '/' // history for '/'
QString lastSearchString() const; QString lastSearchString() const;
QStringList m_searchHistory; QStringList m_searchHistory;
@@ -272,14 +276,18 @@ void FakeVimHandler::Private::handleKey(int key, const QString &text)
handleExMode(key, text); handleExMode(key, text);
} }
void FakeVimHandler::Private::finishMovement() void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
{ {
if (m_submode == ChangeSubMode) { if (m_submode == ChangeSubMode) {
if (!dotCommand.isEmpty())
m_dotCommand = "c" + dotCommand;
m_registers[m_register] = m_tc.selectedText(); m_registers[m_register] = m_tc.selectedText();
m_tc.removeSelectedText(); m_tc.removeSelectedText();
m_mode = InsertMode; m_mode = InsertMode;
m_submode = NoSubMode; m_submode = NoSubMode;
} else if (m_submode == DeleteSubMode) { } else if (m_submode == DeleteSubMode) {
if (!dotCommand.isEmpty())
m_dotCommand = "d" + dotCommand;
m_registers[m_register] = m_tc.selectedText(); m_registers[m_register] = m_tc.selectedText();
m_tc.removeSelectedText(); m_tc.removeSelectedText();
m_submode = NoSubMode; m_submode = NoSubMode;
@@ -346,12 +354,12 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
m_tc.movePosition(StartOfLine, MoveAnchor); m_tc.movePosition(StartOfLine, MoveAnchor);
m_tc.movePosition(Down, KeepAnchor, count()); m_tc.movePosition(Down, KeepAnchor, count());
m_registers[m_register] = m_tc.selectedText(); m_registers[m_register] = m_tc.selectedText();
finishMovement(); finishMovement("c");
} else if (m_submode == DeleteSubMode && key == 'd') { } else if (m_submode == DeleteSubMode && key == 'd') {
m_tc.movePosition(StartOfLine, MoveAnchor); m_tc.movePosition(StartOfLine, MoveAnchor);
m_tc.movePosition(Down, KeepAnchor, count()); m_tc.movePosition(Down, KeepAnchor, count());
m_registers[m_register] = m_tc.selectedText(); m_registers[m_register] = m_tc.selectedText();
finishMovement(); finishMovement("d");
} else if (m_submode == ZSubMode) { } else if (m_submode == ZSubMode) {
if (key == Key_Return) { if (key == Key_Return) {
// cursor line to top of window, cursor on first non-blank // cursor line to top of window, cursor on first non-blank
@@ -365,7 +373,7 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
} else if (m_subsubmode == FtSubSubMode) { } else if (m_subsubmode == FtSubSubMode) {
handleFfTt(key); handleFfTt(key);
m_subsubmode = NoSubSubMode; m_subsubmode = NoSubSubMode;
finishMovement(); finishMovement(QString(QChar(m_subsubdata)) + QChar(key));
} else if (m_subsubmode == MarkSubSubMode) { } else if (m_subsubmode == MarkSubSubMode) {
m_marks[key] = m_tc.position(); m_marks[key] = m_tc.position();
m_subsubmode = NoSubSubMode; m_subsubmode = NoSubSubMode;
@@ -417,6 +425,11 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
} else if (key == '$' || key == Key_End) { } else if (key == '$' || key == Key_End) {
m_tc.movePosition(EndOfLine, KeepAnchor); m_tc.movePosition(EndOfLine, KeepAnchor);
finishMovement(); finishMovement();
} else if (key == '.') {
qDebug() << "REPEATING" << m_dotCommand;
for (int i = count(); --i >= 0; )
foreach (QChar c, m_dotCommand)
handleKey(c.unicode(), QString(c));
} else if (key == 'a') { } else if (key == 'a') {
m_mode = InsertMode; m_mode = InsertMode;
m_lastInsertion.clear(); m_lastInsertion.clear();
@@ -438,23 +451,21 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
m_tc.beginEditBlock(); m_tc.beginEditBlock();
} else if (key == 'C') { } else if (key == 'C') {
m_submode = ChangeSubMode; m_submode = ChangeSubMode;
m_tc.beginEditBlock(); //m_tc.beginEditBlock();
m_tc.movePosition(EndOfLine, KeepAnchor); m_tc.movePosition(EndOfLine, KeepAnchor);
finishMovement(); finishMovement();
} else if (key == 'd' && m_visualLineMode) {
leaveVisualLineMode();
int beginLine = lineForPosition(m_marks['<']);
int endLine = lineForPosition(m_marks['>']);
m_tc = selectRange(beginLine, endLine);
m_tc.removeSelectedText();
} else if (key == 'd') { } else if (key == 'd') {
if (m_visualLineMode) { if (atEol())
leaveVisualLineMode(); m_tc.movePosition(Left, MoveAnchor, 1);
int beginLine = lineForPosition(m_marks['<']); m_opcount = m_mvcount;
int endLine = lineForPosition(m_marks['>']); m_mvcount.clear();
m_tc = selectRange(beginLine, endLine); m_submode = DeleteSubMode;
m_tc.removeSelectedText();
} else {
if (atEol())
m_tc.movePosition(Left, MoveAnchor, 1);
m_opcount = m_mvcount;
m_mvcount.clear();
m_submode = DeleteSubMode;
}
} else if (key == 'D') { } else if (key == 'D') {
m_submode = DeleteSubMode; m_submode = DeleteSubMode;
m_tc.movePosition(Down, KeepAnchor, qMax(count() - 1, 0)); m_tc.movePosition(Down, KeepAnchor, qMax(count() - 1, 0));
@@ -490,7 +501,7 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
finishMovement(); finishMovement();
} else if (key == 'i') { } else if (key == 'i') {
m_mode = InsertMode; m_mode = InsertMode;
m_tc.beginEditBlock(); //m_tc.beginEditBlock();
m_lastInsertion.clear(); m_lastInsertion.clear();
} else if (key == 'I') { } else if (key == 'I') {
m_mode = InsertMode; m_mode = InsertMode;
@@ -499,7 +510,7 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
else else
moveToFirstNonBlankOnLine(); moveToFirstNonBlankOnLine();
m_tc.clearSelection(); m_tc.clearSelection();
m_tc.beginEditBlock(); //m_tc.beginEditBlock();
m_lastInsertion.clear(); m_lastInsertion.clear();
} else if (key == 'j' || key == Key_Down) { } else if (key == 'j' || key == Key_Down) {
m_tc.movePosition(Down, KeepAnchor, count()); m_tc.movePosition(Down, KeepAnchor, count());
@@ -568,9 +579,8 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
EDITOR(redo()); EDITOR(redo());
} else if (key == 's') { } else if (key == 's') {
m_submode = ChangeSubMode; m_submode = ChangeSubMode;
m_tc.beginEditBlock(); //m_tc.beginEditBlock();
m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist())); m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist()));
finishMovement();
} else if (key == 't' || key == 'T') { } else if (key == 't' || key == 'T') {
m_subsubmode = FtSubSubMode; m_subsubmode = FtSubSubMode;
m_subsubdata = key; m_subsubdata = key;
@@ -580,16 +590,16 @@ void FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
enterVisualLineMode(); enterVisualLineMode();
} else if (key == 'w') { } else if (key == 'w') {
moveToNextWord(false); moveToNextWord(false);
finishMovement(); finishMovement("w");
} else if (key == 'W') { } else if (key == 'W') {
moveToNextWord(true); moveToNextWord(true);
finishMovement(); finishMovement("W");
} else if (key == 'x') { // = "dl" } else if (key == 'x') { // = "dl"
if (atEol()) if (atEol())
m_tc.movePosition(Left, MoveAnchor, 1); m_tc.movePosition(Left, MoveAnchor, 1);
m_submode = DeleteSubMode; m_submode = DeleteSubMode;
m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist())); m_tc.movePosition(Right, KeepAnchor, qMin(count(), rightDist()));
finishMovement(); finishMovement("l");
} else if (key == 'X') { } else if (key == 'X') {
if (leftDist() > 0) { if (leftDist() > 0) {
m_tc.movePosition(Left, KeepAnchor, qMin(count(), leftDist())); m_tc.movePosition(Left, KeepAnchor, qMin(count(), leftDist()));