macOS: Create Custom Keyboard Layout

By Xah Lee. Date: . Last updated: .

MacOS has a system-wide way to let you define or modify shortcut keys for text editing operations.

You can create keys to:

macOS 10.15.5 keyboard viewer 2020-07
MacOS Keyboard Viewer. macOS 10.15.5, 2020-07-25.

Key Config File

Create a file at

~/Library/KeyBindings/DefaultKeyBinding.dict

Create the “KeyBindings” folder if you don't already have it.

Copy and past the following:

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

{
/* insert Unicode character with Option key down */
"~h" = ("insertText:", "♥");
"~t" = ("insertText:", "😄");
"~c" = ("insertText:", "😠");
"~s" = ("insertText:", "😮");

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

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

macOS TextEdit save utf8 2020-07-25 XTPPS
macOS TextEdit save utf8 2020-07-25
Mac TextEdit app 2020-07-25 28T83
TextEdit app

Launch or restart TextEdit or other app to start to use your changes.

The syntax in general is this:

/* this is comment */
{
keycode1 = actionCode1;
keycode2 = actionCode2;
}

Keycode Syntax

Mac OS X Keybinding Key Syntax

Action Code

Mac OS X Keybinding Action Code

Unicode Reference

If you want to create lots keys to insert math symbols or emoji, see

Unicode Search 😄

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 is 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 http://example.com/\n\n☄");
}

Here is 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/Xcode.app/Contents/Resources/PBKeyBinding.dict. You can view it here: osx_keybinding_xcode.dict.txt .

Emacs Keybinding

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

Ctrl+f
Move forward
Ctrl+b
Move backward
Ctrl+n
Move down a line
Ctrl+p
Move up a line
Ctrl+a
Beginning of line
Ctrl+e
End of line
Ctrl+k
Delete current position to end of line
Ctrl+y
Paste

You can add more of emacs's

Ctrl+space
Set mark
Ctrl+w
Cut
Ctrl+x Ctrl+x
Swap 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, try: Emacs: Xah Fly Keys .

Problems

Something this cannot do. For example:

There are many solutions to these. See: Mac Keyboard Software Guide

Best is to get a programable keyboard. See: Programable Keyboards with Onboard Memory

See also: Problems of Mac OS X DefaultKeyBinding.dict .

Reference

Mac Keyboard Guide