Skip to content

Instantly share code, notes, and snippets.

@zsimic
Last active July 17, 2024 17:40
Show Gist options
  • Save zsimic/1367779 to your computer and use it in GitHub Desktop.
Save zsimic/1367779 to your computer and use it in GitHub Desktop.
OSX key bindings
{
/* ~/Library/KeyBindings/DefaultKeyBinding.dict
See https://gist.github.com/zsimic/1367779, prefix cheatsheet:
Char Short Key
$ S- Shift ⇧
^ C- CTRL ⌃
~ O- Option ⌥ (⊞ Win key position on PC)
@ M- Command ⌘ (Alt position on PC)
# Numeric Keypad
*/
/*---- Navigation ----*/
/* Up/down is mostly for a nicer laptop navigation (no Home, PgUp etc keys) */
"~\Uf700" = "pageUp:"; /* O-up Page up */
"~$\Uf700" = "pageUpAndModifySelection:"; /* O-S-up Select + page up */
"@\Uf700" = "moveToBeginningOfDocument:"; /* M-up Beginning of document */
"@$\Uf700" = "moveToBeginningOfDocumentAndModifySelection:"; /* M-S-up Select to beginning of document */
"~\Uf701" = "pageDown:"; /* O-down Page down */
"~$\Uf701" = "pageDownpAndModifySelection:"; /* O-S-down Select + page down */
"@\Uf701" = "moveToEndOfDocument:"; /* M-down End of document */
"@$\Uf701" = "moveToEndOfDocumentAndModifySelection:"; /* M-S-down Select to end of document */
/* Windows defaults are more convenient */
"^\Uf702" = "moveWordBackward:"; /* C-left Move word left */
"^$\Uf702" = "moveWordBackwardAndModifySelection:"; /* C-S-left Select word left */
"^\Uf703" = "moveWordForward:"; /* C-right Move word right */
"^$\Uf703" = "moveWordForwardAndModifySelection:"; /* C-S-right Select word right */
"\Uf729" = "moveToBeginningOfLine:"; /* home Beginning of line */
"$\Uf729" = "moveToBeginningOfLineAndModifySelection:"; /* S-home Select to beginning of line */
"^\Uf729" = "moveToBeginningOfDocument:"; /* C-home Beginning of document */
"^$\Uf729" = "moveToBeginningOfDocumentAndModifySelection:"; /* C-S-home Select to beginning of document */
"\Uf72b" = "moveToEndOfLine:"; /* end End of line */
"$\Uf72b" = "moveToEndOfLineAndModifySelection:"; /* S-end Select to end of line */
"^\Uf72b" = "moveToEndOfDocument:"; /* C-end End of document */
"^$\Uf72b" = "moveToEndOfDocumentAndModifySelection:"; /* C-S-end Select to end of document */
"\Uf72c" = "pageUp:"; /* PageUp Page up */
"$\Uf72c" = "pageUpAndModifySelection:"; /* S-PageUp Select + page up */
"@\Uf72c" = "scrollPageUp:"; /* M-PageUp Scroll page up */
"\Uf72d" = "pageDown:"; /* PageDn Page down */
"$\Uf72d" = "pageDownAndModifySelection:"; /* S-PageDn Select + page down */
"@\Uf72d" = "scrollPageDown:"; /* M-PageDn Scroll page down */
/*---- Editing ----*/
"^\U007f" = "deleteWordBackward:"; /* C-Del Delete word backward */
"^\Uf728" = "deleteWordForward:"; /* C-FwdDel Delete word forward */
"$\U000a" = "insertLineBreak:"; /* S-Ret Line break */
}
@zsimic
Copy link
Author

zsimic commented Dec 13, 2020

Example DefaultKeyBinding.dict

