Mac: How to Create Keyboard Layout and Keybinding

By Xah Lee. Date: . Last updated: .

This page tells you how to modify Mac OS X's keybinding.

You can:

Mac keyboard viewer us int 2017  41373
Mac keyboard viewer, with ⌥ option key down, US International layout, 2017. Those colored orange are prefix keys, allowing you to type accented characters such as {é ü ô}.

〔►see Mac Keyboard Viewer and Unicode

〔►see Unicode Characters ☯ ⚡ ∑ ♥ 😄

Key Config File

Create a file at ~/Library/KeyBindings/DefaultKeyBinding.dict. Create the “KeyBindings” dir if you don't already have it.

The DefaultKeyBinding.dict file is just a text file.

The file's content should be key and action pairs, like this:

/* this is comment */
"keycode1" = actionCode1;
"keycode2" = actionCode2;

Simple Example

Create a file at ~/Library/KeyBindings/DefaultKeyBinding.dict, and put the following content.

/* -*- coding: utf-8 -*- */
/* my keybindings */

/* insert Unicode character with Option key down*/
"~a" = ("insertText:", "\U03B1"); /* greek alpha α */
"~;" = ("insertText:", "\U2665"); /* heart symbol ♥ */

/* move cursor with i j k l keys while Ctrl key down */
"^i" = ("moveUp:");
"^k" = ("moveDown:");
"^j" = ("moveLeft:");
"^l" = ("moveRight:");

Restart a application and the new keybinding will take effect in that application. Launch TextEdit to test your changes.

Note: Only applications that uses Cocoa Text System will support this.

Note: if you use Unicode Characters directly in the file such as , you must save the file using UTF-8 encoding.

Key Syntax

Mac OS X Keybinding Key Syntax

Action Code

Mac OS X Keybinding Action Code

Sample File

Example of defining the {Home, End} keys to move to the beginning/end of line.

/* make home/end key to move to begin/end of line */

"\UF729" = "moveToBeginningOfLine:"; /* home key */
"\UF72B" = "moveToEndOfLine:"; /* end key */

Here's example file for inserting Unicode characters with the ⌥ option key.

/* -*- coding: utf-8 -*- */

/* insert Unicode characteres with Option key down */
"~#8" = ("insertText:", "↑");
"~#2" = ("insertText:", "↓");
"~#4" = ("insertText:", "←");
"~#6" = ("insertText:", "→");

"~a" = ("insertText:", "α");
"~h" = ("insertText:", "θ");

"~3" = ("insertText:", "†");
"~7" = ("insertText:", "—");
"~8" = ("insertText:", "•");
"~9" = ("insertText:", "★");

"~&" = ("insertText:", "‣");
"~*" = ("insertText:", "°");

/* insert pairs with Option down */
"~d" = ("insertText:", "«»", "moveBackward:");
"~h" = ("insertText:", "{}", "moveBackward:");
"~t" = ("insertText:", "()", "moveBackward:");
"~n" = ("insertText:", "[]");
"~s" = ("insertText:", "“”", "moveBackward:");
"~-" = ("insertText:", "「」", "moveBackward:");

"~D" = ("insertText:", "‹›", "moveBackward:");
"~S" = ("insertText:", "‘’", "moveBackward:");
"~_" = ("insertText:", "『』", "moveBackward:");

/* insert sig */
"~1" = ("insertText:", "  John\n\n\n☄");

Here's a example of ErgoEmacs Keybinding, one for QWERTY layout and one for Dvorak Keyboard Layout:

You can look at Xcode's keybinding file at /Developer/Applications/ You can view it here: osx_keybinding_xcode.dict.txt.

Emacs Keybinding

Mac OS X by default support emacs' keybindings. They are:

Mac OS X's default emacs keybindings
Ctrl+fmove forward
Ctrl+bmove backward
Ctrl+nmove down a line
Ctrl+pmove up a line
Ctrl+abeginning of line
Ctrl+eend of line
Ctrl+kdelete current position to end of line

You can add more of emacs's

Ctrl+spaceset mark
Ctrl+x Ctrl+xSwap cursor position to last mark

However, i don't recommend it. Emacs's keys is very inefficient and ergonomically painful. See: Why Emacs's Keyboard Shortcuts are Painful. If you like a efficient keybinding for text editing, you might try: ErgoEmacs Keybinding.


See: Problems of Mac OS X's Keybinding Scheme DefaultKeyBinding.dict.


Something DefaultKeyBinding.dict can't do. For example:

There are many solutions to these. See:

Mac: Key Remapping, Keybinding Tools

Best is to get a programable keyboard.

see Programable Keyboards with Onboard Memory


Note: the default keybinding config file used by the system is a XML file at: /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict. You don't have to do anything with that file. This is for your information only.