Do you think typing fast, i.e., achieving a high wpm (high word-per-minutes), is the only way to be efficient/productive? If you do, then this compact, 5-mins read post will blow your mind, making you even faster.1
What I'm going to share is not about how you can be fast in regular typesetting, e.g., achieving wpm 150 in monkeytype. Rather, it's about some of the most fundamental editing-related key remaps I have done.
Before walking through my key remaps one by one, I want to give you the mentality you should have when adapting my settings: Your hands should move as little as possible. You might already hear this multiple times, but you should bring this to an extreme, i.e., staying your hand on the main row (i.e., right index finger on
f, left index finger on
j) is the bare minimum you should achieve.
Let me ask you: How do you typically delete a character? If you
backspace) with your right little finger traveling across 2 columns and 2 rows,
then you should keep reading.
I will use macOS and Karabiner-Elements as our working example, but the same concept should be easily ported to other operating systems. The following is a snapshot of my setting.
You can easily import these settings at the end, which can be used as your own setting's starting point. Now, let's walk through them one by one.
Have you ever used your right
instead of using
→, we now use
l (in normal mode)!
Now the question is, WHY? Well, imagine you're editing texts, and want to change something 3 characters before the cursor, what should you do? Using arrow keys would be a natural choice if you're not in Vim. But remember that your arrow keys are far away from the main row of your keyboard.
To address this, we simply adapt Vim's solution, i.e., using
l as arrow keys. However, unlike in Vim where we have normal mode and insert mode, using
l as arrow keys in normal mode would not be a problem. Contrarily, we now need to maintain the ability to insert alphabets
l. The solution is also simple: use a modifier. I use
You might notice that I use the
right cmd instead of just
cmd. This is because
l might be your other shortcuts, and entirely overloading them to arrow keys is not ideal. Hence, by specifying only
l as arrow keys, it
- preserve the potential shortcuts; and
lonly uses your right hand which is very natural (you just need to press the
right cmdwith your right thumb, and you can use arrow keys just like you're in Vim wherever you are).
We saw that you can use your
right cmd as a special modifier, and now we want to extend this theme. I typeset math-related characters quite often, e.g.,
}. Most of them are on the top row and need a modifier (usually
shift). And this is not very intuitive and still, some of them (e.g.,
_) are far from the main column (w.r.t. your little finger) and the main row. So, I use
Here is my justification for this setup:
- It's easy to type: All of them are around the main row of your left hand (and your right hand is only responsible for the
- It's easy to remember: They're quite symmetric (e.g.,
v, up and down, respectively).
- It's more accurate: It's not easy to type
=on the first try with your right little finger in the ordinary setup.
- It's more comfortable: The most frequently used characters, i.e.,
-, are configured to your index finger and middle finger, respectively.
Long and Short Press
If you notice that some keys are only designed for long-press but never exploit it, then keep reading.
Again, if you use Vim, then you will need to use
esc intensively. Hence, some might suggest you remap the
caps lock to
However, in my case, I'm using HHKB, i.e., the usual position for
caps lock is
To make thing consistent, I also remap
caps lockon my MacBook to
So, should we directly remap
esc? No! Observe that
control is used as a modifier, i.e., you never click
control on its own. By exploiting this fact, we can
control to be
esc if it's pressed alone.
Specifically, if I press
control for less than a threshold called
alone threshold (e.g., 0.15 seconds), then it'll be recognized as
esc; and if I press
control for more than a threshold called
hold-down threshold (e.g., 0.04 seconds), then it'll be recognized as
control and can then be used as a modifier.3
Left and Right Shift
Now we know we can use long press and single press separately, we can overload other modifiers in the same way as well! I do not go all the way to overload every modifier however; I only overload both
You might not want to do this for every modifier such as
cmdto be honest... It's very possible that you will accidentally trigger them when you're trying out what shortcut you're going to use (e.g., when you're copying things using
c, it's possible to press
cmdalone and release it when you realize you don't want to actually copy the selected texts).
left shift, I configure it as
caps lock when
left shift is pressed alone.
This is because I'm bilingual, and I need to be able to switch the input language on the fly (actually the macOS default
caps lock is the fastest way to switch the input language in my experience). So, I leave it as it is on the system level, and modify the
left shift to be
caps lock when it's pressed alone. It works quite well in practice.
right shift, I do something more crazy:
right shift is pressed alone, it acts as
delete is pressed alone
right shift is pressed twice and is held on the second press, it acts as
delete is held down.
The first one is clear: I don't want to reach my little finger to the usual
delete spot since it's far away4, and it's natural to remap
delete to the
right shift since it's an easy reach for my right little finger.
But there's a problem: you now can't hold
delete for a consecutive deletion since holding it is equivalent to holding the
right shift. To fix this, I come up with the above-mentioned solution, that is, you can trigger the hold-down action for
right shiftalone first, and
right shiftagain and holding it.
Intuitive, right? That's all I want to share.
To import others' settings in Karabiner-Elements, I don't know any easy (i.e., 1-click) way to do it. But the basic steps are as follows.
- Open Karabiner-Elements, go to Misc and click on Export & Import.
- Again open Karabiner-Elements, go to Complex Modifications and click on Add rule.
- You should be able to enable these rules easily.
Finally, you can also set up your Parameters as mine:
- In the sense of efficiency, go without saying.↩
- If you're interested in learning more about HHKB, go to hhkb.io.↩
- You might notice that it's possible to have conflict, i.e., if you press
controlfor 0.1 seconds, then it'll trigger both
esc. However, it's fine since
controlis a modifier but is not combined with
esc. You don't want your
hold-down thresholdto be too long (e.g., 0.15 seconds to avoid conflict) because then whenever you want to use
controlas a modifier combined with other keys to trigger a shortcut, you'll need to hold
controlfor that long.↩
- Also, on the HHKB layout, the
deletekey is on the usual
\key's spot, which is quite awkward for me. So I remap the
deleteon my HHKB to
\on the system level; this means, the
deletekey is now completely gone on my HHKB.↩
- If you came from VSCode-LaTeX-Inkscape, then you add