Home Row Arrow Keys on OS X with Karabiner
Published 2015-1-20TL;DR
Open Karabiner's Preferences -> Misc & Uninstall -> Open private.xml.
Set this as your file:
<?xml version="1.0"?>
<root>
<item>
<name>Home Row Arrow Keys: FN + IJKL to ^<>v</name>
<identifier>private.coolaj86_fn_homerowarrows</identifier>
<autogen>
__KeyToKey__
KeyCode::I,
ModifierFlag::FN
KeyCode::CURSOR_UP
</autogen>
<autogen>
__KeyToKey__
KeyCode::J,
ModifierFlag::FN
KeyCode::CURSOR_LEFT
</autogen>
<autogen>
__KeyToKey__
KeyCode::K,
ModifierFlag::FN
KeyCode::CURSOR_DOWN
</autogen>
<autogen>
__KeyToKey__
KeyCode::L,
ModifierFlag::FN
KeyCode::CURSOR_RIGHT
</autogen>
</item>
<item>
<name>Home Row Arrow Keys: COMMAND_L + SHIFT_L + IJKL to ^<>v</name>
<identifier>private.coolaj86_cmd_shift_homerowarrows</identifier>
<autogen>
__KeyToKey__
KeyCode::I,
ModifierFlag::COMMAND_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_UP
</autogen>
<autogen>
__KeyToKey__
KeyCode::J,
ModifierFlag::COMMAND_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_LEFT
</autogen>
<autogen>
__KeyToKey__
KeyCode::K,
ModifierFlag::COMMAND_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_DOWN
</autogen>
<autogen>
__KeyToKey__
KeyCode::L,
ModifierFlag::COMMAND_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_RIGHT
</autogen>
</item>
</root>
Reload XML and then search in Karabiner for the Home Row settings and check the ones you like.
Why?
Hi, I'm AJ. I use a bluetooth Apple keyboard and recently my wrist has been bothering me because I've been using the arrow keys a lot, which are very inconveniently located - too close to my right hand to justify picking it up and moving it, too far to avoid repetitive wrist strain.
Over the years Ergonomics have become more and more important to me.
- in high school, I switched to Dvorak.
- in college I remapped my CapsLock to Delete.
- about that same week I changed
- Right Option to Esc
- Right Command to Enter
- Today I mapped
- Backspace to Forward Delete (0x75 or 117) - so that I don't have to hit FN (which is a little bit of wrist strain) as often
- Shift + Command + IJKL to Arrow Keys (which on Dvorak is CDTN)
Install Seil & Karabiner
I'm gonna teach you how to use FN, CapsLock, Command, or whatever plus IJKL, WASD, or whatever to put the arrow keys right at your fingertips.
First off, you're gonna need two programs:
Note: Karabiner will reset your Key Delay and Key Repeat rates to the default, but you can easily change them back on the Key Repeat tab.
Note: Karabiner maps FN + right hand to act as numpad by default. Turn this off by selecting Disable NumPad Hack.
IMPORTANT:
Do you fall into either of these categories?
- you use anything non-Qwerty - Dvorak, Colemak, etc
- you already use Seil for other keymappings
If so, pay attention in the next step. You need to test that the keycodes you think you're sending are the ones you're actually sending!
Open Karabiner's Event Viewer
Once Karabiner is installed, open up the EventViewer
Now try pressing some keys and watching what happens.
Try pressing fn
. Try I
. Try CapsLock
.
Okay, now decide which key you want to map to Up Arrow.
I chose SHIFT_L + COMMAND_L + C
, so I tried them one at a time
and here's what I saw:
eventType | code | name | flags | misc |
---|---|---|---|---|
keyMod | 0x38 | Shift_L | Shift | KeyCode::SHIFT_L characters: |
keyMod | 0x37 | Command_L | Cmd | KeyCode::COMMAND_L characters: |
keyDown | 0x22 | c | KeyCode::I characters:c |
Notice that I use Dvorak, so c
shows up as KeyCode::I
.
Most people, however, will see KeyCode::I characters:i
.
Set your layout in Karabiner's private.xml
Go to Preferences -> Misc & Uninstall
and click the button Open private.xml
.
That will open the containing folder and you can then use SublimeText 2
or
whatever you prefer to edit it.
Example: FN + I as Up Arrow
<?xml version="1.0"?>
<root>
<item>
<name>Home Row Arrow Keys: IJKL to ^<>v</name>
<identifier>private.coolaj86_homerowarrows</identifier>
<autogen>
__KeyToKey__
KeyCode::I,
ModifierFlag::FN,
KeyCode::CURSOR_UP
</autogen>
<!-- more defined below -->
</item>
</root>
Example: Cmd_L + Shift_L + K as Down Arrow
<?xml version="1.0"?>
<root>
<item>
<name>Home Row Arrow Keys: IJKL to ^<>v</name>
<identifier>private.coolaj86_homerowarrows</identifier>
<!-- snip snip -->
<autogen>
__KeyToKey__
KeyCode::K,
ModifierFlag::COMMAND_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_DOWN
</autogen>
<!-- snip snip -->
</item>
</root>
Test that it works
- Save your
private.xml
- Navigate to Karabiner -> Prefences -> Change Key (the first tab)
- Click Reload XML
- Search for Home Row
- Check the checkboxes
- Test in a document and also look at the events in EventView
Common Problems
Just a few things to check first:
Using CapsLock and other Modifiers
If you decide to use CapsLock, you'll need to change your system settings.
System Settings
Keyboard
Keyboard
Modifier Keys...
Select Keyboard: *** REPEAT THESE STEPS FOR EACH KEYBARDS ***
Caps Lock: **No Action**
There may be cases where it makes sense to turn off the functionality of other modifiers as well.
Using FN
Karabiner maps FN
+ right hand
to numpad
by default. Turn this
off by selecting Disable NumPad Hack.
System Settings
Dictation & Speech
Dictation: Off
Shortcut: Off
You could leave Dictation on, but you'd definitely need to change which key is the shortcut for it.
My private.xml
<?xml version="1.0"?>
<root>
<item>
<name>Home Row Arrow Keys: FN + IJKL to ^<>v</name>
<identifier>private.coolaj86_fn_homerowarrows</identifier>
<autogen>
__KeyToKey__
KeyCode::I,
ModifierFlag::FN,
KeyCode::CURSOR_UP
</autogen>
<autogen>
__KeyToKey__
KeyCode::J,
ModifierFlag::FN,
KeyCode::CURSOR_LEFT
</autogen>
<autogen>
__KeyToKey__
KeyCode::K,
ModifierFlag::FN,
KeyCode::CURSOR_DOWN
</autogen>
<autogen>
__KeyToKey__
KeyCode::L,
ModifierFlag::FN,
KeyCode::CURSOR_RIGHT
</autogen>
</item>
<item>
<name>Home Row Arrow Keys: Cmd + Shift + IJKL to ^<>v</name>
<identifier>private.coolaj86_cmd_shift_homerowarrows</identifier>
<autogen>
__KeyToKey__
KeyCode::I,
ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_UP
</autogen>
<autogen>
__KeyToKey__
KeyCode::J,
ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_LEFT
</autogen>
<autogen>
__KeyToKey__
KeyCode::K,
ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_DOWN
</autogen>
<autogen>
__KeyToKey__
KeyCode::L,
ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_RIGHT
</autogen>
</item>
<item>
<name>Home Row Arrow Keys: P,COMMA to >,v</name>
<identifier>private.coolaj86_p_comma_homerowarrows</identifier>
<autogen>
__KeyToKey__
KeyCode::P,
ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_RIGHT
</autogen>
<autogen>
__KeyToKey__
KeyCode::P,
ModifierFlag::FN,
KeyCode::CURSOR_RIGHT
</autogen>
<autogen>
__KeyToKey__
KeyCode::COMMA,
ModifierFlag::FN,
KeyCode::CURSOR_DOWN
</autogen>
<autogen>
__KeyToKey__
KeyCode::COMMA,
ModifierFlag::SHIFT_L | ModifierFlag::COMMAND_L,
KeyCode::CURSOR_DOWN
</autogen>
</item>
</root>
I also include P
as right
and COMMA
as down
because that's how the vim
right and left map to qwerty from dvorak.
By AJ ONeal
Did I make your day?
Buy me a coffee
(you can learn about the bigger picture I'm working towards on my patreon page )