[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
This commit is contained in:
Konstantin Hudyakov
2024-02-21 15:11:53 +02:00
committed by intellij-monorepo-bot
parent 535464716e
commit a34970eb76
6 changed files with 45 additions and 16 deletions

View File

@@ -143,16 +143,6 @@
<keyboard-shortcut first-keystroke="control C" keymap="Mac OS X" replace-all="true"/>
<keyboard-shortcut first-keystroke="control C" keymap="Mac OS X 10.5+" replace-all="true"/>
</action>
<action id="Terminal.MoveCaretToLineStart" class="org.jetbrains.plugins.terminal.action.TerminalMoveCaretToLineStartAction">
<keyboard-shortcut first-keystroke="control A" keymap="$default"/>
<keyboard-shortcut first-keystroke="control A" keymap="Mac OS X" replace-all="true"/>
<keyboard-shortcut first-keystroke="control A" keymap="Mac OS X 10.5+" replace-all="true"/>
</action>
<action id="Terminal.MoveCaretToLineEnd" class="org.jetbrains.plugins.terminal.action.TerminalMoveCaretToLineEndAction">
<keyboard-shortcut first-keystroke="control E" keymap="$default"/>
<keyboard-shortcut first-keystroke="control E" keymap="Mac OS X" replace-all="true"/>
<keyboard-shortcut first-keystroke="control E" keymap="Mac OS X 10.5+" replace-all="true"/>
</action>
<action id="Terminal.DeletePreviousWord" class="org.jetbrains.plugins.terminal.action.TerminalDeletePreviousWordAction">
<keyboard-shortcut first-keystroke="control W" keymap="$default"/>
<keyboard-shortcut first-keystroke="control W" keymap="Mac OS X" replace-all="true"/>

View File

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

View File

@@ -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
ActionRemoteBehaviorSpecification.Disabled {
init {
shortcutSet = TerminalUiUtils.createSingleShortcutSet(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK)
}
}

View File

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

View File

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

View File

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