diff --git a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/VimNavigation.kt b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/VimNavigation.kt index bd58c49..2ef3e6a 100644 --- a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/VimNavigation.kt +++ b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/VimNavigation.kt @@ -38,20 +38,11 @@ object VimNavigation { val originalBindings = (UIManager.get("PopupMenu.selectedWindowInputMapBindings") as Array<*>).also { originalPopupBindings = it } val updatedBindings = mutableListOf(*originalBindings) - updatedBindings.add(KeyStroke.getKeyStroke('h')) - updatedBindings.add("selectParent") - - updatedBindings.add(KeyStroke.getKeyStroke('j')) - updatedBindings.add("selectNext") - - updatedBindings.add(KeyStroke.getKeyStroke('k')) - updatedBindings.add("selectPrevious") - - updatedBindings.add(KeyStroke.getKeyStroke('l')) - updatedBindings.add("selectChild") - - updatedBindings.add(KeyStroke.getKeyStroke('q')) - updatedBindings.add("cancel") + addBinding(updatedBindings, "selectParent", setOf('h', 'p', 'x')) + addBinding(updatedBindings, "selectNext", setOf('j')) + addBinding(updatedBindings, "selectPrevious", setOf('k')) + addBinding(updatedBindings, "selectChild", setOf('l', 'o')) + addBinding(updatedBindings, "cancel", setOf('q')) UIManager.put("PopupMenu.selectedWindowInputMapBindings", updatedBindings.toTypedArray()) UISettings.getInstance().disableMnemonics = true @@ -62,6 +53,13 @@ object VimNavigation { } } + private fun addBinding(bindings: MutableList<Any?>, action: String, chars: Set<Char>) { + for (char in chars) { + bindings.add(KeyStroke.getKeyStroke(char)) + bindings.add(action) + } + } + private fun handleEvent(event: AWTEvent) { if (event is FocusEvent && event.id == FocusEvent.FOCUS_GAINED && isEnabled.get()) { when (val source = event.source) { diff --git a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/components/VimListNavigation.kt b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/components/VimListNavigation.kt index ab3d63d..e428f15 100644 --- a/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/components/VimListNavigation.kt +++ b/src/main/kotlin/com/chylex/intellij/keyboardmaster/feature/vimNavigation/components/VimListNavigation.kt @@ -34,6 +34,14 @@ internal object VimListNavigation { ) ) + private val POPUP_LIST_ROOT_NODE = ROOT_NODE + Parent( + mapOf( + KeyStroke.getKeyStroke('o') to IdeaAction("List-selectNextColumn"), + KeyStroke.getKeyStroke('p') to IdeaAction("List-selectPreviousColumn"), + KeyStroke.getKeyStroke('x') to IdeaAction("List-selectPreviousColumn"), + ) + ) + fun install(component: JList<*>) { if (component.getUserData(KEY) == null && component.javaClass.enclosingClass.let { it == null || !WizardPopup::class.java.isAssignableFrom(it) }) { component.putUserData(KEY, VimNavigationDispatcher(component, ROOT_NODE)) @@ -47,7 +55,7 @@ internal object VimListNavigation { } @Suppress("serial") - private class VimPopupListNavigationDispatcher(component: JList<*>, override val popup: WizardPopup) : VimNavigationDispatcher<JList<*>>(component, ROOT_NODE) { + private class VimPopupListNavigationDispatcher(component: JList<*>, override val popup: WizardPopup) : VimNavigationDispatcher<JList<*>>(component, POPUP_LIST_ROOT_NODE) { init { val speedSearch = SpeedSearchSupply.getSupply(component, true) as? SpeedSearch if (speedSearch != null) {