From e0bd7778dfebde88265d4e8bd7c2fb5f2941f268 Mon Sep 17 00:00:00 2001 From: chylex <contact@chylex.com> Date: Thu, 14 Oct 2021 03:56:44 +0200 Subject: [PATCH] Work around IdeaVIM stealing keys when renaming elements --- .idea/runConfigurations/Plugin___IdeaVIM.xml | 26 +++++++++++++++++++ build.gradle.kts | 4 +++ .../intellij/keyboardmaster/PluginStartup.kt | 24 +++++++++++++++++ .../CodeCompletionPopupKeyHandler.kt | 12 ++++++++- src/main/resources/META-INF/plugin.xml | 3 +-- 5 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 .idea/runConfigurations/Plugin___IdeaVIM.xml create mode 100644 src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt diff --git a/.idea/runConfigurations/Plugin___IdeaVIM.xml b/.idea/runConfigurations/Plugin___IdeaVIM.xml new file mode 100644 index 0000000..c9a9c3e --- /dev/null +++ b/.idea/runConfigurations/Plugin___IdeaVIM.xml @@ -0,0 +1,26 @@ +<component name="ProjectRunConfigurationManager"> + <configuration default="false" name="Plugin + IdeaVIM" type="GradleRunConfiguration" factoryName="Gradle"> + <ExternalSystemSettings> + <option name="env"> + <map> + <entry key="IDEAVIM" value="1" /> + </map> + </option> + <option name="executionName" /> + <option name="externalProjectPath" value="$PROJECT_DIR$" /> + <option name="externalSystemIdString" value="GRADLE" /> + <option name="scriptParameters" value=":runIde" /> + <option name="taskDescriptions"> + <list /> + </option> + <option name="taskNames"> + <list /> + </option> + <option name="vmOptions" /> + </ExternalSystemSettings> + <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess> + <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess> + <DebugAllEnabled>false</DebugAllEnabled> + <method v="2" /> + </configuration> +</component> \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index c6c1f9a..03439db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,4 +19,8 @@ dependencies { intellij { version.set("2021.2.2") + + if (System.getenv("IDEAVIM") == "1") { + plugins.add("IdeaVIM:0.66") + } } diff --git a/src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt b/src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt new file mode 100644 index 0000000..6cc74e8 --- /dev/null +++ b/src/main/kotlin/com/chylex/intellij/keyboardmaster/PluginStartup.kt @@ -0,0 +1,24 @@ +package com.chylex.intellij.keyboardmaster + +import com.chylex.intellij.keyboardmaster.feature.codeCompletion.CodeCompletionPopupKeyHandler +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.startup.StartupActivity + +class PluginStartup : StartupActivity.DumbAware { + private var isInitialized = false + + override fun runActivity(project: Project) { + if (!isInitialized) { + isInitialized = true + + val application = ApplicationManager.getApplication() + if (application.isUnitTestMode) { + CodeCompletionPopupKeyHandler.registerRawHandler() + } + else { + application.invokeLater(CodeCompletionPopupKeyHandler.Companion::registerRawHandler) + } + } + } +} diff --git a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt index 9d7c0ce..ceb7aa8 100644 --- a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt +++ b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/codeCompletion/CodeCompletionPopupKeyHandler.kt @@ -6,6 +6,7 @@ import com.intellij.codeInsight.lookup.impl.LookupImpl import com.intellij.codeInsight.template.impl.editorActions.TypedActionHandlerBase import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.actionSystem.TypedAction import com.intellij.openapi.editor.actionSystem.TypedActionHandler import com.intellij.ui.ScrollingUtil import javax.swing.ListModel @@ -13,7 +14,16 @@ import javax.swing.ListModel /** * Handles configured key bindings inside a code completion popup menu. */ -class CodeCompletionPopupKeyHandler(originalHandler: TypedActionHandler?) : TypedActionHandlerBase(originalHandler) { +class CodeCompletionPopupKeyHandler private constructor(originalHandler: TypedActionHandler?) : TypedActionHandlerBase(originalHandler) { + companion object { + /** + * Registers the key handler as a raw handler, because IdeaVIM steals keys from Keyboard Master when renaming an element in normal mode. + */ + fun registerRawHandler() { + TypedAction.getInstance().let { it.setupRawHandler(CodeCompletionPopupKeyHandler(it.rawHandler)) } + } + } + override fun execute(editor: Editor, charTyped: Char, dataContext: DataContext) { if (!executeImpl(editor, charTyped)) { myOriginalHandler?.execute(editor, charTyped, dataContext) diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 18675ed..0cbfeaf 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -19,7 +19,6 @@ <extensions defaultExtensionNs="com.intellij"> <applicationService serviceImplementation="com.chylex.intellij.keyboardmaster.configuration.PluginConfiguration" /> <applicationConfigurable parentId="tools" instance="com.chylex.intellij.keyboardmaster.configuration.PluginConfigurable" id="com.chylex.keyboardmaster" /> - <!--suppress PluginXmlValidity, PluginXmlDynamicPlugin --> - <editorTypedHandler implementationClass="com.chylex.intellij.keyboardmaster.feature.codeCompletion.CodeCompletionPopupKeyHandler" /> + <postStartupActivity implementation="com.chylex.intellij.keyboardmaster.PluginStartup" order="last" /> </extensions> </idea-plugin>