/** @return true if keymap was switched successfully, false otherwise */ public static boolean switchKeymapBindings(final boolean enableVimKeymap) { LOG.debug("Enabling keymap"); // In case if Vim keymap is already in use or we don't need it, we have nothing to do if (isVimKeymapUsed() == enableVimKeymap) { return false; } final KeymapManagerImpl manager = (KeymapManagerImpl) KeymapManager.getInstance(); // Get keymap to enable final String keymapName2Enable = enableVimKeymap ? VIM_KEYMAP_NAME : VimPlugin.getInstance().getPreviousKeyMap(); if (keymapName2Enable.isEmpty()) { return false; } if (keymapName2Enable.equals(manager.getActiveKeymap().getName())) { return false; } LOG.debug("Enabling keymap:" + keymapName2Enable); final Keymap keymap = manager.getKeymap(keymapName2Enable); if (keymap == null) { reportError("Failed to enable keymap: " + keymapName2Enable); return false; } // Save previous keymap to enable after VIM emulation is turned off if (enableVimKeymap) { VimPlugin.getInstance().setPreviousKeyMap(manager.getActiveKeymap().getName()); } manager.setActiveKeymap(keymap); final String keyMapPresentableName = keymap.getPresentableName(); Notifications.Bus.notify( new Notification( VimPlugin.IDEAVIM_NOTIFICATION_ID, VimPlugin.IDEAVIM_NOTIFICATION_TITLE, keyMapPresentableName + " keymap was successfully enabled", NotificationType.INFORMATION)); LOG.debug(keyMapPresentableName + " keymap was successfully enabled"); return true; }
/** * Changes parent keymap for the Vim * * @return true if document was changed successfully */ private static boolean configureVimParentKeymap( final String path, @NotNull final Document document, final boolean showNotification) throws IOException, InvalidDataException { final Element rootElement = document.getRootElement(); final String parentKeymapName = rootElement.getAttributeValue("parent"); final VimKeymapDialog vimKeymapDialog = new VimKeymapDialog(parentKeymapName); vimKeymapDialog.show(); if (vimKeymapDialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) { return false; } rootElement.removeAttribute("parent"); final Keymap parentKeymap = vimKeymapDialog.getSelectedKeymap(); final String keymapName = parentKeymap.getName(); VimKeymapConflictResolveUtil.resolveConflicts(rootElement, parentKeymap); // We cannot set a user-defined modifiable keymap as the parent of our Vim keymap so we have to // copy its shortcuts if (parentKeymap.canModify()) { final KeymapImpl vimKeyMap = new KeymapImpl(); final KeymapManager keymapManager = KeymapManager.getInstance(); final KeymapManagerImpl keymapManagerImpl = (KeymapManagerImpl) keymapManager; final Keymap[] allKeymaps = keymapManagerImpl.getAllKeymaps(); vimKeyMap.readExternal(rootElement, allKeymaps); final HashSet<String> ownActions = new HashSet<String>(Arrays.asList(vimKeyMap.getOwnActionIds())); final KeymapImpl parentKeymapImpl = (KeymapImpl) parentKeymap; for (String parentAction : parentKeymapImpl.getOwnActionIds()) { if (!ownActions.contains(parentAction)) { final List<Shortcut> shortcuts = Arrays.asList(parentKeymap.getShortcuts(parentAction)); rootElement.addContent( VimKeymapConflictResolveUtil.createActionElement(parentAction, shortcuts)); } } final Keymap grandParentKeymap = parentKeymap.getParent(); rootElement.setAttribute("parent", grandParentKeymap.getName()); } else { rootElement.setAttribute("parent", keymapName); } VimPlugin.getInstance().setPreviousKeyMap(keymapName); // Save modified keymap to the file JDOMUtil.writeDocument(document, path, "\n"); if (showNotification) { Notifications.Bus.notify( new Notification( VimPlugin.IDEAVIM_NOTIFICATION_ID, VimPlugin.IDEAVIM_NOTIFICATION_TITLE, "Successfully configured vim keymap to be based on " + parentKeymap.getPresentableName(), NotificationType.INFORMATION)); } return true; }