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() {
}
}
+