diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 8aa100071c51f54fbf45e8ea53eba09d280e698e..96d02733017ec660867d87617c137ca4863d4b82 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -125,15 +125,16 @@ enum Mode enum SubMode { NoSubMode, - RegisterSubMode, // used for " ChangeSubMode, // used for c DeleteSubMode, // used for d FilterSubMode, // used for ! + IndentSubMode, // used for = + RegisterSubMode, // used for " ReplaceSubMode, // used for R and r - YankSubMode, // used for y ShiftLeftSubMode, // used for < ShiftRightSubMode, // used for > - IndentSubMode, // used for = + WindowSubMode, // used for Ctrl-w + YankSubMode, // used for y ZSubMode, }; @@ -809,7 +810,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, { EventResult handled = EventHandled; - if (m_submode == RegisterSubMode) { + if (m_submode == WindowSubMode) { + emit q->windowCommandRequested(key); + m_submode = NoSubMode; + } else if (m_submode == RegisterSubMode) { m_register = key; m_submode = NoSubMode; } else if (m_submode == ChangeSubMode && key == 'c') { @@ -1326,6 +1330,8 @@ EventResult FakeVimHandler::Private::handleCommandMode(int key, int unmodified, m_moveType = MoveExclusive; } finishMovement("W"); + } else if (key == control('w')) { + m_submode = WindowSubMode; } else if (key == 'x' && m_visualMode == NoVisualMode) { // = "dl" m_moveType = MoveExclusive; if (atEndOfLine()) diff --git a/src/plugins/fakevim/fakevimhandler.h b/src/plugins/fakevim/fakevimhandler.h index 74ec43c97712e9bb41b4ac78fc4b6c6ac0269b63..acb0990b777f9c4c9e42f5d459e0eef065f402b8 100644 --- a/src/plugins/fakevim/fakevimhandler.h +++ b/src/plugins/fakevim/fakevimhandler.h @@ -72,6 +72,7 @@ signals: void moveToMatchingParenthesis(bool *moved, bool *forward, QTextCursor *cursor); void indentRegion(int *amount, int beginLine, int endLine, QChar typedChar); void completionRequested(); + void windowCommandRequested(int key); public: class Private; diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index f1bcda4c84b64a75c04f064247c050cb8c1e6100..7f4e3eeada78a80f6ab345ef21e788dbda7be304 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -231,6 +231,7 @@ private slots: void setUseFakeVim(const QVariant &value); void quitFakeVim(); void triggerCompletions(); + void windowCommand(int key); void showSettingsDialog(); void showCommandBuffer(const QString &contents); @@ -309,6 +310,46 @@ void FakeVimPluginPrivate::showSettingsDialog() Core::ICore::instance()->showOptionsDialog("FakeVim", "General"); } +void FakeVimPluginPrivate::windowCommand(int key) +{ + #define control(n) (256 + n) + QString code; + switch (key) { + case 'c': case 'C': case control('c'): + code = Core::Constants::CLOSE; + break; + case 'n': case 'N': case control('n'): + code = Core::Constants::GOTONEXT; + break; + case 'o': case 'O': case control('o'): + code = Core::Constants::REMOVE_ALL_SPLITS; + code = Core::Constants::REMOVE_CURRENT_SPLIT; + break; + case 'p': case 'P': case control('p'): + code = Core::Constants::GOTOPREV; + break; + case 's': case 'S': case control('s'): + code = Core::Constants::SPLIT; + break; + case 'w': case 'W': case control('w'): + code = Core::Constants::GOTO_OTHER_SPLIT; + break; + } + #undef control + qDebug() << "RUNNING WINDOW COMMAND: " << key << code; + if (code.isEmpty()) { + qDebug() << "UNKNOWN WINDOWS COMMAND: " << key; + return; + } + Core::ActionManager *am = Core::ICore::instance()->actionManager(); + QTC_ASSERT(am, return); + Core::Command *cmd = am->command(code); + QTC_ASSERT(cmd, return); + QAction *action = cmd->action(); + QTC_ASSERT(action, return); + action->trigger(); +} + void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor) { if (!editor) @@ -344,6 +385,8 @@ void FakeVimPluginPrivate::editorOpened(Core::IEditor *editor) this, SLOT(indentRegion(int*,int,int,QChar))); connect(handler, SIGNAL(completionRequested()), this, SLOT(triggerCompletions())); + connect(handler, SIGNAL(windowCommandRequested(int)), + this, SLOT(windowCommand(int))); handler->setCurrentFileName(editor->file()->fileName()); handler->installEventFilter();