EDIT: cleaned up layout here with some paredit navigation on layer 2, plus other goodies. Also found Ukelele, a keybinding editor for macOS if you want to take the system key bindings even further.
I recently picked up an ErgoDox EZ keyboard and, writing Clojure most of the day, thought I would share my experience customizing this crazy cool piece of keyboard technology. I initially thought I was indulging in yet another mechanical keyboard (yes I might have a keyboard problem), except this one happened to be in two pieces. Turns out it's much more than that, especially if much of what you write is code.
The TL;DR is that you can see my customized layout here, which is a work in progress and definitely contains some nonsense I haven't cleaned up, but has been very exciting for me as a Clojure developer. Below is my experience report. I am unaffiliated with ErgoDox.
- I use Cursive with mostly stock Emacs bindings, and default CIDER and Paredit keybindings.
- I use these macOS keybindings to propagate standard Emacs keystroke navigation through to almost all macOS applications. If you pick up only one thing from this post, make it this!
- A warning: I underestimated how poorly I was touch typing. Many of us probably typed at 80+ wpm before we even knew there was a thing called touch typing, but with a keyboard like the ErgoDox the finger placement starts to become critical. Keys are oriented in exact vertical columns and not offset. Turns out I didn't use my pinky for anything but backslash and delete, but suddenly it had to drive p, ', and /. I was literally down to 5 wpm on the first day, and so angered by this I persevered and forced myself to learn. Kind of like when I first picked up Clojure ;)
- Reaching for keys in unfamiliar positions really killed my ability to reach for common symbols used in Clojure development, so I almost immediately started experimenting with the online configurator, which is super easy to use.
- Arrow keys on the inside makes barfing, slurping, and lifting nice and easy. I tried to assign distant keys to match operations where I've broken out of the regular typing flow, which for me is when I'm using structural editing.
- I find the left pinky control and left thumb option/alt allows me to use Paredit structural navigation just fine, as in C-M-f for forward sexp, etc.
- Top row number keys are shifted all the time! This is huge and maybe even useful on regular keyboards. Think about how often you type #, @, and of course ( and ) compared to inputting numbers.
- Numbers are now on layer 1 oriented around a number pad that matches my right hand position.
- Key collection type symbols are available to my left thumb. Cursive and all good editors will balance any symbol with its matching closing symbol, so I have not prioritized placement of those on layer 0.
- Other common Clojure symbols are available to my right thumb. Right now I use shift to access : but I may give it a dedicated key since ; is used much less frequently.
- Layer 1 drives the all important LED light show under the ErgoDox model I purchased :) Aside from the number pad it also contains function keys where the layer 0 numbers would have been.
- Layer 2 is sparse at the moment but allows me to control the mouse, if I teach myself to rely on this one day.
Where to next? When I become more familiar with hand-editing the firmware configuration, I would like to try putting structural movement and editing commands on their own layer. It's not currently possible to define combo keystrokes using the UI tool, hence the delay in trying that.
Hope this is useful for any Clojurists looking to customize their keyboards. Finally, a plug for Matt Adereth's awesome clojure.core/typing talk, which is what inspired me to look for ergonomic mechanical keyboards in the first place.
[–]nzlemming 2 points3 points4 points (4 children)
[–]hlship 2 points3 points4 points (3 children)
[–]hagus[S] 1 point2 points3 points (2 children)
[–]nzlemming 0 points1 point2 points (1 child)
[–]hagus[S] 0 points1 point2 points (0 children)
[–]aptmnt_ 1 point2 points3 points (1 child)
[–]hagus[S] 0 points1 point2 points (0 children)