Skip to content

Instantly share code, notes, and snippets.

Last active June 13, 2024 01:32
Show Gist options
  • Save trusktr/1e5e516df4e8032cbc3d to your computer and use it in GitHub Desktop.
Save trusktr/1e5e516df4e8032cbc3d to your computer and use it in GitHub Desktop.
My DefaultKeyBinding.dict for Mac OS X
/* ~/Library/KeyBindings/DefaultKeyBinding.Dict
This file remaps the key bindings of a single user on Mac OS X 10.5 to more
closely match default behavior on Windows systems. This makes the Command key
behave like Windows Control key. To use Control instead of Command, either swap
Control and Command in Apple->System Preferences->Keyboard->Modifier Keys...
or replace @ with ^ in this file.
Here is a rough cheatsheet for syntax.
Key Modifiers
^ : Ctrl
$ : Shift
~ : Option (Alt)
@ : Command (Apple)
# : Numeric Keypad
Non-Printable Key Codes
Up Arrow: \UF700 Backspace: \U0008 F1: \UF704
Down Arrow: \UF701 Tab: \U0009 F2: \UF705
Left Arrow: \UF702 Escape: \U001B F3: \UF706
Right Arrow: \UF703 Enter: \U000A ...
Insert: \UF727 Page Up: \UF72C
Delete: \UF728 Page Down: \UF72D
Home: \UF729 Print Screen: \UF72E
End: \UF72B Scroll Lock: \UF72F
Break: \UF732 Pause: \UF730
SysReq: \UF731 Menu: \UF735
Help: \UF746
delete: \U007F
For a good reference see
NOTE: typically the Windows 'Insert' key is mapped to what Macs call 'Help'.
Regular Mac keyboards don't even have the Insert key, but provide 'Fn' instead,
which is completely different.
"@\UF72B" = "moveToEndOfDocument:"; /* Cmd + End */
"~@\UF703" = "moveToEndOfDocument:"; /* Cmd + Option + Right Arrow */
"@$\UF72B" = "moveToEndOfDocumentAndModifySelection:"; /* Shift + Cmd + End */
"@\UF729" = "moveToBeginningOfDocument:"; /* Cmd + Home */
"~@\UF702" = "moveToBeginningOfDocument:"; /* Cmd + Option + Left Arrow */
"@$\UF729" = "moveToBeginningOfDocumentAndModifySelection:"; /* Shift + Cmd + Home */
"\UF729" = "moveToBeginningOfLine:"; /* Home */
"~\UF702" = "moveToBeginningOfLine:"; /* Option + Left Arrow */
"$\UF729" = "moveToBeginningOfLineAndModifySelection:"; /* Shift + Home */
"$~\UF702" = "moveToBeginningOfLineAndModifySelection:"; /* Shift + Option + Right Arrow */
"\UF72B" = "moveToEndOfLine:"; /* End */
"~\UF703" = "moveToEndOfLine:"; /* Option + Right Arrow */
"$\UF72B" = "moveToEndOfLineAndModifySelection:"; /* Shift + End */
"$~\UF703" = "moveToEndOfLineAndModifySelection:"; /* Shift + Option + Left Arrow */
"\UF72C" = "pageUp:"; /* PageUp */
"\UF72D" = "pageDown:"; /* PageDown */
"$\UF728" = "cut:"; /* Shift + Del */
"$\UF727" = "paste:"; /* Shift + Ins */
"@\UF727" = "copy:"; /* Cmd + Ins */
"$\UF746" = "paste:"; /* Shift + Help */
"@\UF746" = "copy:"; /* Cmd + Help (Ins) */
"~j" = "moveBackward:"; /* Option + j */
"~l" = "moveForward:"; /* Option + l */
"~i" = "moveUp:"; /* Option + i */
"~k" = "moveDown:"; /* Option + k */
"@~i" = ("moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:","moveUp:",); /* Cmd + Option + j */
"@~k" = ("moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:","moveDown:",); /* Cmd + Option + j */
"@\UF702" = "moveWordBackward:"; /* Cmd + LeftArrow */
"@~j" = "moveWordBackward:"; /* Cmd + Option + j */
"@\U007F" = "deleteWordBackward:"; /* Cmd + Backspace */
"@\UF703" = "moveWordForward:"; /* Cmd + RightArrow */
"@~l" = "moveWordForward:"; /* Cmd + Option + l */
"@\UF728" = "deleteWordForward:"; /* Cmd + Delete */
"@$\UF702" = "moveWordBackwardAndModifySelection:"; /* Shift + Cmd + Leftarrow */
"@$\UF703" = "moveWordForwardAndModifySelection:"; /* Shift + Cmd + Rightarrow */
Copy link

