
Menus are similar and dismiss automatically upon the selection of an action. Where key chords are generally more temporary states, enabling a behavior only if all the right keys are pressed in close proximity spatially and temporally, a 'mode' let's you toggle into a state where keys react differently until it is dismissed.

What really pushed me over the line of I have to try this now was seeing those same home-row keys used for cursor movement -and- window positioning in a consistent way. Mostly though, I'm thinking about not having to pinky stretch down to those tiny cursor keys or reposition the whole right hand each time I want to navigate the cursor from a laptop keyboard. I thought it would be nice to form the muscle memory for those h/j/k/l vi cursor movement keys as a side benefit for when I might occasionally run vi on a remote server. Those keys are all lying right under the fingertips of where the left hand is already positioned, minimizing the needed movement. With hand in place, pressing down the 's' and 'd', you can press 'a' to add the option/alt modifier, 'f' to add cmd modifier, or spacebar to add shift modifier. You may recognize these commonly used vi cursor movement keys. 'h' for left, 'j' for down, 'k' for up, 'l' for right. Here's how it works: while 's' and 'd' are pressed and held with the left hand, you use the right hand to press h to move the cursor left. waaaaaaaat? That new modifier is then leveraged for some home row centric key bindings that can substitute for moving your right hand or stretching the right pinky down to the arrow keys. So, the aforementioned JR's setup has a 'super duper' behavior where pressing the 's' and 'd' keys at the same time acts almost like another new modifier key. Karabiner can enable key chords too, but I found the nuances of getting it implemented well in Karabiner, for alpha keys, with the current version, to be painful.

Additionally, tab can be rigged up to act as a modifier in conjunction with the hyper key to enable quick access to home/end/pgdn/pgup – which is especially awesome when you are on a laptop keyboard. With this Karabiner recipe enabled, you press a hyper key and then h/j/k/l to move the cursor left/down/up/right. Then, mid-way through patting myself on the back, I discovered global vi mode with a hyper key and Karabiner. I like keyboard shortcuts bound to keys based on a pnemonic, so binding my global spectacle keyboard shortcut cheatsheet to hyper+k seemed like a good, quick win that would help me memorize those Spectacle shortcuts. Having an extra meta key with a whole slew of nonconflicting keybinding slots seemed awesome. I had combed through many blogs and git repositories. After my initial experiments using Karabiner to bind a keyboard shortcut to an image-based cheatsheet and leverage a hyper key to avoid application level key binding conflicts and finger twister, I was super excited.
