Things you can do with a programmable keyboard

I love tools. Whether they are hardware or software, tools are the things that empower humans to build. And so I highly value good tools as they allow us to build things better, faster and/or more easily. As a software engineer my most used tools are my text editor, my terminal emulator and my window manager and therefore I spend a lot —some would say too much- of time customizing them as the best tools should fit the hand of their user. And in the physical world we have computers, keyboards and mouses which are the essential tools for writing software.


Figure 1: The ergodox EZ

Over the years I have bought many keyboards with varying degrees of quality, noise or actuation force required. But I recently went further and bought my first fully programmable keyboard -and also first split layout keyboard- : the ErgoDox EZ. A programmable keyboard means you can fully customize what happens when you press/release a key. For the Ergodox EZ you can do so through an excellent online tool but this tool still has it’s limitations. So I went another route and decided to configure my keyboard directly through it’s firmware instead : the powerful and open-source QMK firmware. You can find my WIP configuration on GitHub.


Figure 2: My ergodox layout

But what makes a programmable keyboard worth it’s price ? I’ll go over some of the features and provide some examples of uses I came up with after owning the EZ for a few weeks.

1 Layers

First of all there’s the layers. A lot of keyboards have layers (the FN key) but with a programmable keyboards you can define your own that fit your needs. For example I am french but I use the QWERTY layout as I find it better to program with than AZERTY where some special characters are less accessible. That means however that making special french accentuated characters requires that I hold Alt-Gr, press the required accent and then the character I want accentuated. This can be quite tedious. So I programmed myself a layer which includes a variety of accentuated characters. Layers could also be used is to learn a new layout (e.g. DVORAK or COLEMAK) while still having your usual layout for when you need to be productive.

2 Custom keycodes

I use ~ a lot more than ` and so would rather have the back-tick when I hold shift and tilde otherwise. With custom keycodes I can. Basically they allow you to define the behavior of a new key or modify the behavior of existing keys.

3 Oneshots

Oneshots allow you to press a modifier key one time and it will stay active until you press another key. Once a key is pressed, the modifier is lifted. The same can be done for layer toggles. You can also have a key behave as oneshot if quickly pressed and behave normally when long-pressed. You can configure oneshots to timeout after a while.

4 TapDance

The TapDance extension allows you to have keys behave differently depending on the number of presses. For example I use tap-dance to have a single key for [, { and (. Said key behaves as [ normally, { when shifted and ( when double pressed.

5 Leader

If you’re familiar with vim leader key, this is essentially the same thing for your keyboard : you press LEADER then a sequence of keys and the keyboard will perform the action programmed for said sequence.

6 Auto-shift

This is a feature that I don’t use but I know many people enjoy it. With it you can tap a key for a non-shifted key and tap it longer for the shifted version.

7 Combining those features

We can combine these features to make powerful keys. For example, I built myself a key to control my window manager or Tmux. When pressed once it activates my WM layer and oneshots the GUI (aka Windows/Cmd) modifier which is the modifier key used by my window manager, when a key is pressed or the timeout is reached the keyboard returns to it’s initial state. When pressed twice, the TMUX layer is activated and my Tmux prefix key (Ctrl-A) is sent. Ultimately these two layers should have similar actions for each key.

As you can see a programmable keyboard -with the QMK firmware- is a powerful tool and I am very happy with mine. So far I have been able to implement everything I tried to. There is however the downside that it requires some time investment if you want it to be tailored to your needs. The other downside that I’ve found is that whenever I have to work on a standard keyboard I miss mine and need some time to re-adapt. This is amplified by the fact that the ergodox EZ is ortholinear and splitted.