smitty-codes commented Jul 25, 2023

I'm trying to use "^\U007F" = "deleteWordBackward:"; // ctrl-backspace and it works for most apps. However, in apps such as google docs and vscode, I think something overrides this hotkey and doesn't work. Does anyone know a solution to this issue?

@alvister88 Regarding Visual Studio for Mac and Visual Studio Code, they both have their own set of key bindings you need to fix separately since they don't seem to inherit everything from the DefaultKeyBinding.Dict file.

Here are VSC's default key bindings

In particular I am a heavy user of the "home" and "end" keys in VSC and the CTRL+Home and CTRL+End navigating to the top and bottom of the document was not working so I did the following steps:

  1. Open VSC > Code menu > Preferences > Keyboard editor (also see
  2. Search for “cursorTop” and “cursorBottom” (the entries with "When=textInputFocus") and you can right click on one of these existing entries > "add keybinding..." and then add your new shortcut and it'll clone it.

I didn't check how to do this within VS for Mac but I'm sure there are similar settings.

Copy link

I'm finding that the Option+i to move up shortcut is not working, the shortcut seems to be overridden by something that is inserting a caret. I'm having trouble identifying where this shortcut is defined so I can disable it. Any ideas?

@evannjohnson I don't think that's re-mappable: That's for attaching an accent to a character, and it's not in the StandardKeyBinding file. It's pre-OS X.

@lotyp and @mrjoecastellon:

Can't find "space" key anywhere 😀 For example Cmd+Space to trigger Spotlight.

Upd. ok, will try to go with U+0020 \U0020

Just use the characters if they're printable. defaults write -g NSUserKeyEquivalents -dict-add "System Preferences…" "^ "

A couple other things to make life easier:

  • -g above is shorthand for the global domain
  • You can use defaults write -app Safari … (or whatever).

Copy link

joaobcjr commented Jan 7, 2024

In a text file with 3 rows, when I use "Shift + Up Arrow" in the middle of the second row to select the first one, when I try "Shift + End" to deselect, it goes on the line below.
How do I reproduce windows actions in this case?

Here's some examples:

This is what is happening

This is what I trying to reproduce

Copy link

hym3242 commented Jan 14, 2024

Is there any way we can get this to affect the Chrome omnibox and all <textarea> elements? They support the opt+ctrl+b/f to jump by word but lack ctrl+opt+h to deletewordbackward.

Copy link

hym3242 commented Jan 14, 2024

Is there a moveParagraphForward action? I tried to set it to no avail. This should be what opt+downarrow do.

Copy link

hym3242 commented Jan 14, 2024

@joaobcjr It indeed is weird, but i don't think there's anything we can do....

Copy link

hym3242 commented Jan 14, 2024

using FileMonitor from objective-see we know that Chrome indeed reads DefaultKeyBinding.dict and actually uses them everywhere from omnibox to <textarea> !!!

Copy link

hym3242 commented Jan 15, 2024

see my dump of standardkeybinding.dict and AppKit symbols for bindable methods, maybe you will get some new ideas

Copy link

hym3242 commented Jan 19, 2024

here is my binding: explore for more yourself.

        "^~h" = "deleteWordBackward:"; //bash style...
        "^~d" = "deleteWordForward:"; //ibid
        "^u" = "deleteToBeginningOfParagraph:"; //unix style kill, ONLY THIS METHOD deleteToBeginningOfParagraph: CAN ADD SELECTION TO YANK BUFFER!(or so it seems...)
        "^w" = "deleteWordBackward:"; //unix style werase
        "~a" = "selectParagraph:"; //cocoa paragraph ≈ unix line
        "^m" = "insertNewline:";  //RETURN as in "Carriage Return"
        "^j" = "insertNewlineIgnoringFieldEditor:"; //default also bound to opt+return, alternate newline, bypasses some editor smart features
        "~v" = "pageUp:"; //you know your emacs.
        "~V" = "pageUpAndModifySelection:";  //shift+option+v
        "~A" = "selectWord:";
        "~c" = "capitalizeWord:";  //uppercaseWord: method does  not seem to work?
        "~t" = "convertToTraditionalChinese:"; //convert selection
        "~s" = "convertToSimplifiedChinese:"; //ibid.
        "^J" = "insertLineBreak:";  //linebreak is different from newline. default also bound to ctrl+return

// add these to your liking
//      "~h" = "deleteWordBackward:";
//      "~d" = "deleteWordForward:";
//      "~b" = "moveWordBackward:";
//      "~f" = "moveWordForward:";

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