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 creating ~/Library/KeyBindings/ and 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. 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

{
  "^ " = 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