MacOS – Mimic Xcode’s camelCase selection keyboard shortcuts in OS X

keyboardmacostext;

I spend a very large amount of time editing text in Xcode, and I would like maneuvering around text within the rest of the Cocoa Text System to offer an identical experience. There are 3 versions of cursor keyboard shortcuts that I use regularly in Xcode (only showing forward, non-selection-altering versions for brevity):

  1. +Move cursor 1 subword forward (^camelCase -> camel^Case -> camelCase^)
  2. ⌥ Option+ Move cursor 1 word forward
  3. ⌘ Command+ Move cursor to the end of the line

The OS X default keybindings respect 2 and 3, but there is a disparity with 1. Outside of Xcode, + behaves like ⌘ Command+. It's not applicable terribly often, but every time + takes me to the end of a line in Mail or something, it's like a little firecracker goes off in my brain. It's just annoying enought that I'm willing to invest in any hackery to "fix" the behavior once and for all.

To avoid covering old ground, I'm already aware of this little tidbit, and this list of selectors, but I'm not aware of any API in the Cocoa Text System for subword selection. Maybe there's undocumented API in there somewhere?


I don't always attempt to make camelCase selections outside of Xcode with keyboard shortcuts, but when I do I want OS X to obey.

Best Answer

Sorry but what you want is not possible.

You could try adding the XCode keybindings that do this

"^\UF702" = "moveSubWordBackward:";                     /* Ctl-Left Arrow */
"^$\UF702" = "moveSubWordBackwardAndModifySelection:";  /* Ctl-Shift-Left Arrow */
"^\UF703" = "moveSubWordForward:";                      /* Ctl-Right Arrow */
"^$\UF703" = "moveSubWordForwardAndModifySelection:";   /* Ctl-Shift-Right Arrow */
"^\177" = "deleteSubWordBackward:";                     /* ctl-delete */
"^\UF728" = "deleteSubWordForward:";                    /* ctl-forwardDelete */

into your ~/Library/KeyBindings/DefaultKeyBindings.dict file but unless the application is written to respond to these methods, it won't work. As you've said, these methods are not part of the standard Text System so these calls in an app will just go unanswered or you will get a system beep.