diff --git a/config/base.keymap b/config/base.keymap index 0bd92ba..e4b9362 100644 --- a/config/base.keymap +++ b/config/base.keymap @@ -223,7 +223,7 @@ ZMK_LAYER(base, //├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ X_LB &kp Z &kp X &kp C &kp D &kp V X_MB &kp K &kp H &comma_morph &dot_morph &qexcl X_RB //├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ - X_LH <_spc NAV 0 < FN RET X_MH NUM_WORD &ss_cw X_RH + X_LH <_spc NAV 0 < FN RET X_MH NUM_WORD &ss_cw X_RH //╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ) diff --git a/img/keymap.png b/img/keymap.png index 06e8676..3c0288e 100644 Binary files a/img/keymap.png and b/img/keymap.png differ diff --git a/readme.md b/readme.md index acc8099..b3a65f5 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ This is my personal [ZMK firmware](https://github.com/zmkfirmware/zmk/) configur It consists of a 34-keys base layout that is re-used for various boards, including my Corneish Zen and an Advantage 360 pro. -## *Key* features +## Highlights - clean keymap + unicode setup using helper macros from [zmk-nodefree-config](https://github.com/urob/zmk-nodefree-config) @@ -13,21 +13,14 @@ Corneish Zen and an Advantage 360 pro. larger boards by padding it via a modular structure of "extra keys" - ["timer-less" homerow mods](#timeless-homerow-mods) - combos replacing the symbol layer -- a smart-layer implementation for ZMK that automatically toggles the numbers - layer -- long-pressing the arrow-cluster yields home, end, begin/end of document, and - fwd/bwd-delete words -- sticky shift on right thumb, double-tap (or shift + tap)[^1] activates - caps-word -- shift + , morphs into ; and - shift + . morphs into ; (freeing up the - right pinky for ? / !) -- shift + ctrl + , morphs into < - and shift + ctrl + . morphs into - > +- smart numbers and smart mouse layers that automatically toggle off when done +- sticky shift on right thumb, double-tap (or shift + tap)[^1] activates caps-word +- arrow-cluster doubles as home, end, begin/end of + document on long-press +- more intuitive shift-actions: , ;, . : and ? ! - shift + space morphs into dotspacesticky-shift -- "Greek" layer for mathematical typesetting (activated via sticky-layer combo) +- "Greek" layer for mathematical typesetting (activated as sticky-layer via a combo) - modified Github Actions workflow that recognizes git-submodules - automated [build-scripts](https://github.com/urob/zmk-config/tree/main/scripts#readme) @@ -147,14 +140,19 @@ PRs, you might find this [ZMK-centric introduction to Git](https://gist.github.com/urob/68a1e206b2356a01b876ed02d3f542c7) helpful. -## Combo setup +## Using combos instead of a symbol layer -My layout makes heavy use of combos. Thanks to `global-quick-tap` for combos -(introduced in above mentioned PR #1387), combo misfires are rare, even when -rolling keys. Most of my combos are bind to symbols, replacing the usual -symbols layer seen on many sub-40 keyboard layouts. The combos are designed so -as to put the most used symbols in easy-to-access locations while also making -them easy to remember. Specifically: +I am a big fan of combos for all sort of things. In terms of comfort, I much prefer them +over accessing layers that involve lateral thumb movements to be activated, especially +when switching between different layers in rapid succession. + +One common concern about overloading the layout with combos is that they lead to +misfires. Fortunately, the above-mentioned PR #1387, also adds a `global-quick-tap` option +for combos, which in my experience all but completely eliminates the problem -- even +when rolling keys on the home row! + +My combo layout aims place the most used symbols in easy-to-access +locations while also making them easy to remember. Specifically: - the top vertical-combo row matches the symbols on a standard numbers row (except `+` and `&` being swapped) @@ -162,37 +160,70 @@ them easy to remember. Specifically: aligns with superscript `^`; minus `-` aligns with `+`; division `/` aligns with multiplication `*`; logical-or `|` aligns with logical-and `&`) - parenthesis, braces, brackets are set up symmetrically as horizontal combos -- cut (on `X + D`), copy, and paste are on the left side for one-handed mouse - use -- `L + Y` activates Greek layer for the next key press, `L + U + Y` activates the shifted - Greek layer the next key -- `tap`, `esc`, `enter` are on horizontal combos +- left-hand side combos for `tap`, `esc`, `enter`, `cut` (on X + D), + `copy` and `paste` that go well with right-handed mouse usage +- L + Y switches to the Greek layer for a single key + press, L + U + Y activates one-shot shift in + addition +- W + P activates the smart mouse layer -## Experimental changes +## Smart layers and other gimmicks -- I recently reduced my core layout to 34 keys. Backspace and Delete are now on - my Navigation-layer. To make room for these keys, I have added hold-taps to - the arrow cluster, which now double as Home/End and Beginning/End of - document. I really like the new navigation cluster and will likely keep it in - one way or another -- Inspired by Jonas Hietala's - [Numword](https://www.jonashietala.se/blog/2021/06/03/the-t-34-keyboard-layout/#where-are-the-digits) - for QMK, I implemented my own version of [Smart-layers for - ZMK](https://github.com/zmkfirmware/zmk/pull/1451). It is triggered via a - single tap on my Num-key (holding the key will activate the num layer as - usual without triggering Numword). Similar to Capsword, Numword continues - to be activated as long as I type numbers, and deactivates automatically on - any other keypress. I found that I use Numword for most of my numbers - typing. For single digits, it effectively is a sticky-layer, but - importantly I can also use it for multiple digits. The only case where it - doesn't deactivate automatically is where immediately after a digit I would - type any of the letters on which my numpad is located (WFPRSTXCD), which is - rare, but does happen. For these cases I have a CANCEL key on my Nav layer - that cancels both Numword and Capsword. -- Since the switch to 34 keys, I freed up the tap-position on my left-most - thumb key. For now I added a secondary Bspc, but I am still searching for a - better use. (I tried adding Repeat here but I found that it doesn't work well - adjacent to space, which requires to much lateral thumb-movements) +##### Numword + +Inspired by Jonas Hietala's +[Numword](https://www.jonashietala.se/blog/2021/06/03/the-t-34-keyboard-layout/#where-are-the-digits) +for QMK, I implemented my own version of [Smart-layers for +ZMK](https://github.com/zmkfirmware/zmk/pull/1451). It is triggered via a +single tap on "Smart-Num". Numword continues to be activated as long as I +type numbers, and deactivates automatically on any other keypress (holding it activates +a non-sticky num layer). + +After using Numword for about 6 months now, I have been overall very happy with it. When +typing single digits, it effectively is a sticky-layer but with the added advantage that +I can also use it to type multiple digits. + +The main downside is that if a sequence of numbers is *immediately* followed by any of the +letters on which my numpad is located (WFPRSTXCD), then the automatic deactivation won't +work. But this is rare -- most number sequences are terminated by `space`, `return` or some form +of punctuation/delimination. To deal with the rare cases where they aren't, there is a +`CANCEL` key on the navigation-layer that deactivates Numword, Capsword and Smart-mouse. + +##### Smart-Mouse + +Similarly to Numword, I have a smart-mouse layer (activated by comboing +W + P), which replaces the navigation cluster with +scroll and mouse-movements, and replaces the right thumbs with mouse buttons. +Pressing any other key automatically deactivates the layer. + +##### Capsword + +My right thumb triggers three variations of shift: Tapping yields +sticky-shift (used to capitalize alphas), holding activates a regular shift, and +double-tapping (or equivalently shift + tap) activates ZMK's Caps-word behavior. + +One minor technical detail: While it would be possible to implement the double-tap functionality +as a tap-dance, this would add a delay when using single taps. To avoid the delays, I +instead implemented the double-tap functionality as a mod-morph. + +##### Multi-purpose Navigation cluster + +To economize on keys, I am using hold-taps on my navigation cluster, which yield `home`, `end`, +`begin/end of document`, and `delete word forward/backward` on long-presses. + +##### Swapper + +I am using [Nick Conway](https://github.com/nickconway)'s fantastic +[tri-state](https://github.com/zmkfirmware/zmk/pull/1366) behavior for a +one-handed Alt-Tab switcher (`PWin` and `NWin`). + +##### Repeat + +I recently switched to 25g-chocs on one of my keyboards. I already was a big fan of +combos prior to that (even with heavy MX-switches). But with the light chocs, I find +that I can now even use them for regular typing. While I haven't yet tried placing alphas +on combos, I am currently experimenting with a `repeat` combo on my home row that I +use to make writing double-letter words more fun. ## Issues and workarounds @@ -202,22 +233,29 @@ any functionality (to the contrary, I found that ZMK supports many features natively that would require complex user-space implementations in QMK). Below are a few remaining issues: -- ZMK does not yet support tap-only combos - ([#544](https://github.com/zmkfirmware/zmk/issues/544)). Workaround: pause - briefly when chording multiple HRMs together on positions that otherwise would trigger - a combo. -- OS sleep is not yet implemented ([#1077](https://github.com/zmkfirmware/zmk/issues/1077)). - Workaround: use sleep-macro instead. -- `&bootloader` doesn't work with Planck_rev6 - ([#1086](https://github.com/zmkfirmware/zmk/issues/1086)). Workaround: Manually press - reset-button. +- ZMK does not yet support "tap-only" combos + ([#544](https://github.com/zmkfirmware/zmk/issues/544)). As a workaround, one + can pause briefly when chording multiple HRMs together on positions that + otherwise would trigger a combo. But this is at the top of my ZMK-wishlist. +- Another item on my wishlist are adaptive keys + ([#1624](https://github.com/zmkfirmware/zmk/issues/1624)). This would open + the door for things like spacespace becoming + .spacesticky-shift. (Using tap-dance isn't + really an option here due to the delay it adds) +- A minor thing is that ZMK doesn't yet support any keys on the + desktop-user-page; e.g., OS sleep + ([#1077](https://github.com/zmkfirmware/zmk/issues/1077), + [#1535](https://github.com/zmkfirmware/zmk/issues/1535)) +- Very minor: `&bootloader` doesn't work with stm32 boards like the Planck + ([#1086](https://github.com/zmkfirmware/zmk/issues/1086)) [^1]: Really what's happening is that `Shift` + my right home-thumb morph into caps-word. This gives me two separate ways of activating it: (1) Holding the homerow-mod shift on my left index-finger and then pressing my right home-thumb, which is my new preferred way. Or, (2) double-tapping the right home-thumb, which also works because the first tap yields sticky-shift, activating the mod-morph upon the second - tap. + tap. But even when only activating via double-tapping, this implementation is advantageous + compared to using tap-dance as it does not create any delay when single-tapping the key. [^2]: I call it "timer-less", because the large tapping-term makes the behavior insensitive to the precise timings. One may say that there is still the