{
  "~w" = selectWord:;
  "~j" = (selectWord:, cut:);
  "~g" = (selectWord:, copy:);
  "~h" = (selectWord:, paste:);

  "~l" = selectParagraph:;
  "~z" = (selectParagraph:, deleteBackward:);
  "~x" = (selectParagraph:, cut:);
  "~c" = (selectParagraph:, copy:);

  "~s" = (moveToBeginningOfParagraphAndModifySelection:, moveToEndOfParagraphAndModifySelection:);
  "~y" = (moveToBeginningOfParagraphAndModifySelection:, moveToEndOfParagraphAndModifySelection:, deleteBackward:);
  "~q" = (moveToBeginningOfParagraphAndModifySelection:, moveToEndOfParagraphAndModifySelection:, cut:);
  "~m" = (moveToBeginningOfParagraphAndModifySelection:, moveToEndOfParagraphAndModifySelection:, copy:);

  "~a" = (moveToBeginningOfParagraphAndModifySelection:, copy:);
  "~r" = (moveToEndOfParagraphAndModifySelection:, copy:);
  "~t" = (moveToBeginningOfParagraphAndModifySelection:, cut:);
  "~k" = (moveToEndOfParagraphAndModifySelection:, cut:);

  "~v" = (delete:, setMark:, paste:, selectToMark:);

  "~d" = (setMark:, moveToBeginningOfParagraphAndModifySelection:, moveToEndOfParagraphAndModifySelection:, delete:, yank:, insertNewlineIgnoringFieldEditor:, yank:, swapWithMark:);

  "~-" = lowercaseWord:;
  "~=" = uppercaseWord:;
  "~." = capitalizeWord:;

  "@\r" = (moveToEndOfParagraph:, insertNewlineIgnoringFieldEditor:, deleteToBeginningOfParagraph:);
  "$\r" = (moveToBeginningOfParagraph:, insertNewlineIgnoringFieldEditor:, moveBackward:);

  "~\Uf700" = (moveUp:, moveUp:, moveUp:, moveUp:, moveUp:, moveUp:, moveUp, moveUp);
  "~\Uf701" = (moveDown:, moveDown:, moveDown:, moveDown:, moveDown:, moveDown:, moveDown, moveDown);
  "~$\Uf700" = (moveUpAndModifySelection:, moveUpAndModifySelection:, moveUpAndModifySelection:, moveUpAndModifySelection:, moveUpAndModifySelection:, moveUpAndModifySelection:, moveUpAndModifySelection, moveUpAndModifySelection);
  "~$\Uf701" = (moveDownAndModifySelection:, moveDownAndModifySelection:, moveDownAndModifySelection:, moveDownAndModifySelection:, moveDownAndModifySelection:, moveDownAndModifySelection:, moveDownAndModifySelection, moveDownAndModifySelection);

  "^~\Uf700" = (selectParagraph:, setMark:, deleteToMark:, moveBackward:, moveToBeginningOfParagraph:, setMark:, yank:, moveBackward:, selectToMark:);
  "^~\Uf701" = (selectParagraph:, setMark:, deleteToMark:, moveToEndOfParagraph:, moveForward:, setMark:, yank:, moveBackward:, selectToMark:);

  "@\Uf728" = deleteToEndOfParagraph:;

  "^," = moveToBeginningOfDocument:;
  "^." = moveToEndOfDocument:;
  "^$," = moveToBeginningOfDocumentAndModifySelection:;
  "^$." = moveToEndOfDocumentAndModifySelection:;
  "^~," = (moveToBeginningOfDocumentAndModifySelection:, deleteBackward);
  "^~." = (moveToEndOfDocumentAndModifySelection:, deleteBackward);
  "^d" = deleteToBeginningOfParagraph:;
}

Notes

