DefaultKeyBinding.dict

Many of the shortcuts for editing text in OS X are defined in /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict. You can add custom keybindings by saving a property list like the one below as ~/Library/KeyBindings/DefaultKeyBinding.dict. Quit and reopen applications to apply changes to DefaultKeyBinding.dict.

My 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 (like option-E, option-I, option-N, option-U, and option-` in the U.S. keyboard layout) cannot be reassigned.

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 bound pageDown: to the page down key, because pageDown: doesn't do anything in web views.

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

delete:, setMark:, paste:, selectToMark: pastes text and selects the pasted text. If you remove delete:, 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 previous kills.

Shortcut strings

tab \U0009 \011 \t
enter \U000a \012 \n
return \U000d \015 \r
escape \U001b \033
delete \U007f \177
up \Uf700
down \Uf701
left \Uf702
right \Uf703
F1 \Uf704
F2 \Uf705
F3 \Uf706
F4 \Uf707
F5 \Uf708
F6 \Uf709
F7 \Uf70a
F8 \Uf70b
F9 \Uf70c
F10 \Uf70d
F11 \Uf70e
F12 \Uf70f
F13 \Uf710
F14 \Uf711
F15 \Uf712
F16 \Uf713
F17 \Uf714
F18 \Uf715
F19 \Uf716
F20 \Uf717
forward delete \Uf728
home \Uf729
end \Uf72b
page up \Uf72c
page down \Uf72d
clear \Uf739

control ^
option ~
shift $
command @
numpad #

The code points starting from f700 are listed in http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/CORPCHAR.TXT.

In other contexts like NSUserEquivalents dictionaries, delete is \U0008 (\b) and forward delete is \U007f.

Use escape sequences like  in XML property lists.

Methods

http://www.hcs.harvard.edu/~jrus/site/selectors.html
http://svn.gna.org/svn/gnustep/apps/gorm/tags/Gorm-0_1_0/ClassInformation.plist
NSResponder
NSApplication
NSDocument
NSTextView
NSWindow

NSResponder

capitalizeWord:
centerSelectionInVisibleArea:
deleteBackward:
deleteBackwardByDecomposingPreviousCharacter:
deleteForward:
deleteToBeginningOfLine:
deleteToBeginningOfParagraph:
deleteToEndOfLine:
deleteToEndOfParagraph:
deleteToMark:
deleteWordBackward:
deleteWordForward:
insertBacktab:
insertDoubleQuoteIgnoringSubstitution:
insertNewline:
insertNewlineIgnoringFieldEditor:
insertSingleQuoteIgnoringSubstitution:
insertTab:
insertTabIgnoringFieldEditor:
insertText:
lowercaseWord:
moveBackward:
moveBackwardAndModifySelection:
moveDown:
moveDownAndModifySelection:
moveForward:
moveForwardAndModifySelection:
moveLeft:
moveLeftAndModifySelection:
moveParagraphBackwardAndModifySelection:
moveParagraphForwardAndModifySelection:
moveRight:
moveRightAndModifySelection:
moveToBeginningOfDocument:
moveToBeginningOfDocumentAndModifySelection:
moveToBeginningOfLine:
moveToBeginningOfLineAndModifySelection:
moveToBeginningOfParagraph:
moveToBeginningOfParagraphAndModifySelection:
moveToEndOfDocument:
moveToEndOfDocumentAndModifySelection:
moveToEndOfLine:
moveToEndOfLineAndModifySelection:
moveToEndOfParagraph:
moveToEndOfParagraphAndModifySelection:
moveToLeftEndOfLine:
moveToLeftEndOfLineAndModifySelection:
moveToRightEndOfLine:
moveToRightEndOfLineAndModifySelection:
moveUp:
moveUpAndModifySelection:
moveWordBackward:
moveWordBackwardAndModifySelection:
moveWordForward:
moveWordForwardAndModifySelection:
moveWordLeft:
moveWordLeftAndModifySelection:
moveWordRight:
moveWordRightAndModifySelection:
pageDown:
pageDownAndModifySelection:
pageUp:
pageUpAndModifySelection:
scrollLineDown:
scrollLineUp:
scrollPageDown:
scrollPageUp:
scrollToBeginningOfDocument:
scrollToEndOfDocument:
selectAll:
selectLine:
selectParagraph:
selectToMark:
selectWord:
setMark:
swapWithMark:
transpose:
uppercaseWord:
yank:

Other classes

copy:
cut:
delete:
paste:
pasteAsPlainText:
redo:
undo:
yankAndSelect:

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:;
}

http://www.hcs.harvard.edu/~jrus/site/KeyBindings/Emacs%20Opt%20Bindings.dict 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.

StandardKeyBinding.dict

$ plutil -convert xml1 /System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict -o -|pl|grep -v noop:|ruby -pe '$_.gsub!(/[^ -~\n]/){"\\U%04x"%$&.ord}'|sed 's/  / /g'
{
  "\U0003" = "insertNewline:";
  "\b" = "deleteBackward:";
  "\t" = "insertTab:";
  "\n" = "insertNewline:";
  "\U000d" = "insertNewline:";
  "\U0019" = "insertBacktab:";
  "\U001b" = "cancelOperation:";
  "$\Uf700" = "moveUpAndModifySelection:";
  "$\Uf701" = "moveDownAndModifySelection:";
  "$\Uf702" = "moveLeftAndModifySelection:";
  "$\Uf703" = "moveRightAndModifySelection:";
  "$\Uf729" = "moveToBeginningOfDocumentAndModifySelection:";
  "$\Uf72b" = "moveToEndOfDocumentAndModifySelection:";
  "$\Uf72c" = "pageUpAndModifySelection:";
  "$\Uf72d" = "pageDownAndModifySelection:";
  "@ " = "cycleToNextInputScript:";
  "@$\Uf700" = "moveToBeginningOfDocumentAndModifySelection:";
  "@$\Uf701" = "moveToEndOfDocumentAndModifySelection:";
  "@$\Uf702" = "moveToLeftEndOfLineAndModifySelection:";
  "@$\Uf703" = "moveToRightEndOfLineAndModifySelection:";
  "@." = "cancelOperation:";
  "@^ " = "togglePlatformInputSystem:";
  "@^\Uf701" = "makeBaseWritingDirectionNatural:";
  "@^\Uf702" = "makeBaseWritingDirectionRightToLeft:";
  "@^\Uf703" = "makeBaseWritingDirectionLeftToRight:";
  "@~ " = "cycleToNextInputKeyboardLayout:";
  "@~^\Uf701" = "makeTextWritingDirectionNatural:";
  "@~^\Uf702" = "makeTextWritingDirectionRightToLeft:";
  "@~^\Uf703" = "makeTextWritingDirectionLeftToRight:";
  "@\U007f" = "deleteToBeginningOfLine:";
  "@\Uf700" = "moveToBeginningOfDocument:";
  "@\Uf701" = "moveToEndOfDocument:";
  "@\Uf702" = "moveToLeftEndOfLine:";
  "@\Uf703" = "moveToRightEndOfLine:";
  "^\U0003" = "insertLineBreak:";
  "^\t" = "selectNextKeyView:";
  "^\n" = "insertLineBreak:";
  "^\U000d" = "insertLineBreak:";
  "^\U0019" = "selectPreviousKeyView:";
  "^\"" = "insertDoubleQuoteIgnoringSubstitution:";
  "^$\Uf702" = "moveToLeftEndOfLineAndModifySelection:";
  "^$\Uf703" = "moveToRightEndOfLineAndModifySelection:";
  "^'" = "insertSingleQuoteIgnoringSubstitution:";
  "^/" = "insertRightToLeftSlash:";
  "^A" = "moveToBeginningOfParagraphAndModifySelection:";
  "^B" = "moveBackwardAndModifySelection:";
  "^E" = "moveToEndOfParagraphAndModifySelection:";
  "^F" = "moveForwardAndModifySelection:";
  "^N" = "moveDownAndModifySelection:";
  "^P" = "moveUpAndModifySelection:";
  "^V" = "pageDownAndModifySelection:";
  "^a" = "moveToBeginningOfParagraph:";
  "^b" = "moveBackward:";
  "^d" = "deleteForward:";
  "^e" = "moveToEndOfParagraph:";
  "^f" = "moveForward:";
  "^h" = "deleteBackward:";
  "^k" = "deleteToEndOfParagraph:";
  "^l" = "centerSelectionInVisibleArea:";
  "^n" = "moveDown:";
  "^o" =   (
    "insertNewlineIgnoringFieldEditor:",
    "moveBackward:"
  );
  "^p" = "moveUp:";
  "^t" = "transpose:";
  "^v" = "pageDown:";
  "^y" = "yank:";
  "^~\U007f" = "deleteWordBackward:";
  "^\U007f" = "deleteBackwardByDecomposingPreviousCharacter:";
  "^\Uf700" = "scrollPageUp:";
  "^\Uf701" = "scrollPageDown:";
  "^\Uf702" = "moveToLeftEndOfLine:";
  "^\Uf703" = "moveToRightEndOfLine:";
  "~\U0003" = "insertNewlineIgnoringFieldEditor:";
  "~\b" = "deleteWordBackward:";
  "~\t" = "insertTabIgnoringFieldEditor:";
  "~\n" = "insertNewlineIgnoringFieldEditor:";
  "~\U000d" = "insertNewlineIgnoringFieldEditor:";
  "~\U001b" = "complete:";
  "~$\Uf700" = "moveParagraphBackwardAndModifySelection:";
  "~$\Uf701" = "moveParagraphForwardAndModifySelection:";
  "~$\Uf702" = "moveWordLeftAndModifySelection:";
  "~$\Uf703" = "moveWordRightAndModifySelection:";
  "~^B" = "moveWordBackwardAndModifySelection:";
  "~^F" = "moveWordForwardAndModifySelection:";
  "~^b" = "moveWordBackward:";
  "~^f" = "moveWordForward:";
  "~\U007f" = "deleteWordBackward:";
  "~\Uf700" =   (
    "moveBackward:",
    "moveToBeginningOfParagraph:"
  );
  "~\Uf701" =   (
    "moveForward:",
    "moveToEndOfParagraph:"
  );
  "~\Uf702" = "moveWordLeft:";
  "~\Uf703" = "moveWordRight:";
  "~\Uf728" = "deleteWordForward:";
  "~\Uf72c" = "pageUp:";
  "~\Uf72d" = "pageDown:";
  "\U007f" = "deleteBackward:";
  "\Uf700" = "moveUp:";
  "\Uf701" = "moveDown:";
  "\Uf702" = "moveLeft:";
  "\Uf703" = "moveRight:";
  "\Uf708" = "complete:";
  "\Uf728" = "deleteForward:";
  "\Uf729" = "scrollToBeginningOfDocument:";
  "\Uf72b" = "scrollToEndOfDocument:";
  "\Uf72c" = "scrollPageUp:";
  "\Uf72d" = "scrollPageDown:";
  "\Uf739" = "delete:";
}

See also

http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html
http://www.hcs.harvard.edu/~jrus/site/
https://developer.apple.com/library/mac/documentation/cocoa/conceptual/eventoverview/TextDefaultsBindings/TextDefaultsBindings.html
https://github.com/ttscoff/KeyBindings/blob/master/DefaultKeyBinding.dict