diff --git a/src/plugins/fakevim/handler.cpp b/src/plugins/fakevim/handler.cpp index 354401eb690775fcecf59950cbd367b2c14a694a..af67103e70bd76f918ad516a57fb1651728f6dba 100644 --- a/src/plugins/fakevim/handler.cpp +++ b/src/plugins/fakevim/handler.cpp @@ -189,7 +189,8 @@ private: public: void enterInsertMode(); void enterCommandMode(); - void showMessage(const QString &msg); + void showRedMessage(const QString &msg); + void showBlackMessage(const QString &msg); void updateMiniBuffer(); void updateSelection(); void quit(); @@ -378,8 +379,10 @@ void FakeVimHandler::Private::updateSelection() QTextEdit::ExtraSelection sel; sel.cursor = m_tc; sel.format = m_tc.blockCharFormat(); - sel.format.setFontWeight(QFont::Bold); - sel.format.setFontUnderline(true); + //sel.format.setFontWeight(QFont::Bold); + //sel.format.setFontUnderline(true); + sel.format.setForeground(Qt::white); + sel.format.setBackground(Qt::black); int cursorPos = m_tc.position(); int anchorPos = m_marks['<']; //qDebug() << "POS: " << cursorPos << " ANCHOR: " << anchorPos; @@ -451,7 +454,7 @@ void FakeVimHandler::Private::updateMiniBuffer() } } if (!msg.isEmpty() && m_mode != CommandMode) - msg += '|'; // FIXME: Use a real "cursor" + msg += QChar(10073); // '|'; // FIXME: Use a real "cursor" } emit q->commandBufferChanged(msg); @@ -470,13 +473,20 @@ void FakeVimHandler::Private::updateMiniBuffer() emit q->statusDataChanged(status); } -void FakeVimHandler::Private::showMessage(const QString &msg) +void FakeVimHandler::Private::showRedMessage(const QString &msg) { //qDebug() << "MSG: " << msg; m_currentMessage = msg; updateMiniBuffer(); } +void FakeVimHandler::Private::showBlackMessage(const QString &msg) +{ + //qDebug() << "MSG: " << msg; + m_commandBuffer = msg; + updateMiniBuffer(); +} + bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) { Q_UNUSED(text) @@ -519,7 +529,7 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text) moveToFirstNonBlankOnLine(); finishMovement(); } else { - showMessage(tr("E20: Mark '%1' not set").arg(text)); + showRedMessage(tr("E20: Mark '%1' not set").arg(text)); } m_subsubmode = NoSubSubMode; } else if (key >= '0' && key <= '9') { @@ -872,26 +882,22 @@ bool FakeVimHandler::Private::handleMiniBufferModes(int key, const QString &text // takes only matching entires in the history into account. if (m_searchHistoryIndex > 0) { --m_searchHistoryIndex; - m_commandBuffer = m_searchHistory.at(m_searchHistoryIndex); - updateMiniBuffer(); + showBlackMessage(m_searchHistory.at(m_searchHistoryIndex)); } } else if (key == Key_Up && m_mode == ExMode) { if (m_commandHistoryIndex > 0) { --m_commandHistoryIndex; - m_commandBuffer = m_commandHistory.at(m_commandHistoryIndex); - updateMiniBuffer(); + showBlackMessage(m_commandHistory.at(m_commandHistoryIndex)); } } else if (key == Key_Down && isSearchMode()) { if (m_searchHistoryIndex < m_searchHistory.size() - 1) { ++m_searchHistoryIndex; - m_commandBuffer = m_searchHistory.at(m_searchHistoryIndex); - updateMiniBuffer(); + showBlackMessage(m_searchHistory.at(m_searchHistoryIndex)); } } else if (key == Key_Down && m_mode == ExMode) { if (m_commandHistoryIndex < m_commandHistory.size() - 1) { ++m_commandHistoryIndex; - m_commandBuffer = m_commandHistory.at(m_commandHistoryIndex); - updateMiniBuffer(); + showBlackMessage(m_commandHistory.at(m_commandHistoryIndex)); } } else if (key == Key_Tab) { m_commandBuffer += QChar(9); @@ -927,7 +933,7 @@ int FakeVimHandler::Private::readLineCode(QString &cmd) int pos = m_marks.value(cmd.at(0).unicode(), -1); //qDebug() << " MARK: " << cmd.at(0) << pos << lineForPosition(pos); if (pos == -1) { - showMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0))); + showRedMessage(tr("E20: Mark '%1' not set").arg(cmd.at(0))); return -1; } cmd = cmd.mid(1); @@ -991,7 +997,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) if (cmd.isEmpty()) { m_tc.setPosition(positionForLine(beginLine)); - showMessage(QString()); + showBlackMessage(QString()); } else if (cmd == "q!" || cmd == "q") { // :q quit(); } else if (reDelete.indexIn(cmd) != -1) { // :d @@ -1019,7 +1025,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) QFile file(fileName); bool exists = file.exists(); if (exists && !forced && !noArgs) { - showMessage(tr("File '%1' exists (add ! to override)").arg(fileName)); + showRedMessage(tr("File '%1' exists (add ! to override)").arg(fileName)); } else if (file.open(QIODevice::ReadWrite)) { QTextCursor tc = selectRange(beginLine, endLine); qDebug() << "ANCHOR: " << tc.position() << tc.anchor() @@ -1028,12 +1034,11 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) file.close(); file.open(QIODevice::ReadOnly); QByteArray ba = file.readAll(); - m_commandBuffer = QString("\"%1\" %2 %3L, %4C written") + showBlackMessage(tr("\"%1\" %2 %3L, %4C written") .arg(fileName).arg(exists ? " " : " [New] ") - .arg(ba.count('\n')).arg(ba.size()); - updateMiniBuffer(); + .arg(ba.count('\n')).arg(ba.size())); } else { - showMessage(tr("Cannot open file '%1' for reading").arg(fileName)); + showRedMessage(tr("Cannot open file '%1' for reading").arg(fileName)); } } else if (cmd.startsWith("r ")) { // :r m_currentFileName = cmd.mid(2); @@ -1042,10 +1047,9 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) QTextStream ts(&file); QString data = ts.readAll(); EDITOR(setPlainText(data)); - m_commandBuffer = QString("\"%1\" %2L, %3C") - .arg(m_currentFileName).arg(data.count('\n')).arg(data.size()); enterCommandMode(); - updateMiniBuffer(); + showBlackMessage(tr("\"%1\" %2L, %3C") + .arg(m_currentFileName).arg(data.count('\n')).arg(data.size())); } else if (cmd.startsWith("!")) { if (beginLine == -1) beginLine = cursorLineInDocument(); @@ -1072,15 +1076,14 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0) op.m_to = result; recordOperation(op); - m_commandBuffer = tr("%1 lines filtered").arg(text.count('\n')); enterCommandMode(); - updateMiniBuffer(); + showBlackMessage(tr("%1 lines filtered").arg(text.count('\n'))); } else if (cmd == "red" || cmd == "redo") { // :redo redo(); enterCommandMode(); updateMiniBuffer(); } else { - showMessage("E492: Not an editor command: " + cmd0 + "(" + cmd + ")"); + showRedMessage("E492: Not an editor command: " + cmd0); } } @@ -1110,9 +1113,9 @@ void FakeVimHandler::Private::search(const QString &needle, bool forward) // the qMax seems to be needed for QPlainTextEdit only m_tc.movePosition(Left, MoveAnchor, qMax(1, needle.size() - 1)); if (forward) - showMessage("search hit BOTTOM, continuing at TOP"); + showRedMessage("search hit BOTTOM, continuing at TOP"); else - showMessage("search hit TOP, continuing at BOTTOM"); + showRedMessage("search hit TOP, continuing at BOTTOM"); return; } @@ -1324,24 +1327,26 @@ void FakeVimHandler::Private::undo() #if 0 EDITOR(undo()); #else - if (m_undoStack.isEmpty()) - return; - EditOperation op = m_undoStack.pop(); - //qDebug() << "UNDO " << op; - if (op.m_itemCount > 0) { - for (int i = op.m_itemCount; --i >= 0; ) - undo(); + if (m_undoStack.isEmpty()) { + showBlackMessage(tr("Already at oldest change")); } else { - m_tc.setPosition(op.m_position, MoveAnchor); - if (!op.m_to.isEmpty()) { - m_tc.setPosition(op.m_position + op.m_to.size(), KeepAnchor); - m_tc.deleteChar(); + EditOperation op = m_undoStack.pop(); + //qDebug() << "UNDO " << op; + if (op.m_itemCount > 0) { + for (int i = op.m_itemCount; --i >= 0; ) + undo(); + } else { + m_tc.setPosition(op.m_position, MoveAnchor); + if (!op.m_to.isEmpty()) { + m_tc.setPosition(op.m_position + op.m_to.size(), KeepAnchor); + m_tc.deleteChar(); + } + if (!op.m_from.isEmpty()) + m_tc.insertText(op.m_from); + m_tc.setPosition(op.m_position, MoveAnchor); } - if (!op.m_from.isEmpty()) - m_tc.insertText(op.m_from); - m_tc.setPosition(op.m_position, MoveAnchor); + m_redoStack.push(op); } - m_redoStack.push(op); #endif } @@ -1350,24 +1355,26 @@ void FakeVimHandler::Private::redo() #if 0 EDITOR(redo()); #else - if (m_redoStack.isEmpty()) - return; - EditOperation op = m_redoStack.pop(); - //qDebug() << "REDO " << op; - if (op.m_itemCount > 0) { - for (int i = op.m_itemCount; --i >= 0; ) - redo(); + if (m_redoStack.isEmpty()) { + showBlackMessage(tr("Already at newest change")); } else { - m_tc.setPosition(op.m_position, MoveAnchor); - if (!op.m_from.isEmpty()) { - m_tc.setPosition(op.m_position + op.m_from.size(), KeepAnchor); - m_tc.deleteChar(); + EditOperation op = m_redoStack.pop(); + //qDebug() << "REDO " << op; + if (op.m_itemCount > 0) { + for (int i = op.m_itemCount; --i >= 0; ) + redo(); + } else { + m_tc.setPosition(op.m_position, MoveAnchor); + if (!op.m_from.isEmpty()) { + m_tc.setPosition(op.m_position + op.m_from.size(), KeepAnchor); + m_tc.deleteChar(); + } + if (!op.m_to.isEmpty()) + m_tc.insertText(op.m_to); + m_tc.setPosition(op.m_position, MoveAnchor); } - if (!op.m_to.isEmpty()) - m_tc.insertText(op.m_to); - m_tc.setPosition(op.m_position, MoveAnchor); + m_undoStack.push(op); } - m_undoStack.push(op); #endif } @@ -1425,7 +1432,7 @@ void FakeVimHandler::Private::enterCommandMode() void FakeVimHandler::Private::quit() { - showMessage(QString()); + showBlackMessage(QString()); EDITOR(setOverwriteMode(false)); q->quitRequested(editor()); } @@ -1464,13 +1471,13 @@ void FakeVimHandler::addWidget(QWidget *widget) //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); ed->setLineWrapMode(QPlainTextEdit::NoWrap); } - d->showMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit"); + d->showBlackMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit"); d->updateMiniBuffer(); } void FakeVimHandler::removeWidget(QWidget *widget) { - d->showMessage(QString()); + d->showBlackMessage(QString()); d->updateMiniBuffer(); widget->removeEventFilter(this); }