diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index e641a62c4495162d9460729eae76500b8483c883..29e8412a451ce4ba173a69aff9b20cdcb92ac3e6 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -302,6 +302,11 @@ ExCommand::ExCommand(const QString &c, const QString &a, const Range &r) : cmd(c), hasBang(false), args(a), range(r), count(1) {} +bool ExCommand::matches(const QString &min, const QString &full) const +{ + return cmd.startsWith(min) && full.startsWith(cmd); +} + QDebug operator<<(QDebug ts, const ExCommand &cmd) { return ts << cmd.cmd << ' ' << cmd.args << ' ' << cmd.range; @@ -3133,8 +3138,8 @@ bool FakeVimHandler::Private::handleExMapCommand(const ExCommand &cmd0) // :map bool FakeVimHandler::Private::handleExHistoryCommand(const ExCommand &cmd) { - // :history - if (cmd.cmd != "his" && cmd.cmd != "history") + // :his[tory] + if (!cmd.matches("his", "history")) return false; if (cmd.args.isEmpty()) { @@ -3155,9 +3160,8 @@ bool FakeVimHandler::Private::handleExHistoryCommand(const ExCommand &cmd) bool FakeVimHandler::Private::handleExRegisterCommand(const ExCommand &cmd) { - // :reg and :di[splay] - if (cmd.cmd != "reg" && cmd.cmd != "registers" - && cmd.cmd != "di" && cmd.cmd != "display") + // :reg[isters] and :di[splay] + if (!cmd.matches("reg", "registers") && !cmd.matches("di", "display")) return false; QByteArray regs = cmd.args.toLatin1(); @@ -3183,8 +3187,8 @@ bool FakeVimHandler::Private::handleExRegisterCommand(const ExCommand &cmd) bool FakeVimHandler::Private::handleExSetCommand(const ExCommand &cmd) { - // :set - if (cmd.cmd != "se" && cmd.cmd != "set") + // :se[t] + if (!cmd.matches("se", "set")) return false; showBlackMessage(QString()); @@ -3224,8 +3228,8 @@ bool FakeVimHandler::Private::handleExSetCommand(const ExCommand &cmd) bool FakeVimHandler::Private::handleExNormalCommand(const ExCommand &cmd) { - // :normal - if (cmd.cmd != "norm" && cmd.cmd != "normal") + // :norm[al] + if (!cmd.matches("norm", "normal")) return false; //qDebug() << "REPLAY NORMAL: " << quoteUnprintable(reNormal.cap(3)); replay(cmd.args, 1); @@ -3234,8 +3238,8 @@ bool FakeVimHandler::Private::handleExNormalCommand(const ExCommand &cmd) bool FakeVimHandler::Private::handleExDeleteCommand(const ExCommand &cmd) { - // :delete - if (cmd.cmd != "d" && cmd.cmd != "delete") + // :d[elete] + if (!cmd.matches("d", "delete")) return false; setCurrentRange(cmd.range); @@ -3314,8 +3318,8 @@ bool FakeVimHandler::Private::handleExWriteCommand(const ExCommand &cmd) bool FakeVimHandler::Private::handleExReadCommand(const ExCommand &cmd) { - // :read - if (cmd.cmd != "r" && cmd.cmd != "read") + // :r[ead] + if (!cmd.matches("r", "read")) return false; beginEditBlock(); diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h index 6db23a2d46047f3d57fafc42db03e2d5778e7d21..1d2a0a8e25283b520ef9a909fb5ff79dd9c7771e 100644 --- a/src/plugins/fakevim/fakevimhandler.h +++ b/src/plugins/fakevim/fakevimhandler.h @@ -64,6 +64,8 @@ struct ExCommand ExCommand(const QString &cmd, const QString &args = QString(), const Range &range = Range()); + bool matches(const QString &min, const QString &full) const; + QString cmd; bool hasBang; QString args; diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 10a7844d148c6754b04656992b79d8a9d7e16ff4..b57294c9f1237c6cc9c3a3abbed6fbacdcacc63b 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -910,7 +910,8 @@ void FakeVimPluginPrivate::handleExCommand(bool *handled, const ExCommand &cmd) QTC_ASSERT(editorManager(), return); *handled = true; - if (cmd.cmd == "w" || cmd.cmd == "write") { + if (cmd.matches("w", "write")) { + // :w[rite] Core::IEditor *editor = m_editorToHandler.key(handler); const QString fileName = handler->currentFileName(); if (editor && editor->file()->fileName() == fileName) { @@ -929,8 +930,8 @@ void FakeVimPluginPrivate::handleExCommand(bool *handled, const ExCommand &cmd) } else { handler->showRedMessage(tr("File not saved")); } - } else if (cmd.cmd == "wa" || cmd.cmd == "wall") { - // :wa + } else if (cmd.matches("wa", "wall")) { + // :w[all] FileManager *fm = ICore::instance()->fileManager(); QList<IFile *> toSave = fm->modifiedFiles(); QList<IFile *> failed = fm->saveModifiedFilesSilently(toSave); @@ -938,24 +939,24 @@ void FakeVimPluginPrivate::handleExCommand(bool *handled, const ExCommand &cmd) handler->showBlackMessage(tr("Saving succeeded")); else handler->showRedMessage(tr("%n files not saved", 0, failed.size())); - } else if (cmd.cmd == "q" || cmd.cmd == "quit") { + } else if (cmd.matches("q", "quit")) { // :q[uit] emit delayedQuitRequested(cmd.hasBang, m_editorToHandler.key(handler)); - } else if (cmd.cmd == "qa" || cmd.cmd == "qall") { - // :qa + } else if (cmd.matches("qa", "qall")) { + // :qa[ll] emit delayedQuitAllRequested(cmd.hasBang); - } else if (cmd.cmd == "sp" || cmd.cmd == "split") { + } else if (cmd.matches("sp", "split")) { // :sp[lit] triggerAction(Core::Constants::SPLIT); - } else if (cmd.cmd == "vs" || cmd.cmd == "vsplit") { + } else if (cmd.matches("vs", "vsplit")) { // :vs[plit] triggerAction(Core::Constants::SPLIT_SIDE_BY_SIDE); - } else if (cmd.cmd == "mak" || cmd.cmd == "make") { + } else if (cmd.matches("mak", "make")) { // :mak[e][!] [arguments] triggerAction(ProjectExplorer::Constants::BUILD); - } else if (cmd.cmd == "se" || cmd.cmd == "set") { + } else if (cmd.matches("se", "set")) { if (cmd.args.isEmpty()) { - // :set + // :se[t] showSettingsDialog(); } else if (cmd.args == "ic" || cmd.args == "ignorecase") { // :set noic @@ -966,21 +967,20 @@ void FakeVimPluginPrivate::handleExCommand(bool *handled, const ExCommand &cmd) setActionChecked(Find::Constants::CASE_SENSITIVE, true); *handled = false; // Let the handler see it as well. } - } else if (cmd.cmd == "n" || cmd.cmd == "next") { + } else if (cmd.matches("n", "next")) { // :n[ext] switchToFile(currentFile() + cmd.count); - } else if (cmd.cmd == "prev" || cmd.cmd == "previous" - || cmd.cmd == "N" || cmd.cmd == "Next") { - // :prev[ious] + } else if (cmd.matches("prev", "previous") || cmd.matches("N", "Next")) { + // :prev[ious], :N[ext] switchToFile(currentFile() - cmd.count); - } else if (cmd.cmd == "bn" || cmd.cmd == "bnext") { + } else if (cmd.matches("bn", "bnext")) { // :bn[ext] switchToFile(currentFile() + cmd.count); - } else if (cmd.cmd == "bp" || cmd.cmd == "bprevious" - || cmd.cmd == "bN" || cmd.cmd == "bNext") { - // :bp[revious] + } else if (cmd.matches("bp", "bprevious") || cmd.matches("bN", "bNext")) { + // :bp[revious], :bN[ext] switchToFile(currentFile() - cmd.count); - } else if (cmd.cmd == "on" || cmd.cmd == "only") { + } else if (cmd.matches("on", "only")) { + // :on[ly] //triggerAction(Core::Constants::REMOVE_ALL_SPLITS); triggerAction(Core::Constants::REMOVE_CURRENT_SPLIT); } else {