diff --git a/src/plugins/terminal/terminalcommands.cpp b/src/plugins/terminal/terminalcommands.cpp index 28b8583c93a..2bfb9ce5199 100644 --- a/src/plugins/terminal/terminalcommands.cpp +++ b/src/plugins/terminal/terminalcommands.cpp @@ -18,6 +18,8 @@ namespace Terminal { constexpr char COPY[] = "Terminal.Copy"; constexpr char PASTE[] = "Terminal.Paste"; constexpr char CLEARSELECTION[] = "Terminal.ClearSelection"; +constexpr char MOVECURSORWORDLEFT[] = "Terminal.MoveCursorWordLeft"; +constexpr char MOVECURSORWORDRIGHT[] = "Terminal.MoveCursorWordRight"; constexpr char NEWTERMINAL[] = "Terminal.NewTerminal"; constexpr char CLOSETERMINAL[] = "Terminal.CloseTerminal"; @@ -60,6 +62,16 @@ void TerminalCommands::initWidgetActions(const Core::Context &context) CLEARSELECTION); command->setDefaultKeySequence(QKeySequence("Esc")); m_commands.push_back(command); + + command = ActionManager::instance()->registerAction(&m_widgetActions.moveCursorWordLeft, + MOVECURSORWORDLEFT); + command->setDefaultKeySequence(QKeySequence("Alt+Left")); + m_commands.push_back(command); + + command = ActionManager::instance()->registerAction(&m_widgetActions.moveCursorWordRight, + MOVECURSORWORDRIGHT); + command->setDefaultKeySequence(QKeySequence("Alt+Right")); + m_commands.push_back(command); } void TerminalCommands::initPaneActions(const Core::Context &context) @@ -113,12 +125,19 @@ void TerminalCommands::initGlobalCommands() bool TerminalCommands::triggerAction(QKeyEvent *event) { + QKeyCombination combination = event->keyCombination(); + + // On macOS, the arrow keys include the KeypadModifier, which we don't want. + if (HostOsInfo::isMacHost() && combination.keyboardModifiers() & Qt::KeypadModifier) + combination = QKeyCombination(combination.keyboardModifiers() & ~Qt::KeypadModifier, + combination.key()); + for (const auto &command : TerminalCommands::instance().m_commands) { if (!command->action()->isEnabled()) continue; for (const auto &shortcut : command->keySequences()) { - const auto result = shortcut.matches(QKeySequence(event->keyCombination())); + const auto result = shortcut.matches(QKeySequence(combination)); if (result == QKeySequence::ExactMatch) { command->action()->trigger(); return true; diff --git a/src/plugins/terminal/terminalcommands.h b/src/plugins/terminal/terminalcommands.h index 795e5188acd..5257913fba7 100644 --- a/src/plugins/terminal/terminalcommands.h +++ b/src/plugins/terminal/terminalcommands.h @@ -21,6 +21,8 @@ struct WidgetActions QAction paste{Tr::tr("Paste")}; QAction clearSelection{Tr::tr("Clear Selection")}; QAction clearTerminal{Tr::tr("Clear Terminal")}; + QAction moveCursorWordLeft{Tr::tr("Move Cursor Word Left")}; + QAction moveCursorWordRight{Tr::tr("Move Cursor Word Right")}; }; struct PaneActions diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 50f4ac0c1c6..0e133b73472 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -234,6 +234,8 @@ void TerminalWidget::setupActions() connect(&a.paste, &QAction::triggered, this, ifHasFocus(&TerminalWidget::pasteFromClipboard)); connect(&a.clearSelection, &QAction::triggered, this, ifHasFocus(&TerminalWidget::clearSelection)); connect(&a.clearTerminal, &QAction::triggered, this, ifHasFocus(&TerminalWidget::clearContents)); + connect(&a.moveCursorWordLeft, &QAction::triggered, this, ifHasFocus(&TerminalWidget::moveCursorWordLeft)); + connect(&a.moveCursorWordRight, &QAction::triggered, this, ifHasFocus(&TerminalWidget::moveCursorWordRight)); // clang-format on } @@ -402,6 +404,16 @@ void TerminalWidget::zoomOut() setFont(m_font); } +void TerminalWidget::moveCursorWordLeft() +{ + writeToPty("\x1b\x62"); +} + +void TerminalWidget::moveCursorWordRight() +{ + writeToPty("\x1b\x66"); +} + void TerminalWidget::clearContents() { m_surface->clearAll(); diff --git a/src/plugins/terminal/terminalwidget.h b/src/plugins/terminal/terminalwidget.h index 997abda13dd..95f80d687ce 100644 --- a/src/plugins/terminal/terminalwidget.h +++ b/src/plugins/terminal/terminalwidget.h @@ -37,6 +37,9 @@ public: void zoomIn(); void zoomOut(); + void moveCursorWordLeft(); + void moveCursorWordRight(); + void clearContents(); struct Selection