diff --git a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/RTADefaultInputMap.java b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/RTADefaultInputMap.java index 3a76e387a..097042ae8 100755 --- a/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/RTADefaultInputMap.java +++ b/RSyntaxTextArea/src/main/java/org/fife/ui/rtextarea/RTADefaultInputMap.java @@ -29,7 +29,7 @@ *
  • Ctrl+Shift+Up and Ctrl+Shift+Down move the current line up and * down, respectively. *
  • Ctrl+J joins lines. - *
  • Ctrl+Z is undo and Ctrl+Y is redo. + *
  • Ctrl+Z is undo and Ctrl+Y/Ctrl+Shift+Z is redo *
  • Ctrl+Up and Ctrl+Down shift the visible area of the text area up and * down one line, respectively. *
  • F2 and Shift+F2 moves to the next and previous bookmarks, @@ -37,6 +37,9 @@ *
  • Ctrl+F2 toggles whether a bookmark is on the current line. *
  • etc. * + * + * Note on macOS, {@code Cmd} is usually the modifier key instead of {@code Ctrl} + * as it is on Windows and Linux. */ @SuppressWarnings("checkstyle:linelength") public class RTADefaultInputMap extends InputMap { @@ -49,21 +52,21 @@ public RTADefaultInputMap() { super(); - int defaultModifier = RTextArea.getDefaultModifier(); - //int ctrl = InputEvent.CTRL_DOWN_MASK; + int defaultMod = RTextArea.getDefaultModifier(); + int ctrl = InputEvent.CTRL_DOWN_MASK; int alt = InputEvent.ALT_DOWN_MASK; int shift = InputEvent.SHIFT_DOWN_MASK; boolean isOSX = RTextArea.isOSX(); - int moveByWordMod = isOSX ? alt : defaultModifier; + int moveByWordMod = isOSX ? alt : defaultMod; put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0), isOSX ? DefaultEditorKit.beginAction : DefaultEditorKit.beginLineAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, shift), isOSX ? DefaultEditorKit.selectionBeginAction : DefaultEditorKit.selectionBeginLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, defaultModifier), DefaultEditorKit.beginAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, defaultModifier|shift), DefaultEditorKit.selectionBeginAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, defaultMod), DefaultEditorKit.beginAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, defaultMod|shift), DefaultEditorKit.selectionBeginAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_END, 0), isOSX ? DefaultEditorKit.endAction : DefaultEditorKit.endLineAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_END, shift), isOSX ? DefaultEditorKit.selectionEndAction : DefaultEditorKit.selectionEndLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_END, defaultModifier), DefaultEditorKit.endAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_END, defaultModifier|shift), DefaultEditorKit.selectionEndAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_END, defaultMod), DefaultEditorKit.endAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_END, defaultMod|shift), DefaultEditorKit.selectionEndAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), DefaultEditorKit.backwardAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, shift), DefaultEditorKit.selectionBackwardAction); @@ -71,7 +74,7 @@ public RTADefaultInputMap() { put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, moveByWordMod|shift), DefaultEditorKit.selectionPreviousWordAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), DefaultEditorKit.downAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, shift), DefaultEditorKit.selectionDownAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, defaultModifier), RTextAreaEditorKit.rtaScrollDownAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, defaultMod), RTextAreaEditorKit.rtaScrollDownAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, alt), RTextAreaEditorKit.rtaLineDownAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), DefaultEditorKit.forwardAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, shift), DefaultEditorKit.selectionForwardAction); @@ -79,57 +82,83 @@ public RTADefaultInputMap() { put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, moveByWordMod|shift), DefaultEditorKit.selectionNextWordAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), DefaultEditorKit.upAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, shift), DefaultEditorKit.selectionUpAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, defaultModifier), RTextAreaEditorKit.rtaScrollUpAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, defaultMod), RTextAreaEditorKit.rtaScrollUpAction); put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, alt), RTextAreaEditorKit.rtaLineUpAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,0), DefaultEditorKit.pageUpAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,shift), RTextAreaEditorKit.rtaSelectionPageUpAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP,defaultModifier|shift), RTextAreaEditorKit.rtaSelectionPageLeftAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,0), DefaultEditorKit.pageDownAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,shift), RTextAreaEditorKit.rtaSelectionPageDownAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN,defaultModifier|shift), RTextAreaEditorKit.rtaSelectionPageRightAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_CUT, 0), getCutAction()); - put(KeyStroke.getKeyStroke(KeyEvent.VK_COPY, 0), getCopyAction()); - put(KeyStroke.getKeyStroke(KeyEvent.VK_PASTE, 0), DefaultEditorKit.pasteAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_X, defaultModifier), getCutAction()); - put(KeyStroke.getKeyStroke(KeyEvent.VK_C, defaultModifier), getCopyAction()); - put(KeyStroke.getKeyStroke(KeyEvent.VK_V, defaultModifier), DefaultEditorKit.pasteAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_V, defaultModifier|shift), RTextAreaEditorKit.clipboardHistoryAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), DefaultEditorKit.deleteNextCharAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, shift), getCutAction()); - put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, defaultModifier), RTextAreaEditorKit.rtaDeleteRestOfLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), RTextAreaEditorKit.rtaToggleTextModeAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, shift), DefaultEditorKit.pasteAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, defaultModifier), getCopyAction()); - put(KeyStroke.getKeyStroke(KeyEvent.VK_A, defaultModifier), DefaultEditorKit.selectAllAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_D, defaultModifier), RTextAreaEditorKit.rtaDeleteLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_J, defaultModifier), RTextAreaEditorKit.rtaJoinLinesAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, shift), DefaultEditorKit.deletePrevCharAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, defaultModifier), RTextAreaEditorKit.rtaDeletePrevWordAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), DefaultEditorKit.insertTabAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), DefaultEditorKit.insertBreakAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, shift), DefaultEditorKit.insertBreakAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, defaultModifier), RTextAreaEditorKit.rtaDumbCompleteWordAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, defaultModifier), RTextAreaEditorKit.rtaUndoAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_Y, defaultModifier), RTextAreaEditorKit.rtaRedoAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), RTextAreaEditorKit.rtaNextBookmarkAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, shift), RTextAreaEditorKit.rtaPrevBookmarkAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, defaultModifier), RTextAreaEditorKit.rtaToggleBookmarkAction); - - put(KeyStroke.getKeyStroke(KeyEvent.VK_K, defaultModifier|shift), RTextAreaEditorKit.rtaPrevOccurrenceAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_K, defaultModifier), RTextAreaEditorKit.rtaNextOccurrenceAction); - + put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0), DefaultEditorKit.pageUpAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, shift), RTextAreaEditorKit.rtaSelectionPageUpAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, defaultMod|shift), RTextAreaEditorKit.rtaSelectionPageLeftAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0), DefaultEditorKit.pageDownAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, shift), RTextAreaEditorKit.rtaSelectionPageDownAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, defaultMod|shift), RTextAreaEditorKit.rtaSelectionPageRightAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_CUT, 0), getCutAction()); + put(KeyStroke.getKeyStroke(KeyEvent.VK_COPY, 0), getCopyAction()); + put(KeyStroke.getKeyStroke(KeyEvent.VK_PASTE, 0), DefaultEditorKit.pasteAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_X, defaultMod), getCutAction()); + put(KeyStroke.getKeyStroke(KeyEvent.VK_C, defaultMod), getCopyAction()); + put(KeyStroke.getKeyStroke(KeyEvent.VK_V, defaultMod), DefaultEditorKit.pasteAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_V, defaultMod|shift), RTextAreaEditorKit.clipboardHistoryAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), DefaultEditorKit.deleteNextCharAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, shift), getCutAction()); + put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, defaultMod), RTextAreaEditorKit.rtaDeleteRestOfLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), RTextAreaEditorKit.rtaToggleTextModeAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, shift), DefaultEditorKit.pasteAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, defaultMod), getCopyAction()); + put(KeyStroke.getKeyStroke(KeyEvent.VK_A, defaultMod), DefaultEditorKit.selectAllAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_D, defaultMod), RTextAreaEditorKit.rtaDeleteLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_J, defaultMod), RTextAreaEditorKit.rtaJoinLinesAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, shift), DefaultEditorKit.deletePrevCharAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, defaultMod), RTextAreaEditorKit.rtaDeletePrevWordAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), DefaultEditorKit.insertTabAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), DefaultEditorKit.insertBreakAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, shift), DefaultEditorKit.insertBreakAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, defaultMod), RTextAreaEditorKit.rtaDumbCompleteWordAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, defaultMod), RTextAreaEditorKit.rtaUndoAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_Y, defaultMod), RTextAreaEditorKit.rtaRedoAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), RTextAreaEditorKit.rtaNextBookmarkAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, shift), RTextAreaEditorKit.rtaPrevBookmarkAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, defaultMod), RTextAreaEditorKit.rtaToggleBookmarkAction); + + put(KeyStroke.getKeyStroke(KeyEvent.VK_K, defaultMod|shift), RTextAreaEditorKit.rtaPrevOccurrenceAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_K, defaultMod), RTextAreaEditorKit.rtaNextOccurrenceAction); + + // Shortcuts specific to macOS + // macOS keyboard shortcuts documentation: https://support.apple.com/en-us/HT201236 if (isOSX) { - put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, defaultModifier), DefaultEditorKit.beginLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, defaultModifier), DefaultEditorKit.endLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, defaultModifier|shift), DefaultEditorKit.selectionBeginLineAction); - put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, defaultModifier|shift), DefaultEditorKit.selectionEndLineAction); + + // These shortcuts overlap different shortcuts on Windows (see above for actions defined conditionally + // via isOSX) + put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, defaultMod), DefaultEditorKit.beginLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, defaultMod), DefaultEditorKit.endLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, defaultMod|shift), DefaultEditorKit.selectionBeginLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, defaultMod|shift), DefaultEditorKit.selectionEndLineAction); + + // The actions below have additional shortcuts on macOS + + // Move/select to top or bottom of document + put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, defaultMod), DefaultEditorKit.beginAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, defaultMod|shift), DefaultEditorKit.selectionBeginAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, defaultMod), DefaultEditorKit.endAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, defaultMod|shift), DefaultEditorKit.selectionEndAction); + + // Basic keyboard navigation (yes, via Ctrl) + put(KeyStroke.getKeyStroke(KeyEvent.VK_F, ctrl), DefaultEditorKit.forwardAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_B, ctrl), DefaultEditorKit.backwardAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_A, ctrl), DefaultEditorKit.beginLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_E, ctrl), DefaultEditorKit.endLineAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_P, ctrl), DefaultEditorKit.upAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_N, ctrl), DefaultEditorKit.downAction); + put(KeyStroke.getKeyStroke(KeyEvent.VK_O, ctrl), DefaultEditorKit.insertBreakAction); + + // Extra redo shortcut + put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, defaultMod|shift), RTextAreaEditorKit.rtaRedoAction); + } /* NOTE: Currently, macros aren't part of the default input map for */ @@ -155,3 +184,4 @@ protected String getCutAction() { } } +