Do you need help on a specific subject? Use the contact form (Request a blog entry) on the right hand side.

2015-03-31

Key bindings, part 2

A follow up on my post from yesterday.
Using a utility called "KeyBindingsEditor" I created the following table. It shows the contents of the StandardKeyBinding.dict file. You can use that editor to create your own key bindings as well.

/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict:

Modifiers Key Mapped to NSResponder functions

Esc cancelOperation:
. cancelOperation:
L centerSelectionInVisibleArea:

F5 complete:
Esc complete:
⌘⌥ Space cycleToNextInputKeyboardLayout:
Space cycleToNextInputScript:

Clear Line delete:

Delete deleteBackward:

Backspace deleteBackward:
H deleteBackward:
Delete deleteBackwardByDecomposingPreviousCharacter:
D deleteForward:

Del deleteForward:
Delete deleteToBeginningOfLine:
K deleteToEndOfParagraph:
Backspace deleteWordBackward:
⌃⌥ Delete deleteWordBackward:
Delete deleteWordBackward:
Del deleteWordForward:

BackTab insertBacktab:
" insertDoubleQuoteIgnoringSubstitution:
Linefeed insertLineBreak:
Return insertLineBreak:
Enter insertLineBreak:

Enter insertNewline:

Linefeed insertNewline:

Return insertNewline:
Enter insertNewlineIgnoringFieldEditor:
Linefeed insertNewlineIgnoringFieldEditor:
Return insertNewlineIgnoringFieldEditor:
O insertNewlineIgnoringFieldEditor:
moveBackward:
/ insertRightToLeftSlash:

insertSingleQuoteIgnoringSubstitution:

Tab insertTab:
Tab insertTabIgnoringFieldEditor:
⌘⌃ Right Arrow makeBaseWritingDirectionLeftToRight:
⌘⌃ Down Arrow makeBaseWritingDirectionNatural:
⌘⌃ Left Arrow makeBaseWritingDirectionRightToLeft:
⌘⌥⌃ Right Arrow makeTextWritingDirectionLeftToRight:
⌘⌥⌃ Down Arrow makeTextWritingDirectionNatural:
⌘⌥⌃ Left Arrow makeTextWritingDirectionRightToLeft:
B moveBackward:
Up Arrow moveBackward:
moveToBeginningOfParagraph:
⇧⌃ B moveBackwardAndModifySelection:

Down Arrow moveDown:
N moveDown:
Down Arrow moveDownAndModifySelection:
⇧⌃ N moveDownAndModifySelection:
F moveForward:
Down Arrow moveForward:
moveToEndOfParagraph:
⇧⌃ F moveForwardAndModifySelection:

Left Arrow moveLeft:
Left Arrow moveLeftAndModifySelection:
⌥⇧ Up Arrow moveParagraphBackwardAndModifySelection:
⌥⇧ Down Arrow moveParagraphForwardAndModifySelection:

Right Arrow moveRight:
Right Arrow moveRightAndModifySelection:
Up Arrow moveToBeginningOfDocument:
Home moveToBeginningOfDocumentAndModifySelection:
⌘⇧ Up Arrow moveToBeginningOfDocumentAndModifySelection:
A moveToBeginningOfParagraph:
⇧⌃ A moveToBeginningOfParagraphAndModifySelection:
Down Arrow moveToEndOfDocument:
End moveToEndOfDocumentAndModifySelection:
⌘⇧ Down Arrow moveToEndOfDocumentAndModifySelection:
E moveToEndOfParagraph:
⇧⌃ E moveToEndOfParagraphAndModifySelection:
Left Arrow moveToLeftEndOfLine:
Left Arrow moveToLeftEndOfLine:
⌃⇧ Left Arrow moveToLeftEndOfLineAndModifySelection:
⌘⇧ Left Arrow moveToLeftEndOfLineAndModifySelection:
Right Arrow moveToRightEndOfLine:
Right Arrow moveToRightEndOfLine:
⌃⇧ Right Arrow moveToRightEndOfLineAndModifySelection:
⌘⇧ Right Arrow moveToRightEndOfLineAndModifySelection:

