Follow-up: Customizing a Keyboard Layout

In February, I wrote about my journey to customize a keyboard layout. I tend to write while I’m still thinking and processing, so a lot has changed since that post. For the two of you who care… here’s what I’m typing on right now.

Symbol Layer

For the past two years, I had been using a variant of the Planck layout, which has symbols on two layers: Lower and Raise. Raise has all the unshifted symbols, and Lower has all the shifted variants.1 This means that you can kind of reason your way around the board, and find things based on existing muscle memory… or by glancing up at your laptop keyboard.

In my last post, I discussed how using a keyboard with thumb modifiers made this more complicated… my thumbs went from merely hitting the space bar to layers, space, and all four modifiers.2 While I don’t program for a living at the moment I still write a lot of code and markdown and my thumbs were tired and slow.

Part of the solution was to create a layer with only symbols. In the last post, I counted up all the symbols on a standard keyboard and came up with 26… which easily fits within the 3x10 grid that is a subset of all my keyboard layouts:

/* Symbols
 *
 * ,---------------------------------------.
 * | ! | @ | { | } | | | ^ | _ | + | / | \ |
 * |---+---+---+---+---+---+---+---+---+---|
 * | # | $ | ( | ) | ` | / | - | = | * | " |
 * |---+---+---+---+---+---+---+---+---+---|
 * | % | ^ | [ | ] | ~ | & | ? | < | > | : |
 * `---------------------------------------'
 */

This is a little messy. It has been tweaked steadily over the past seven months, so I honestly don’t even remember the reasons for some of this now. I started with the default kyria/ergodox layout and modified to maximize “logicalness”.

The two columns on the left are basically the LH part of the number row. I believe this is identical to the Ergodox EZ default layout and Kyria default layout. I then borrowed the Ergodox’s decision to put all the brackets and braces together. Coming from the Planck layout, this was probably the biggest change, since the Planck puts the numrow special characters across the top of the board in their “normal” order, so () and [] moved from RH to LH. I filled some of the extra spaces with duplicate characters or a few characters that still available on a shifted layer.

If you decide to do something similar… and you are going to break every standard keyboard convention, I recommend starting with something very basic and changing it based on the keys you type the most. I optimized for markdown, javascript, and elixir… since that’s what I spend the most time in.

One downside to this is that some muscle memory for keyboard shortcuts in Vim and gmail have to be relearned. That is a pretty big barrier, but I adapted quickly.3

I had to keep tweaking things to make sure it made sense for the kind of strings that I type, but eventually I became a well oiled special character typing machine thanks to some solid time practicing on typingclub.com’s excellent symbol practice strings.

Space for Layers

I then started using the spacebars as layer toggles. If I tap my spacebar, it behaves as a normal spacebar, if I hold the spacebar, I can access my layers. I think the default Kyria layout does this… but I had it disabled because I wasn’t able to cope at first. It took some adjusting of the timing, but now I haven’t had a problem with it.

Downside: many applications use a spacebar hold for panning around a canvas… I may need to dive into the settings to add a timeout, but for now I’ve simply added a “normal” spacebar in my Design Shortcuts layer, and that works just fine. 🤷‍♂️

Mods

Let’s talk about “home row modifiers.” I’m definitely not the first person to write about them, and there are many people who have been using them for a lot longer.

I know I had read about it in the past, but I really started to consider it while researching layouts for the corne keyboard and discovered the miryoku layout. Among many of the interesting tricks in this layout is that the home row keys asdfjkl; become modifiers if held. I realized that this would relegate my thumbs to only space, layers, and outer mods… and gave it a try. It takes some tweaking to your tap-hold settings in QMK, and definitely some practice in typing, but I think I’m sold on the concept after two months of trying it.

/* Home row modifiers
 *
 * ,---------------------------------------.
 * |   |   |   |   |   |   |   |   |   |   |
 * |---+---+---+---+---+---+---+---+---+---|
 * | ⌘ | ⌥ | ⌃ | ⇧ |   |   | ⇧ | ⌃ | ⌥ | ⌘ |
 * |---+---+---+---+---+---+---+---+---+---|
 * |   |   |   |   |   |   |   |   |   |   |
 * `---------------------------------------'
 */

