Terminal: Support Alt+Left / Alt+Right cursor move

Fixes: QTCREATORBUG-28941
Change-Id: I7c8e012733f6dcb2851e8e1b840d53317e413cd8
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Marcus Tillmanns
2023-03-23 14:51:24 +01:00
parent 84155e8354
commit e045c643c3
4 changed files with 37 additions and 1 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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();

View File

@@ -37,6 +37,9 @@ public:
void zoomIn();
void zoomOut();
void moveCursorWordLeft();
void moveCursorWordRight();
void clearContents();
struct Selection