Swift implementation of the Homerow and Tab keyboard remapping modes for macOS. Ergonomics over mnemonics.
Homerow and Tab modes were initially implemented and maintained in the original Karabiner app, which stopped working in 2007 because of the keyboard driver architecture changes in macOS Sierra. Karabiner-Elements was released as a replacement for Karabiner, however it took a long time until Karabiner-Elements supported all the functionality necessary for Homerow and Tab modes to work. Without prospects of seeing Karabiner-Elements support these modes which I relied upon daily for code/text editing, I decided to implement them myself in a dedicated app. The initial implementation was in Objective-C. It was later re-written through different versions of Swift as they were released. Today Octopus implements these modes in a way, which I still don't think is possible with Karabiner-Elements.
Each mode is active only while the respective activation key is pressed (eg. space / tab). The objective is to increase system-wide speed and comfort of navigation and text manipulation with the keyboard, while minimizing hand movement. Ergonomic key mappings are prioritized over mnemonic ones. This means that the most used actions are placed closer to the homerow mode, and not mapped according to characters that would make them easier to remember.
For general text editing and manipulation. Active while the Space key is pressed:
-
Directional keys: JKLI -> LeftDownRightUp
-
Editing:
- Y -> ⌘ Delete
- U -> Delete
- O -> Space
- P -> Forward Delete
-
Undo / Redo:
- H -> ⌘Z
- N -> ⌘ShiftZ
-
Return / Escape
- ; -> Return
- ' -> Esc
-
Left hand, modifiers:
- A -> Shift
- S -> Control
- D -> Option
- F -> Command
- G -> Hyper
-
Left hand, single press:
- A -> ⌃S (select word under cursor)
- S -> ⌘X (cut)
- D -> ⌘C (copy)
- F -> ⌘V (paste)
- F -> ⌘G (duplicate)
For app, window, and tab navigation and management. Active while the Tab ⇥ key is pressed
- J/L: switch between apps
- I/K: switch between windows of the active app
- U/O: switch betwen tabs
- Y: close tab
- ;: new tab
- ': quit application