From a34970eb76124d108578600961bc4af0c4e5e40b Mon Sep 17 00:00:00 2001 From: Konstantin Hudyakov Date: Wed, 21 Feb 2024 15:11:53 +0200 Subject: [PATCH] [terminal] IDEA-346817 Do not add custom caret move shortcuts in PowerShell In Bash and Zsh, Ctrl+A and Ctrl+E shortcuts are moving the caret to the start or end of the line. But in PowerShell, Home and End shortcuts are doing that. And Ctrl+A is selecting the text instead. Also move custom shell shortcuts declaration to a single place. GitOrigin-RevId: 35fb6d75b46117770599e40f45949b50c7de067c --- .../terminal/resources/META-INF/plugin.xml | 10 --------- .../action/TerminalInterruptCommandAction.kt | 5 ++--- .../action/TerminalMoveCaretActions.kt | 15 +++++++++++-- .../plugins/terminal/exp/BlockTerminalView.kt | 22 +++++++++++++++++++ .../terminal/exp/TerminalOutputView.kt | 1 - .../plugins/terminal/exp/TerminalUiUtils.kt | 8 +++++++ 6 files changed, 45 insertions(+), 16 deletions(-) diff --git a/plugins/terminal/resources/META-INF/plugin.xml b/plugins/terminal/resources/META-INF/plugin.xml index bc3964175494..76be831ca3d8 100644 --- a/plugins/terminal/resources/META-INF/plugin.xml +++ b/plugins/terminal/resources/META-INF/plugin.xml @@ -143,16 +143,6 @@ - - - - - - - - - - diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalInterruptCommandAction.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalInterruptCommandAction.kt index e5abc1c44ef3..4426e7ffab73 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalInterruptCommandAction.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalInterruptCommandAction.kt @@ -12,15 +12,14 @@ import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.isAlternateBu import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.isOutputEditor import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.selectionController import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.terminalSession +import org.jetbrains.plugins.terminal.exp.TerminalUiUtils import java.awt.event.InputEvent import java.awt.event.KeyEvent -import javax.swing.KeyStroke class TerminalInterruptCommandAction : DumbAwareAction(TerminalBundle.message("action.Terminal.InterruptCommand.text")), ActionRemoteBehaviorSpecification.Disabled { init { - val keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK) - shortcutSet = CustomShortcutSet(keyStroke) + shortcutSet = TerminalUiUtils.createSingleShortcutSet(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK) } override fun actionPerformed(e: AnActionEvent) { diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalMoveCaretActions.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalMoveCaretActions.kt index a22819817b15..ccc4d5c49efe 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalMoveCaretActions.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalMoveCaretActions.kt @@ -7,6 +7,9 @@ import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.editor.Caret import com.intellij.openapi.editor.Editor import org.jetbrains.plugins.terminal.exp.TerminalPromotedEditorAction +import org.jetbrains.plugins.terminal.exp.TerminalUiUtils +import java.awt.event.InputEvent +import java.awt.event.KeyEvent private class TerminalMoveCaretActionHandler(private val moveToStart: Boolean) : TerminalPromptEditorActionHandler() { override fun executeAction(editor: Editor, caret: Caret?, dataContext: DataContext) { @@ -23,7 +26,15 @@ private class TerminalMoveCaretActionHandler(private val moveToStart: Boolean) : } class TerminalMoveCaretToLineStartAction : TerminalPromotedEditorAction(TerminalMoveCaretActionHandler(moveToStart = true)), - ActionRemoteBehaviorSpecification.Disabled + ActionRemoteBehaviorSpecification.Disabled { + init { + shortcutSet = TerminalUiUtils.createSingleShortcutSet(KeyEvent.VK_A, InputEvent.CTRL_DOWN_MASK) + } +} class TerminalMoveCaretToLineEndAction : TerminalPromotedEditorAction(TerminalMoveCaretActionHandler(moveToStart = false)), - ActionRemoteBehaviorSpecification.Disabled \ No newline at end of file + ActionRemoteBehaviorSpecification.Disabled { + init { + shortcutSet = TerminalUiUtils.createSingleShortcutSet(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK) + } +} \ No newline at end of file diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/BlockTerminalView.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/BlockTerminalView.kt index 354562bfefcf..4c3f08ba60ae 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/BlockTerminalView.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/BlockTerminalView.kt @@ -21,8 +21,12 @@ import com.intellij.util.ui.JBInsets import com.jediterm.core.util.TermSize import com.jediterm.terminal.RequestOrigin import com.jediterm.terminal.TtyConnector +import org.jetbrains.plugins.terminal.action.TerminalInterruptCommandAction +import org.jetbrains.plugins.terminal.action.TerminalMoveCaretToLineEndAction +import org.jetbrains.plugins.terminal.action.TerminalMoveCaretToLineStartAction import org.jetbrains.plugins.terminal.exp.BlockTerminalController.BlockTerminalControllerListener import org.jetbrains.plugins.terminal.exp.TerminalPromptController.PromptStateListener +import org.jetbrains.plugins.terminal.util.ShellType import java.awt.Dimension import java.awt.Rectangle import java.awt.event.* @@ -128,6 +132,8 @@ class BlockTerminalView( installPromptAndOutput() + installActions() + focusModel.addListener(object: TerminalFocusModel.TerminalFocusListener { override fun activeStateChanged(isActive: Boolean) { if (isActive) { @@ -202,6 +208,22 @@ class BlockTerminalView( }) } + // todo: Would be great to have a separate lists of actions for each shell + // in something like TerminalShellSupport, to get them from the method instead of using if's. + private fun installActions() { + TerminalInterruptCommandAction().registerCustomShortcutSet(component, null) + if (session.shellIntegration.shellType != ShellType.POWERSHELL) { + // Do not add custom actions for moving the caret in PowerShell because Home and End shortcuts are used there. + // But Home and End are already handled by default editor action implementations. + listOf( + TerminalMoveCaretToLineStartAction(), + TerminalMoveCaretToLineEndAction() + ).forEach { + it.registerCustomShortcutSet(component, null) + } + } + } + override fun startCommandExecution(command: String) { controller.startCommandExecution(command) } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalOutputView.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalOutputView.kt index 8c2a98945769..a946cf687406 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalOutputView.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalOutputView.kt @@ -70,7 +70,6 @@ class TerminalOutputView( val editor = TerminalUiUtils.createOutputEditor(document, project, settings) editor.settings.isUseSoftWraps = true stickScrollBarToBottom(editor.scrollPane.verticalScrollBar) - TerminalInterruptCommandAction().registerCustomShortcutSet(editor.contentComponent, null) return editor } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalUiUtils.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalUiUtils.kt index 48e6cdd474b3..66a7ed13da01 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalUiUtils.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/TerminalUiUtils.kt @@ -7,8 +7,10 @@ import com.intellij.execution.impl.EditorHyperlinkSupport import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.ActionGroup import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.CustomShortcutSet import com.intellij.openapi.actionSystem.DefaultActionGroup import com.intellij.openapi.actionSystem.Separator +import com.intellij.openapi.actionSystem.ShortcutSet import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState import com.intellij.openapi.diagnostic.logger @@ -47,6 +49,7 @@ import java.awt.event.ComponentAdapter import java.awt.event.ComponentEvent import java.util.concurrent.CompletableFuture import javax.swing.JScrollPane +import javax.swing.KeyStroke import kotlin.math.max object TerminalUiUtils { @@ -106,6 +109,11 @@ object TerminalUiUtils { }) } + fun createSingleShortcutSet(keyCode: Int, modifiers: Int): ShortcutSet { + val keyStroke = KeyStroke.getKeyStroke(keyCode, modifiers) + return CustomShortcutSet(keyStroke) + } + fun calculateTerminalSize(componentSize: Dimension, charSize: Dimension): TermSize { val width = componentSize.width / charSize.width val height = componentSize.height / charSize.height