Up Arrow moveUp:
P moveUp:
Up Arrow moveUpAndModifySelection:
⇧⌃ P moveUpAndModifySelection:
⌥⌃ B moveWordBackward:
⇧⌥⌃ B moveWordBackwardAndModifySelection:
⌥⌃ F moveWordForward:
⇧⌥⌃ F moveWordForwardAndModifySelection:
Left Arrow moveWordLeft:
⌥⇧ Left Arrow moveWordLeftAndModifySelection:
Right Arrow moveWordRight:
⌥⇧ Right Arrow moveWordRightAndModifySelection:
Page Down pageDown:
V pageDown:
⇧⌃ V pageDownAndModifySelection:
Page Down pageDownAndModifySelection:
Page Up pageUp:
Page Up pageUpAndModifySelection:
Down Arrow scrollPageDown:

Page Down scrollPageDown:
Up Arrow scrollPageUp:

Page Up scrollPageUp:

Home scrollToBeginningOfDocument:

End scrollToEndOfDocument:
Tab selectNextKeyView:
BackTab selectPreviousKeyView:
⌘⌃ Space togglePlatformInputSystem:
T transpose:
Y yank:

Just in case, the ^ modifier is the Ctrl key.

As you possibly noticed, this is not limited to the editing commands but it is the complete mapping table.
You can also see that not all NSResponder functions have an associated key mapping. If you implement a function in NSResponder without a mapping, be sure to add a menu item as well so that the user is actually able to use that function! (Or be sure to decompose the key mapping yourself in keyDown)

Note that not all mappings are available on all keyboards!, i.e. keys may be missing on certain types of keyboard. Make sure that the key's for the mappings that you need are indeed available on all the keyboards your application supports.

A source of confusion is the "Delete" key. This is not to be confused with the "Del" key. On some keyboards the "Del" key has the imprint "delete ⌦".

The following table shows which editing related NSResponder functions are not mapped by default:

    func moveToBeginningOfLine(sender: AnyObject?)
    func moveToEndOfLine(sender: AnyObject?)
    func moveToBeginningOfLineAndModifySelection(sender: AnyObject?)
    func moveToEndOfLineAndModifySelection(sender: AnyObject?)
    func scrollLineUp(sender: AnyObject?)
    func scrollLineDown(sender: AnyObject?)
    func transposeWords(sender: AnyObject?)
    func selectAll(sender: AnyObject?)
    func selectParagraph(sender: AnyObject?)
    func selectLine(sender: AnyObject?)
    func selectWord(sender: AnyObject?)
    func indent(sender: AnyObject?)
    func insertParagraphSeparator(sender: AnyObject?)
    func insertNewlineIgnoringFieldEditor(sender: AnyObject?)
    func insertTabIgnoringFieldEditor(sender: AnyObject?)
    func insertLineBreak(sender: AnyObject?)
    func insertContainerBreak(sender: AnyObject?)
    func changeCaseOfLetter(sender: AnyObject?)
    func uppercaseWord(sender: AnyObject?)
    func lowercaseWord(sender: AnyObject?)
    func capitalizeWord(sender: AnyObject?)
    func deleteToEndOfLine(sender: AnyObject?)
    func deleteToBeginningOfParagraph(sender: AnyObject?)
    func setMark(sender: AnyObject?)
    func deleteToMark(sender: AnyObject?)
    func selectToMark(sender: AnyObject?)
    func swapWithMark(sender: AnyObject?)

Some of these functions are duplicates of the ones that are mapped. So be sure to implement the right function. For example "moveToEndOfLine:" is not mapped, but "moveRightToEndOfLine:" is. So use the later for this functionality.

Other functions are not mapped in StandardKeyBinding.dict but are "mapped" in a menu item, like "selectAll:".

Still, there may be some functions that are useful to your application (like "transposeWords:" or "capitalizeWord:" etc). The way to use these is to provide menu-items for them, and to include Key Equivalent's for them in those menu items. Even for some less used functions like "transpose:" this may be useful as it shows your user that these relatively unknown functions are in fact available.

Happy coding...

Did this help?, then please help out a small independent.
If you decide that you want to make a small donation, you can do so by clicking this
link: a cup of coffee ($2) or use the popup on the right hand side for different amounts.
Payments will be processed by PayPal, receiver will be sales at balancingrock dot nl
Bitcoins will be gladly accepted at: 1GacSREBxPy1yskLMc9de2nofNv2SNdwqH

We don't get the world we wish for... we get the world we pay for.