It took at least two weeks before I stopped accidentally opening print dialogs and other annoyances. I believe the trick (for me) was learning to let go of each key as soon as the key actuates. I think I had a bad habit of holding a key until the next key press because of my piano training trying to type legato. I also think I located my hand on the keyboard based on the last key pressed… but now that I move my hands away from home row so rarely that is not an issue.

My old Planck layout had the mods at the bottom under each finger. I think that helped me get my brain ready for home row modifiers. Now that I have tried moving those modifiers up to home row … I don’t believe I’m going back. If you are an emacs user, definitely consider checking this technique out. No more contorting or twisting of your hand to get your ring and pinky finger onto the mods at the bottom corner of the keyboard… you don’t have to move your hand at all. I use Readline shortcuts heavily while in a terminal, and now that alt/meta and control are so easy to reach… sometimes I jump around without even realizing how easy it is.

While home row modifiers are the most wild modification I’ve yet tried to a keyboard, they are also the most rewarding from an ergonomic perspective. If you are willing to tweak the location of symbols for ergonomics, you are probably the target market.

There is at least one downside… at least the way I have it configured. Just like the spacebar before, you can’t hold down j and scroll in vim… because the j doesn’t repeat, it just becomes a (shift) modifier. Honestly… holding down j to scroll is a little bit of a vim anti-pattern, and I have adjusted to it, but that may be really annoying to you.4

All together now.

Here’s what it all looks like together in a sort of exploded view. As you can see… I’m using a lot less keys, especially on the thumbs. Mostly trying to minimize the main grid and three thumb keys. The inner 3x10 grid is always the same, but the “wrapper” keys differ slightly from board to board.

Blue is symbols, Orange is control, Green is shortcuts, and pink are holds (mod-taps). I actually left out of the image features and layers, like the media keys, F1-F12, and the RGB controls… because it got too busy.

If you want to look at the layout on keyboard-layout-editor.com, click here.

Just putting this thing together has given me new ideas…

I spend most of my day typing markdown for emails, blog posts, and documentation for work. My fingers almost never stretch beyond one key up or down from home row, and my thumbs almost never leave my spacebars. I rarely stretch my pinkies out to the outer column unless I’m accessing my macro/custom layers.5 Most of the “outer keys” are on the unused four thumb keys or on layers. There’s only six of them after all.

I’m still tweaking and learning, and about to try a new corne keyboard that’s sitting in front of me waiting for switches, but this feels really good. Even with shifting with my pointer fingers (weird right?) I’m still getting regular 100+ wpm on monkey-type.com, mostly on quotes.

I’m sure this will continue to change… I’ve got that Corne keyboard ready to be completed, and an Atreus from keyboard.io coming at some point that will teach me new lessons and make me try new things.


  1. This is a nice memory trick to help folks remember where things might be… for instance the letter Q with the Raise layer enabled is 1, and with the lower layer enabled is !

  2. Typing a common string like <!-- --> (a comment in HTML) requires 9 separate thumb movements. Every character alternates between a different layer, space, or shift! 

  3. Most of the issues had to do with relearning jumps related to () or toggling options in unimpaired using []. It really wasn’t that bad. Actions like copying the current selection are even easier in some cases: "*y requires a lot less movement. 

  4. This will also affect gaming… because most of wasd can not be held either. This doesn’t bother me though… on a keyboard this small I’m probably going to make a gaming layer anyway. 

  5. I’ve moved ' and " on layers and forced myself to use them. I may move them to a thumb key on a layer eventually… it’s a little out of the way. 


🔖
Changelog
  • 2020-09-02 16:17:14 -0500

    Explain where the media keys and F-keys are

  • 2020-09-02 16:11:51 -0500

    Update the layout image to be more generic

  • 2020-09-02 12:17:23 -0500

    Markdown doesn't work in html

  • 2020-09-02 12:14:04 -0500

    Add layout image

  • 2020-09-02 11:22:23 -0500

    Post: Follow-up: Customizing a Keyboard Layout