Key combinations that enter dead key states cannot be reassigned.
They include option-E, option-I, option-N, option-U, and option-` in the U.S. keyboard layout.

setMark:, selectToMark: removes anchoring so that the methods that modify a selection expand the selection.

delete: (bound to the clear key) doesn't delete anything if there is no selection.
deleteBackward: (bound to the delete key) doesn't add deleted selections to the kill ring.
deleteBackward: doesn't add single character selections to the kill ring but setMark:, deleteToMark: does.

scrollPageDown: (bound to page down) doesn't move the caret but pageDown: (bound to option-page down) does.
I haven't changed the page down key to pageDown: because pageDown: doesn't do anything in Safari or other web views.

moveToBeginningOfParagraphAndModifySelection:, moveToEndOfParagraphAndModifySelection: or
selectParagraph:, moveForwardAndModifySelection:, moveBackwardAndModifySelection:, moveBackwardAndModifySelection:, moveToEndOfParagraphAndModifySelection:
select a line without a newline.

delete:, setMark:, paste:, selectToMark: pastes text and selects the pasted text.
If you remove the delete: method, the original selection is kept when the original selection is longer than the pasted text.

defaults write -g NSTextKillRingSize -int 100 makes yankPop: cycle through previously killed pieces of text.

Methods

Emacs keybindings

{
  "^ " = setMark:;
  "^/" = undo:;
  "^u" = deleteToBeginningOfParagraph:;
  "^w" = deleteToMark:;
  "^x" = {
    "^x" = swapWithMark:;
    "^m" = selectToMark:;
  };
  "^V" = pageDownAndModifySelection:;
  "~@" = selectWord:;
  "~b" = moveWordBackward:;
  "~c" = (capitalizeWord:, moveForward:, moveForward:);
  "~d" = deleteWordForward:;
  "~f" = moveWordForward:;
  "~l" = (lowercaseWord:, moveForward:, moveForward:);
  "~u" = (uppercaseWord:, moveForward:, moveForward:);
  "~v" = pageUp:;
  "~w" = (deleteToMark:, setMark:, yank:, swapWithMark:);
  "~B" = moveWordBackwardAndModifySelection:;
  "~F" = moveWordForwardAndModifySelection:;
  "~V" = pageUpAndModifySelection:;
}

This page includes a few more keybindings, but for example transposeWords: doesn't work in most applications, openDocument: and saveDocument: don't work in applications that use auto-save, and performClose: doesn't work everywhere either.

More links

{
  IBInspector = {
    Actions = (
      "ok:",
      "revert:",
      "touch:"
    );
    Outlets = (
      window
    );
    Super = NSObject;
  };
  NSApplication = {
    Super = NSResponder;
    Outlets = (
      delegate
    );
    Actions = (
        "arrangeInFront:",
        "hide:",
        "hideOtherApplications:",
        "miniaturizeAll:",
        "orderFrontColorPanel:",
        "orderFrontDataLinkPanel:",
        "orderFrontHelpPanel:",
        "orderFrontStandardAboutPanel:",
        "orderFrontStandardInfoPanel:",
        "runPageLayout:",
        "stop:",
        "terminate:",
        "unhide:",
        "unhideAllApplications:"
    );
  };
  NSButton = {
    Super = NSControl;
  };
  NSBrowser =
  {
    Outlets = (
      delegate
    );
    Super = NScontrol;
    Actions = (
        "doClick:",
        "doDoubleClick:"
    );
  };
  NSColorWell = {
    Super = NSControl;
    Actions = (
        "takeColorFrom:"
    );
  };
  NSControl = {
    Actions = (
      "takeDoubleValueFrom:",
      "takeFloatValueFrom:",
      "takeIntValueFrom:",
      "takeObjectValueFrom:",
      "takeStringValueFrom:"
    );
    Outlets = (
      target
    );
    Super = NSView;
  };
  NSDocumentController =
  {
    Super = NSObject;
    Actions = (
      "saveAllDocuments:",
      "openDocument:",
      "newDocument:",
      "clearRecentDocuments:"
    );
  };
  NSDocument =
  {
    Super = NSObject;
    Actions = (
        "runPageLayout:",
        "printDocument:",
        "saveDocument:",
        "saveDocumentAs:",
        "saveDocumentTo:",
        "revertDocumentToSaved:"
    );
  };
  NSDrawer =
  {
    Super = NSResponder;
    Actions = (
        "close:",
        "open:",
        "toggle:"
    );
    Outlets = (
      delegate
    );
  };
  NSFontManager =
  {
    Super = NSResponder;
    Actions = (
        "addFontTrait:",
        "removeFontTrait:",
        "modifyFont:",
        "modifyFontViaPanel:",
        "orderFrontFontPanel:"
    );
  };

  NSHelpManager =
  {
    Super = NSResponder;
    Actions = (
        "showHelp:",
        "activateContextHelpMode:"
    );
  };


  NSMenu = {
    Super = NSObject;
  };
  NSMenuItem = {
    Outlets = (
      target
    );
    Super = NSObject;
  };
  NSPanel = {
    Super = NSWindow;
  };
  NSProgressIndicator = {
    Super = NSObject;
    Actions = (
        "animate:",
        "startAnimation:",
        "stopAnimation:"
    );
  };

  NSSlider = {
    Super = NSControl;
  };

  NSTextField = {
    Outlets = (
      delegate
    );
    Super = NSControl;
  };

  NSResponder = {
    Super = NSObject;
    Actions = (
        "selectAll:",
        "deselectAll:",
        "selectText:"
    );
  };

  NSTabView = {
    Super = NSView;
    Actions = (
        "selectFirstTabViewItem:",
        "selectLastTabViewItem:",
        "selectNextTabViewItem:",
        "selectPreviousTabViewItem:",
        "takeSelectedTabViewItemFromSender:"
    );
    Outlets = (
      delegate
    );
  };

  NSText = {
    Super = NSView;
    Actions = (
        "toggleRuler:",
        "copy:",
        "copyFont:",
        "copyRuler:",
        "cut:",
        "delete:",
        "paste:",
        "pasteFont:",
        "pasteRuler:",
        "selectAll:",
        "changeFont:",
        "alignCenter:",
        "alignLeft:",
        "alignRight:",
        "subscript:",
        "superscript:",
        "underline:",
        "unscript:",
        "checkSpelling:",
        "showGuessPanel:",
        "changeSpelling:",
        "ignoreSpelling:"
    );
    Outlets = (
      delegate
    );
  };

  NSTextView = {
    Super = NSText;
    Actions = (
        "changeColor:",
        "alignJustified:",
        "pasteAsPlainText:",
        "pasteAsRichText:",
        "turnOffKerning:",
        "tightenKerning:",
        "loosenKerning:",
        "useStandardKerning:",
        "turnOffLigatures:",
        "useStandardLigatures:",
        "useAllLigatures:",
        "raiseBaseline:",
        "lowerBaseline:",
        "toggleTraditionalCharacterShape:",
        "toggleContinuousSpellChecking:"
    );
  };

  NSView = {
    Super = NSResponder;
    Actions = (
        "fax:",
        "print:"
    );
  };

  NSWindow = {
    Outlets = (
      delegate
    );
    Super = NSResponder;
    Actions = (
        "performZoom:",
        "zoom:",
        "orderBack:",
        "orderFront:",
        "orderOut:",
        "makeKeyAndOrderFront:",
        "selectNextKeyView:",
        "selectPreviousKeyView:",
        "performClose:",
        "deminiaturize:",
        "miniaturize:",
        "performMiniaturize:",
        "fax:",
        "print:",
        "toggleToolbarShown:",
        "runToolbarCustomizationPalette:"
    );
  };
  NSWindowController = {
    Outlets = (
      document
    );
    Super = NSResponder;
    Actions = (
        "showWindow:"
    );
  };

  FirstResponder = {
    Actions = (
      "activateContextHelpMode:",
      "alignCenter:",
      "alignJustified:",
      "alignLeft:",
      "alignRight:",
      "arrangeInFront:",
      "cancel:",
      "capitalizeWord:",
      "changeColor:",
      "changeFont:",
      "checkSpelling:",
      "close:",
      "complete:",
      "copy:",
      "copyFont:",
      "copyRuler:",
      "cut:",
      "delete:",
      "deleteBackward:",
      "deleteForward:",
      "deleteToBeginningOfLine:",
      "deleteToBeginningOfParagraph:",
      "deleteToEndOfLine:",
      "deleteToEndOfParagraph:",
      "deleteToMark:",
      "deleteWordBackward:",
      "deleteWordForward:",
      "deminiaturize:",
      "deselectAll:",
      "fax:",
      "hide:",
      "hideOtherApplications:",
      "indent:",
      "loosenKerning:",
      "lowerBaseline:",
      "lowercaseWord:",
      "makeKeyAndOrderFront:",
      "miniaturize:",
      "miniaturizeAll:",
      "moveBackward:",
      "moveBackwardAndModifySelection:",
      "moveDown:",
      "moveDownAndModifySelection:",
      "moveForward:",
      "moveForwardAndModifySelection:",
      "moveLeft:",
      "moveRight:",
      "moveToBeginningOfDocument:",
      "moveToBeginningOfLine:",
      "moveToBeginningOfParagraph:",
      "moveToEndOfDocument:",
      "moveToEndOfLine:",
      "moveToEndOfParagraph:",
      "moveUp:",
      "moveUpAndModifySelection:",
      "moveWordBackward:",
      "moveWordBackwardAndModifySelection:",
      "moveWordForward:",
      "moveWordForwardAndModifySelection:",
      "ok:",
      "open:",
      "orderBack:",
      "orderFront:",
      "orderFrontColorPanel:",
      "orderFrontDataLinkPanel:",
      "orderFrontHelpPanel:",
      "orderFrontStandardAboutPanel:",
      "orderFrontStandardInfoPanel:",
      "orderOut:",
      "pageDown:",
      "pageUp:",
      "paste:",
      "pasteAsPlainText:",
      "pasteAsRichText:",
      "pasteFont:",
      "pasteRuler:",
      "performClose:",
      "performMiniaturize:",
      "performZoom:",
      "print:",
      "raiseBaseline:",
      "runPageLayout:",
      "runToolbarCustomizationPalette:",
      "scrollLineDown:",
      "scrollLineUp:",
      "scrollPageDown:",
      "scrollPageUp:",
      "scrollViaScroller:",
      "selectAll:",
      "selectLine:",
      "selectNextKeyView:",
      "selectParagraph:",
      "selectPreviousKeyView:",
      "selectText:",
      "selectText:",
      "selectToMark:",
      "selectWord:",
      "showContextHelp:",
      "showGuessPanel:",
      "showHelp:",
      "showWindow:",
      "stop:",
      "subscript:",
      "superscript:",
      "swapWithMark:",
      "takeDoubleValueFrom:",
      "takeFloatValueFrom:",
      "takeIntValueFrom:",
      "takeObjectValueFrom:",
      "takeStringValueFrom:",
      "terminate:",
      "tightenKerning:",
      "toggle:",
      "toggleContinuousSpellChecking:",
      "toggleRuler:",
      "toggleToolbarShown:",
      "toggleTraditionalCharacterShape:",
      "transpose:",
      "transposeWords:",
      "turnOffKerning:",
      "turnOffLigatures:",
      "underline:",
      "unhide:",
      "unhideAllApplications:",
      "unscript:",
      "uppercaseWord:",
      "useAllLigatures:",
      "useStandardKerning:",
      "useStandardLigatures:",
      "yank:",
      "zoom:",
    );
    Super = NSObject;
  };
}

@TemporaryEfx
Copy link

You've assembled an amazing resource... Thank you!

@cdpark0530
Copy link

This is really helpful. Thank you!

@realtnt
Copy link

realtnt commented Mar 11, 2023

Great resource! Thank you!

Just a note if anyone's faced the same issue. For the following to work I had to disable or change the Mission Control shortcuts for moving spaces left and right.

    /* Windows defaults are more convenient */
    "^\Uf702"   = "moveWordBackward:";                              /* C-left       Move word left */
    "^$\Uf702"  = "moveWordBackwardAndModifySelection:";            /* C-S-left     Select word left */

    "^\Uf703"   = "moveWordForward:";                               /* C-right      Move word right */
    "^$\Uf703"  = "moveWordForwardAndModifySelection:";             /* C-S-right    Select word right */

@verityj
Copy link

verityj commented Jun 14, 2023

Thank you for this, truly helpful. Question, is there a shortcut string that would specifically point to the right option key? Can left and right be differentiated in the key bindings?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment