Skip to content

Instantly share code, notes, and snippets.

@trusktr
Last active April 21, 2024 06: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
Standard
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
OS X
delete: \U007F
For a good reference see http://osxnotes.net/keybindings.html.
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 */
}
@hym3242
Copy link

hym3242 commented Jan 14, 2024

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

@hym3242
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> !!!

@hym3242
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
https://gist.github.com/hym3242/8e8bc10a2fed8e55973c500f1798c234

@hym3242
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