From 2b4905f3984297f6ee13f27a03b5e8bf605ae272 Mon Sep 17 00:00:00 2001 From: keyboardhoarders Date: Mon, 26 Aug 2024 17:17:04 -0500 Subject: [PATCH] Initial commit --- .envrc | 8 + .gitattributes | 2 + .github/workflows/build.yml | 11 + .gitignore | 10 + .prettierrc | 2 + Justfile | 106 ++++++++ build.yaml | 30 +++ config/base copy.keymap | 307 ++++++++++++++++++++++++ config/base.keymap | 307 ++++++++++++++++++++++++ config/combos.dtsi | 72 ++++++ config/corne.conf | 15 ++ config/corne.keymap | 20 ++ config/corneish_zen.conf | 21 ++ config/corneish_zen.keymap | 15 ++ config/extra_keys.h | 45 ++++ config/glove80.conf | 18 ++ config/glove80.keymap | 27 +++ config/mouse.dtsi | 26 ++ config/planck_rev6.conf | 8 + config/planck_rev6.keymap | 14 ++ config/west.yml | 51 ++++ draw/config.yaml | 8 + draw/default.nix | 46 ++++ draw/keymap.png | Bin 0 -> 120334 bytes flake.lock | 156 ++++++++++++ flake.nix | 53 ++++ readme.md | 467 ++++++++++++++++++++++++++++++++++++ 27 files changed, 1845 insertions(+) create mode 100644 .envrc create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 Justfile create mode 100644 build.yaml create mode 100644 config/base copy.keymap create mode 100644 config/base.keymap create mode 100644 config/combos.dtsi create mode 100644 config/corne.conf create mode 100644 config/corne.keymap create mode 100644 config/corneish_zen.conf create mode 100644 config/corneish_zen.keymap create mode 100644 config/extra_keys.h create mode 100644 config/glove80.conf create mode 100644 config/glove80.keymap create mode 100644 config/mouse.dtsi create mode 100644 config/planck_rev6.conf create mode 100644 config/planck_rev6.keymap create mode 100644 config/west.yml create mode 100644 draw/config.yaml create mode 100644 draw/default.nix create mode 100644 draw/keymap.png create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 readme.md diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..a156678 --- /dev/null +++ b/.envrc @@ -0,0 +1,8 @@ +# Dim direnv status messages +export DIRENV_LOG_FORMAT=$'\033[2mdirenv: %s\033[0m' + +# Use flake +use flake + +# Watch additional files +watch_file draw/default.nix diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b2b33d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.dtsi linguist-language=C++ +*.keymap linguist-language=C++ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..4c391c3 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,11 @@ +name: Build ZMK firmware +on: + workflow_dispatch: + push: + paths: + - config/** + - build.yaml + +jobs: + build: + uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f231cd4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.build +.direnv +.venv +.west +modules +firmware +zmk +# Ignore keymap-drawer output for now +draw/base.svg +draw/base.yaml diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..94324fa --- /dev/null +++ b/.prettierrc @@ -0,0 +1,2 @@ +proseWrap: "always" +editorconfig: true diff --git a/Justfile b/Justfile new file mode 100644 index 0000000..bfdc8dd --- /dev/null +++ b/Justfile @@ -0,0 +1,106 @@ +default: + @just --list --unsorted + +config := absolute_path('config') +build := absolute_path('.build') +out := absolute_path('firmware') +draw := absolute_path('draw') + +# parse combos.dtsi and adjust settings to not run out of slots +_parse_combos: + #!/usr/bin/env bash + set -euo pipefail + cconf="{{ config / 'combos.dtsi' }}" + if [[ -f $cconf ]]; then + # set MAX_COMBOS_PER_KEY to the most frequent combos count + count=$( + tail -n +10 $cconf | + grep -Eo '[LR][TMBH][0-9]' | + sort | uniq -c | sort -nr | + awk 'NR==1{print $1}' + ) + sed -Ei "/CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY/s/=.+/=$count/" "{{ config }}"/*.conf + echo "Setting MAX_COMBOS_PER_KEY to $count" + + # set MAX_KEYS_PER_COMBO to the most frequent key count + count=$( + tail -n +10 $cconf | + grep -o -n '[LR][TMBH][0-9]' | + cut -d : -f 1 | uniq -c | sort -nr | + awk 'NR==1{print $1}' + ) + sed -Ei "/CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO/s/=.+/=$count/" "{{ config }}"/*.conf + echo "Setting MAX_KEYS_PER_COMBO to $count" + fi + +# parse build.yaml and filter targets by expression +_parse_targets $expr: + #!/usr/bin/env bash + attrs="[.board, .shield]" + filter="(($attrs | map(. // [.]) | combinations), ((.include // {})[] | $attrs)) | join(\",\")" + echo "$(yq -r "$filter" build.yaml | grep -v "^," | grep -i "${expr/#all/.*}")" + +# build firmware for single board & shield combination +_build_single $board $shield *west_args: + #!/usr/bin/env bash + set -euo pipefail + artifact="${shield:+${shield// /+}-}${board}" + build_dir="{{ build / '$artifact' }}" + + echo "Building firmware for $artifact..." + west build -s zmk/app -d "$build_dir" -b $board {{ west_args }} -- \ + -DZMK_CONFIG="{{ config }}" ${shield:+-DSHIELD="$shield"} + + if [[ -f "$build_dir/zephyr/zmk.uf2" ]]; then + mkdir -p "{{ out }}" && cp "$build_dir/zephyr/zmk.uf2" "{{ out }}/$artifact.uf2" + else + mkdir -p "{{ out }}" && cp "$build_dir/zephyr/zmk.bin" "{{ out }}/$artifact.bin" + fi + +# build firmware for matching targets +build expr *west_args: _parse_combos + #!/usr/bin/env bash + set -euo pipefail + targets=$(just _parse_targets {{ expr }}) + + [[ -z $targets ]] && echo "No matching targets found. Aborting..." >&2 && exit 1 + echo "$targets" | while IFS=, read -r board shield; do + just _build_single "$board" "$shield" {{ west_args }} + done + +# clear build cache and artifacts +clean: + rm -rf {{ build }} {{ out }} + +# clear all automatically generated files +clean-all: clean + rm -rf .west zmk + +# clear nix cache +clean-nix: + nix-collect-garbage --delete-old + +# parse & plot keymap +draw: + #!/usr/bin/env bash + set -euo pipefail + keymap -c "{{ draw }}/config.yaml" parse -z "{{ config }}/base.keymap" >"{{ draw }}/base.yaml" + keymap -c "{{ draw }}/config.yaml" draw "{{ draw }}/base.yaml" -k "ferris/sweep" >"{{ draw }}/base.svg" + +# initialize west +init: + west init -l config + west update + west zephyr-export + +# list build targets +list: + @just _parse_targets all | sed 's/,$//' | sort | column + +# update west +update: + west update + +# upgrade zephyr-sdk and python dependencies +upgrade-sdk: + nix flake update --flake . diff --git a/build.yaml b/build.yaml new file mode 100644 index 0000000..28e562d --- /dev/null +++ b/build.yaml @@ -0,0 +1,30 @@ +# This file generates the GitHub Actions matrix +# For simple board + shield combinations, add them +# to the top level board and shield arrays, for more +# control, add individual board + shield combinations to +# the `include` property, e.g: +# +# board: [ "nice_nano_v2" ] +# shield: [ "corne_left", "corne_right" ] +# include: +# - board: bdn9_rev2 +# - board: nice_nano_v2 +# shield: reviung41 +# +--- +include: +# - board: planck_rev6 +# - board: corneish_zen_v2_left +# - board: corneish_zen_v2_right +# - board: glove80_lh +# - board: glove80_rh +# - board: nice_nano_v2 +# shield: corne_left +# - board: nice_nano_v2 +# shield: corne_right + - board: nice_nano_v2 + shield: corne_left nice_view_adapter nice_view + - board: nice_nano_v2 + shield: corne_right nice_view_adapter nice_view + - board: nice_nano_v2 + shield: settings_reset diff --git a/config/base copy.keymap b/config/base copy.keymap new file mode 100644 index 0000000..a22efc2 --- /dev/null +++ b/config/base copy.keymap @@ -0,0 +1,307 @@ +#include +#include // requires auto-layer module +#include +#if CONFIG_WIRELESS + #include + #define _BT_SEL_KEYS_ &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_CLR +#else + #define _BT_SEL_KEYS_ &trans &trans &trans &trans &trans +#endif + +#include "zmk-helpers/helper.h" +#include "zmk-helpers/unicode-chars/greek.dtsi" +#include "zmk-helpers/unicode-chars/german.dtsi" + +#define DEF 0 +#define NAV 1 +#define FN 2 +#define NUM 3 +#define SYS 4 +#define UC 5 +#define MOUSE 6 + +#include "combos.dtsi" // requires layer aliases +#include "mouse.dtsi" +#include "extra_keys.h" + +#define XXX &none +#define ___ &trans + +/* Global settings */ + +#define QUICK_TAP_MS 175 + +&sk { // sticky-key config + release-after-ms = <900>; // release after 0.6s + quick-release; // no double capitalization when rolling keys +}; + +&sl { // sticky-layer config + ignore-modifiers; // allow chording sticky mods & layers +}; + +< { // layer-tap config + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; +}; + +/* Homerow mods */ + +#define KEYS_L LT0 LT1 LT2 LT3 LT4 LM0 LM1 LM2 LM3 LM4 LB0 LB1 LB2 LB3 LB4 // left hand +#define KEYS_R RT0 RT1 RT2 RT3 RT4 RM0 RM1 RM2 RM3 RM4 RB0 RB1 RB2 RB3 RB4 // right hand +#define THUMBS LH2 LH1 LH0 RH0 RH1 RH2 // thumbs + +#define MAKE_HRM(NAME, HOLD, TAP, TRIGGER_POS) \ + ZMK_HOLD_TAP(NAME, \ + flavor = "balanced"; \ + tapping-term-ms = <280>; \ + quick-tap-ms = ; \ + require-prior-idle-ms = <150>; \ + bindings = , ; \ + hold-trigger-key-positions = ; \ + hold-trigger-on-release; \ + ) +MAKE_HRM(hml, &kp, &kp, KEYS_R THUMBS) // left-hand HRMs +MAKE_HRM(hmr, &kp, &kp, KEYS_L THUMBS) // right-hand HRMs + +MAKE_HRM(hml_repeat, &kp, &key_repeat, KEYS_R THUMBS) // used for HRM-combo +MAKE_HRM(hmr_lpar_lt, &kp, &lpar_lt, KEYS_L THUMBS) // " " " " +MAKE_HRM(hmr_rpar_gt, &kp, &rpar_gt, KEYS_L THUMBS) // " " " " + +/* Nav cluster */ + +// long-tap action on hold, short-tap action on all interrupts +#define MT_CORE \ + flavor = "tap-preferred"; \ + tapping-term-ms = <220>; \ + quick-tap-ms = <220>; \ + hold-trigger-key-positions = <0>; + +&mt { MT_CORE }; +ZMK_HOLD_TAP(mt_home, bindings = <&masked_home>, <&kp>; MT_CORE) +ZMK_HOLD_TAP(mt_end, bindings = <&masked_end>, <&kp>; MT_CORE) + +#define NAV_LEFT &mt_home 0 LEFT // tap: left | long-tap: beginning of line +#define NAV_RIGHT &mt_end 0 RIGHT // tap: right | long-tap: end of line +#define NAV_UP &mt LC(HOME) UP // tap: up | long-tap: beginning of document +#define NAV_DOWN &mt LC(END) DOWN // tap: down | long-tap: end of document +#define NAV_BSPC &mt LC(BSPC) BSPC // tap: bspc | long-tap: delete word backward +#define NAV_DEL &mt LC(DEL) DEL // tap: del | long-tap: delete word forward + +// mask CTRL when holding left/right to avoid accidental jumps to beginning/end of document +#define MASK_MODS(NAME, MODS, BINDING) \ + ZMK_MOD_MORPH(NAME, \ + bindings = , ; \ + mods = ; \ + ) +MASK_MODS(masked_home, (MOD_LCTL), &kp HOME) +MASK_MODS(masked_end, (MOD_LCTL), &kp END) + +/* Caps-word, num-word and smart-mouse */ + +// tap: sticky-shift | shift + tap/ double-tap: caps-word | hold: shift +ZMK_MOD_MORPH(smart_shft, + bindings = <&sk LSHFT>, <&caps_word>; + mods = <(MOD_LSFT)>; +) +&caps_word { // mods deactivate caps-word, requires PR #1451 + /delete-property/ ignore-modifiers; +}; + +// tap: num-word | double-tap: sticky num-layer | hold: num-layer +#define SMART_NUM &smart_num NUM 0 +ZMK_HOLD_TAP(smart_num, + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; + bindings = <&mo>, <&num_dance>; +) +ZMK_TAP_DANCE(num_dance, + tapping-term-ms = <200>; + bindings = <&num_word NUM>, <&sl NUM>; // reverse this for sticky-num on single tap +) + +// smart-mouse, requires PR #1366 +ZMK_TRI_STATE(smart_mouse, + bindings = <&tog MOUSE>, <&none>, <&tog MOUSE>; + ignored-key-positions = ; + ignored-layers = ; +) + +/* Custom behaviors */ + +// Alt+Tab swapper, requires PR #1366 +ZMK_TRI_STATE(swapper, + bindings = <&kt LALT>, <&kp TAB>, <&kt LALT>; + ignored-key-positions = ; +) + +// Sticky layer + sticky shift (workaround for issue #1421) +ZMK_STICKY_KEY(sls, + release-after-ms = <1000>; + bindings = <&uc_shift>; + ignore-modifiers; +) +ZMK_MACRO(uc_shift, + wait-ms = <0>; + tap-ms = <1>; + bindings = <¯o_press &mo UC &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo UC &kp LSHFT>; +) + +// reuse basic mod-morph scheme +#define SIMPLE_MORPH(NAME, MOD, BINDING1, BINDING2) \ + ZMK_MOD_MORPH(NAME, \ + mods = <(MOD_L ## MOD|MOD_R ## MOD)>; \ + bindings = , ; \ + ) + +// tap: comma | shift + tap: semicolon | ctrl + shift + tap: < +SIMPLE_MORPH(comma_morph, SFT, &kp COMMA, &comma_inner_morph) +SIMPLE_MORPH(comma_inner_morph, CTL, &kp SEMICOLON, &kp LESS_THAN) + +// tap: dot | shift + tap: colon | ctrl + shift + tap: > +SIMPLE_MORPH(dot_morph, SFT, &kp DOT, &dot_inner_morph) +SIMPLE_MORPH(dot_inner_morph, CTL, &kp COLON, &kp GREATER_THAN) + +// tap: qmark | shift + tap: excl +SIMPLE_MORPH(qexcl, SFT, &kp QMARK, &kp EXCL) + +// tap: left/right parenthesis | shft + tap: less-than/greater-than +SIMPLE_MORPH(lpar_lt, SFT, &kp LPAR, &kp LT) +SIMPLE_MORPH(rpar_gt, SFT, &kp RPAR, &kp GT) + +// tap: space | shift + tap: dot -> space -> sticky shift | hold: activate layer +ZMK_HOLD_TAP(lt_spc, + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; + bindings = <&mo>, <&spc_morph>; +) +SIMPLE_MORPH(spc_morph, SFT, &kp SPACE, &dot_spc) +ZMK_MACRO(dot_spc, + wait-ms = <0>; + tap-ms = <5>; + bindings = <&kp DOT &kp SPACE &sk LSHFT>; +) + +// tap: backspace | lshft + tap: delete | rshft + tap: shift-delete +ZMK_MOD_MORPH(bs_del, + bindings = <&kp BSPC>, <&kp DEL>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = ; +) + +// tap: copy | double-tap: cut +ZMK_TAP_DANCE(copy_cut, + tapping-term-ms = <200>; + bindings = <&kp LC(INS)>, <&kp LC(X)>; +) + +// Windows sleep key +ZMK_MACRO(win_sleep, + wait-ms = <500>; + tap-ms = <50>; + bindings = <&kp LG(X) &kp U &kp S>; +) + +// misc aliases +#define CANCEL &kp K_CANCEL // cancel caps-word, num-word and smart-mouse +#define DSK_PREV &hmr LCTRL LG(LC(LEFT)) // previous desktop +#define DSK_NEXT &hmr LALT LG(LC(RIGHT)) // next desktop +#define PIN_WIN &kp LG(LC(LS(Q))) // pin window across desktops +#define PIN_APP &kp LG(LC(LS(A))) // pin application across desktops +#define DSK_MGR &kp LA(GRAVE) // desktop manager +#define VOL_DOWN &hmr RSHFT C_VOL_DN + +/* Keymap */ + +ZMK_CONDITIONAL_LAYER(sys, FN NUM, SYS) // FN + NUM --> SYS + +ZMK_LAYER(base, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT &kp Q &kp W &kp F &kp P &kp B X_MT &kp J &kp L &kp U &kp Y &kp SQT X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &hml LGUI A &hml LALT R &hml LSHFT S &hml LCTRL T &kp G X_MM &kp M &hmr LCTRL N &hmr RSHFT E &hmr LALT I &hmr LGUI O X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + 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 SMART_NUM &smart_shft X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(nav, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ ___ &kp LS(TAB) &swapper ___ X_MT &kp PG_UP NAV_BSPC NAV_UP NAV_DEL ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &sk LGUI &sk LALT &sk LSHFT &sk LCTRL ___ X_MM &kp PG_DN NAV_LEFT NAV_DOWN NAV_RIGHT &kp RET X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ ___ X_MB &kp INS &kp TAB &kp LT &kp GT ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ CANCEL X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(fn, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT &kp F12 &kp F7 &kp F8 &kp F9 ___ X_MT ___ &kp C_PREV &kp C_VOL_UP &kp C_NEXT &win_sleep X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &hml LGUI F11 &hml LALT F4 &hml LSHFT F5 &hml LCTRL F6 ___ X_MM ___ DSK_PREV VOL_DOWN DSK_NEXT ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB &kp F10 &kp F1 &kp F2 &kp F3 ___ X_MB PIN_APP PIN_WIN DSK_MGR ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH &kp C_MUTE &kp C_PP X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(num, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ &kp N7 &kp N8 &kp N9 ___ X_MT ___ ___ ___ ___ ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &hml LGUI N0 &hml LALT N4 &hml LSHFT N5 &hml LCTRL N6 ___ X_MM ___ ___ ___ ___ ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ &kp N1 &kp N2 &kp N3 ___ X_MB ___ ___ ___ ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(sys, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT _BT_SEL_KEYS_ X_MT ___ ___ ___ ___ ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM ___ ___ ___ ___ &bootloader X_MM &bootloader ___ ___ ___ ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ &sys_reset X_MB &sys_reset ___ ___ ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(uc, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ &el_omega &el_phi &el_pi &el_beta X_MT ___ &el_lambda &el_upsilon &el_psi &de_eszett X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &el_alpha &el_rho &el_sigma &el_tau &el_gamma X_MM &el_mu &el_nu &el_epsilon &el_iota &el_omikron X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB &el_zeta &el_xi &el_chi &el_delta &el_theta X_MB &el_kappa &el_eta &de_ae &de_oe &de_ue X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰───────────────────────────╯ ╰──────╯ +) + +ZMK_LAYER(mouse, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ ___ ___ ___ ___ X_MT U_WH_L U_WH_D U_MS_U U_WH_U U_WH_R X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM ___ ___ ___ ___ ___ X_MM ___ U_MS_L U_MS_D U_MS_R ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ ___ X_MB ___ &mkp MB4 &mkp MCLK &mkp MB5 ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH &mkp LCLK &mkp RCLK X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +/* vim: set ft=c tw=174: */ diff --git a/config/base.keymap b/config/base.keymap new file mode 100644 index 0000000..8e00162 --- /dev/null +++ b/config/base.keymap @@ -0,0 +1,307 @@ +#include +#include // requires auto-layer module +#include +#if CONFIG_WIRELESS + #include + #define _BT_SEL_KEYS_ &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_CLR +#else + #define _BT_SEL_KEYS_ &trans &trans &trans &trans &trans +#endif + +#include "zmk-helpers/helper.h" +#include "zmk-helpers/unicode-chars/greek.dtsi" +#include "zmk-helpers/unicode-chars/german.dtsi" + +#define DEF 0 +#define NAV 1 +#define FN 2 +#define NUM 3 +#define SYS 4 +#define UC 5 +#define MOUSE 6 + +#include "combos.dtsi" // requires layer aliases +#include "mouse.dtsi" +#include "extra_keys.h" + +#define XXX &none +#define ___ &trans + +/* Global settings */ + +#define QUICK_TAP_MS 175 + +&sk { // sticky-key config + release-after-ms = <900>; // release after 0.6s + quick-release; // no double capitalization when rolling keys +}; + +&sl { // sticky-layer config + ignore-modifiers; // allow chording sticky mods & layers +}; + +< { // layer-tap config + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; +}; + +/* Homerow mods */ + +#define KEYS_L LT0 LT1 LT2 LT3 LT4 LT5 LM0 LM1 LM2 LM3 LM4 LM5 LB0 LB1 LB2 LB3 LB4 LB5 // left hand +#define KEYS_R RT0 RT1 RT2 RT3 RT4 RT5 RM0 RM1 RM2 RM3 RM4 RM5 RB0 RB1 RB2 RB3 RB4 RB5// right hand +#define THUMBS LH2 LH1 LH0 RH0 RH1 RH2 // thumbs + +#define MAKE_HRM(NAME, HOLD, TAP, TRIGGER_POS) \ + ZMK_HOLD_TAP(NAME, \ + flavor = "balanced"; \ + tapping-term-ms = <280>; \ + quick-tap-ms = ; \ + require-prior-idle-ms = <150>; \ + bindings = , ; \ + hold-trigger-key-positions = ; \ + hold-trigger-on-release; \ + ) +MAKE_HRM(hml, &kp, &kp, KEYS_R THUMBS) // left-hand HRMs +MAKE_HRM(hmr, &kp, &kp, KEYS_L THUMBS) // right-hand HRMs + +MAKE_HRM(hml_repeat, &kp, &key_repeat, KEYS_R THUMBS) // used for HRM-combo +MAKE_HRM(hmr_lpar_lt, &kp, &lpar_lt, KEYS_L THUMBS) // " " " " +MAKE_HRM(hmr_rpar_gt, &kp, &rpar_gt, KEYS_L THUMBS) // " " " " + +/* Nav cluster */ + +// long-tap action on hold, short-tap action on all interrupts +#define MT_CORE \ + flavor = "tap-preferred"; \ + tapping-term-ms = <220>; \ + quick-tap-ms = <220>; \ + hold-trigger-key-positions = <0>; + +&mt { MT_CORE }; +ZMK_HOLD_TAP(mt_home, bindings = <&masked_home>, <&kp>; MT_CORE) +ZMK_HOLD_TAP(mt_end, bindings = <&masked_end>, <&kp>; MT_CORE) + +#define NAV_LEFT &mt_home 0 LEFT // tap: left | long-tap: beginning of line +#define NAV_RIGHT &mt_end 0 RIGHT // tap: right | long-tap: end of line +#define NAV_UP &mt LC(HOME) UP // tap: up | long-tap: beginning of document +#define NAV_DOWN &mt LC(END) DOWN // tap: down | long-tap: end of document +#define NAV_BSPC &mt LC(BSPC) BSPC // tap: bspc | long-tap: delete word backward +#define NAV_DEL &mt LC(DEL) DEL // tap: del | long-tap: delete word forward + +// mask CTRL when holding left/right to avoid accidental jumps to beginning/end of document +#define MASK_MODS(NAME, MODS, BINDING) \ + ZMK_MOD_MORPH(NAME, \ + bindings = , ; \ + mods = ; \ + ) +MASK_MODS(masked_home, (MOD_LCTL), &kp HOME) +MASK_MODS(masked_end, (MOD_LCTL), &kp END) + +/* Caps-word, num-word and smart-mouse */ + +// tap: sticky-shift | shift + tap/ double-tap: caps-word | hold: shift +ZMK_MOD_MORPH(smart_shft, + bindings = <&sk LSHFT>, <&caps_word>; + mods = <(MOD_LSFT)>; +) +&caps_word { // mods deactivate caps-word, requires PR #1451 + /delete-property/ ignore-modifiers; +}; + +// tap: num-word | double-tap: sticky num-layer | hold: num-layer +#define SMART_NUM &smart_num NUM 0 +ZMK_HOLD_TAP(smart_num, + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; + bindings = <&mo>, <&num_dance>; +) +ZMK_TAP_DANCE(num_dance, + tapping-term-ms = <200>; + bindings = <&num_word NUM>, <&sl NUM>; // reverse this for sticky-num on single tap +) + +// smart-mouse, requires PR #1366 +ZMK_TRI_STATE(smart_mouse, + bindings = <&tog MOUSE>, <&none>, <&tog MOUSE>; + ignored-key-positions = ; + ignored-layers = ; +) + +/* Custom behaviors */ + +// Alt+Tab swapper, requires PR #1366 +ZMK_TRI_STATE(swapper, + bindings = <&kt LALT>, <&kp TAB>, <&kt LALT>; + ignored-key-positions = ; +) + +// Sticky layer + sticky shift (workaround for issue #1421) +ZMK_STICKY_KEY(sls, + release-after-ms = <1000>; + bindings = <&uc_shift>; + ignore-modifiers; +) +ZMK_MACRO(uc_shift, + wait-ms = <0>; + tap-ms = <1>; + bindings = <¯o_press &mo UC &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo UC &kp LSHFT>; +) + +// reuse basic mod-morph scheme +#define SIMPLE_MORPH(NAME, MOD, BINDING1, BINDING2) \ + ZMK_MOD_MORPH(NAME, \ + mods = <(MOD_L ## MOD|MOD_R ## MOD)>; \ + bindings = , ; \ + ) + +// tap: comma | shift + tap: semicolon | ctrl + shift + tap: < +SIMPLE_MORPH(comma_morph, SFT, &kp COMMA, &comma_inner_morph) +SIMPLE_MORPH(comma_inner_morph, CTL, &kp SEMICOLON, &kp LESS_THAN) + +// tap: dot | shift + tap: colon | ctrl + shift + tap: > +SIMPLE_MORPH(dot_morph, SFT, &kp DOT, &dot_inner_morph) +SIMPLE_MORPH(dot_inner_morph, CTL, &kp COLON, &kp GREATER_THAN) + +// tap: qmark | shift + tap: excl +SIMPLE_MORPH(qexcl, SFT, &kp QMARK, &kp EXCL) + +// tap: left/right parenthesis | shft + tap: less-than/greater-than +SIMPLE_MORPH(lpar_lt, SFT, &kp LPAR, &kp LT) +SIMPLE_MORPH(rpar_gt, SFT, &kp RPAR, &kp GT) + +// tap: space | shift + tap: dot -> space -> sticky shift | hold: activate layer +ZMK_HOLD_TAP(lt_spc, + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; + bindings = <&mo>, <&spc_morph>; +) +SIMPLE_MORPH(spc_morph, SFT, &kp SPACE, &dot_spc) +ZMK_MACRO(dot_spc, + wait-ms = <0>; + tap-ms = <5>; + bindings = <&kp DOT &kp SPACE &sk LSHFT>; +) + +// tap: backspace | lshft + tap: delete | rshft + tap: shift-delete +ZMK_MOD_MORPH(bs_del, + bindings = <&kp BSPC>, <&kp DEL>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = ; +) + +// tap: copy | double-tap: cut +ZMK_TAP_DANCE(copy_cut, + tapping-term-ms = <200>; + bindings = <&kp LC(INS)>, <&kp LC(X)>; +) + +// Windows sleep key +ZMK_MACRO(win_sleep, + wait-ms = <500>; + tap-ms = <50>; + bindings = <&kp LG(X) &kp U &kp S>; +) + +// misc aliases +#define CANCEL &kp K_CANCEL // cancel caps-word, num-word and smart-mouse +#define DSK_PREV &hmr LCTRL LG(LC(LEFT)) // previous desktop +#define DSK_NEXT &hmr LALT LG(LC(RIGHT)) // next desktop +#define PIN_WIN &kp LG(LC(LS(Q))) // pin window across desktops +#define PIN_APP &kp LG(LC(LS(A))) // pin application across desktops +#define DSK_MGR &kp LA(GRAVE) // desktop manager +#define VOL_DOWN &hmr RSHFT C_VOL_DN + +/* Keymap */ + +ZMK_CONDITIONAL_LAYER(sys, FN NUM, SYS) // FN + NUM --> SYS + +ZMK_LAYER(base, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT &kp Q &kp W &kp E &kp R &kp T X_MT &kp Y &kp U &kp I &kp O &kp P X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &hml LGUI A &hml LALT S &hml LSHFT D &hml LCTRL F &kp G X_MM &kp H &hmr LCTRL J &hmr RSHFT K &hmr LALT L &hmr LGUI SEMI X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB &kp Z &kp X &kp C &kp V &kp B X_MB &kp N &kp M &comma_morph &dot_morph &qexcl X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH <_spc NAV 0 < FN RET X_MH SMART_NUM &smart_shft X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(nav, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ ___ &kp LS(TAB) &swapper ___ X_MT &kp PG_UP NAV_BSPC NAV_UP NAV_DEL ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &sk LGUI &sk LALT &sk LSHFT &sk LCTRL ___ X_MM &kp PG_DN NAV_LEFT NAV_DOWN NAV_RIGHT &kp RET X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ ___ X_MB &kp INS &kp TAB &kp LT &kp GT ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ CANCEL X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(fn, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT &kp F12 &kp F7 &kp F8 &kp F9 ___ X_MT ___ &kp C_PREV &kp C_VOL_UP &kp C_NEXT &win_sleep X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &hml LGUI F11 &hml LALT F4 &hml LSHFT F5 &hml LCTRL F6 ___ X_MM ___ DSK_PREV VOL_DOWN DSK_NEXT ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB &kp F10 &kp F1 &kp F2 &kp F3 ___ X_MB PIN_APP PIN_WIN DSK_MGR ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH &kp C_MUTE &kp C_PP X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(num, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ &kp N7 &kp N8 &kp N9 ___ X_MT ___ ___ ___ ___ ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &hml LGUI N0 &hml LALT N4 &hml LSHFT N5 &hml LCTRL N6 ___ X_MM ___ ___ ___ ___ ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ &kp N1 &kp N2 &kp N3 ___ X_MB ___ ___ ___ ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(sys, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT _BT_SEL_KEYS_ X_MT ___ ___ ___ ___ ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM ___ ___ ___ ___ &bootloader X_MM &bootloader ___ ___ ___ ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ &sys_reset X_MB &sys_reset ___ ___ ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +ZMK_LAYER(uc, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ &el_omega &el_phi &el_pi &el_beta X_MT ___ &el_lambda &el_upsilon &el_psi &de_eszett X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM &el_alpha &el_rho &el_sigma &el_tau &el_gamma X_MM &el_mu &el_nu &el_epsilon &el_iota &el_omikron X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB &el_zeta &el_xi &el_chi &el_delta &el_theta X_MB &el_kappa &el_eta &de_ae &de_oe &de_ue X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰───────────────────────────╯ ╰──────╯ +) + +ZMK_LAYER(mouse, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ ___ ___ ___ ___ X_MT U_WH_L U_WH_D U_MS_U U_WH_U U_WH_R X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM ___ ___ ___ ___ ___ X_MM ___ U_MS_L U_MS_D U_MS_R ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ ___ X_MB ___ &mkp MB4 &mkp MCLK &mkp MB5 ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH ___ ___ X_MH &mkp LCLK &mkp RCLK X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + +/* vim: set ft=c tw=174: */ diff --git a/config/combos.dtsi b/config/combos.dtsi new file mode 100644 index 0000000..70db3f8 --- /dev/null +++ b/config/combos.dtsi @@ -0,0 +1,72 @@ +/* KEY POSITIONS + + ╭──────────────────── ─╮ ╭──────────────────── ─╮ + │ LT5 LT4 LT3 LT2 LT1 LT0 RT0 RT1 RT2 RT3 RT4 RT5│ + │ LM5 LM4 LM3 LM2 LM1 LM0 RM0 RM1 RM2 RM3 RM4 RM5│ + │ LB5 LB4 LB3 LB2 LB1 LB0 RB0 RB1 RB2 RB3 RB4 RB5│ + ╰───────╮ LH2 LH1 LH0 RH0 RH1 RH2 ╭─────── ╯ + ╰───────────── ╯ ╰─────────────╯ */ + +#define COMBO_TERM_FAST 18 +#define COMBO_TERM_SLOW 30 + +#define COMBO_IDLE_FAST 150 +#define COMBO_IDLE_SLOW 50 + +// make homerow combos tap-only (so HRMs can be chorded instantaneously) +#define HRC_TAB &hml LS(LALT) TAB +#define HRC_REPEAT &hml_repeat LS(LCTRL) 0 +#define HRC_LPAR &hmr_lpar_lt RS(LCTRL) 0 +#define HRC_RPAR &hmr_rpar_gt RS(LALT) 0 + +/* Horizontal combos - left hand */ +ZMK_COMBO(esc, &kp ESC, LT3 LT2, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(ret, &kp RETURN, LT2 LT1, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(mouse, &smart_mouse, LT3 LT1, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) + +ZMK_COMBO(tab, HRC_TAB, LM3 LM2, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(repeat,HRC_REPEAT, LM2 LM1, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) + +ZMK_COMBO(cut, &kp LC(X), LB3 LB1, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(copy, &kp LC(INS), LB3 LB2, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(paste, &kp LS(INS), LB2 LB1, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) + +/* Horizontal combos - right hand */ +ZMK_COMBO(bspc, &kp BSPC, RT1 RT2, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(del, &kp DEL, RT2 RT3, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) + +ZMK_COMBO(lpar, HRC_LPAR, RM1 RM2, DEF NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(rpar, HRC_RPAR, RM2 RM3, DEF NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(lt, &kp LT, RM1 RM2, NAV , COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(gt, &kp GT, RM2 RM3, NAV , COMBO_TERM_FAST, COMBO_IDLE_FAST) + +ZMK_COMBO(lbkt, &kp LBKT, RB1 RB2, DEF NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(rbkt, &kp RBKT, RB2 RB3, DEF NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(lbrc, &kp LBRC, RB1 RB2, NAV , COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(rbrc, &kp RBRC, RB2 RB3, NAV , COMBO_TERM_FAST, COMBO_IDLE_FAST) + +ZMK_COMBO(grk, &sl UC, RT1 RT3, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) +ZMK_COMBO(cpgrk, &sls 0, RT1 RT2 RT3, DEF NAV NUM, COMBO_TERM_FAST, COMBO_IDLE_FAST) + +/* Vertical combos - left hand */ +ZMK_COMBO(at, &kp AT, LT3 LM3, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(hash, &kp HASH, LT2 LM2, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(dllr, &kp DLLR, LT1 LM1, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(prcnt, &kp PRCNT, LT0 LM0, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) + +ZMK_COMBO(grave, &kp GRAVE, LM3 LB3, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(bslh, &kp BSLH, LM2 LB2, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(equal, &kp EQUAL, LM1 LB1, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(tilde, &kp TILDE, LM0 LB0, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) + +/* Vertical combos - right hand */ +ZMK_COMBO(caret, &kp CARET, RT0 RM0, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(plus, &kp PLUS, RT1 RM1, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(star, &kp STAR, RT2 RM2, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(amps, &kp AMPS, RT3 RM3, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) + +ZMK_COMBO(under, &kp UNDER, RM0 RB0, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(minus, &kp MINUS, RM1 RB1, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(fslh, &kp FSLH, RM2 RB2, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) +ZMK_COMBO(pipe, &kp PIPE, RM3 RB3, DEF NAV NUM, COMBO_TERM_SLOW, COMBO_IDLE_SLOW) + diff --git a/config/corne.conf b/config/corne.conf new file mode 100644 index 0000000..3cc34e8 --- /dev/null +++ b/config/corne.conf @@ -0,0 +1,15 @@ +# Set sleep timeout to 30min (30*60*1000ms) +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=1800000 + +# Enable mouse +CONFIG_ZMK_MOUSE=y + +# Combo config, automated by build script +CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY=6 +CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO=3 + +# Bluetooth tweaks +CONFIG_ZMK_BLE_EXPERIMENTAL_CONN=y +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/config/corne.keymap b/config/corne.keymap new file mode 100644 index 0000000..34af1fe --- /dev/null +++ b/config/corne.keymap @@ -0,0 +1,20 @@ +/* source key position labels */ +#include "zmk-helpers/key-labels/42.h" + +/* map Zen's extra keys */ +#define X_LH &kp LGUI // thumb row, left +#define X_RH &smart_mouse // thumb row, right +#define X_LT &kp TAB // top row, left +#define X_LM &kp LSHFT // middle row, left +#define X_LB &kp LCTRL // bottom row, left +#define X_RT &kp BACKSPACE // top row, right +#define X_RM &kp APOS // middle row, right +#define X_RB &kp RSHFT // bottom row, right +/* activate bluetooth */ +#define CONFIG_WIRELESS 1 + +/* source the main keymap */ +#include "base.keymap" + +/* use 5-column layout for Zen */ +//ZMK_APPLY_MATRIX_TRANSFORM(five_column_transform) diff --git a/config/corneish_zen.conf b/config/corneish_zen.conf new file mode 100644 index 0000000..e96ad96 --- /dev/null +++ b/config/corneish_zen.conf @@ -0,0 +1,21 @@ +# Set sleep timeout to 30min (30*60*1000ms) +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=1800000 + +# Enable mouse +CONFIG_ZMK_MOUSE=y + +# Zen display tweaks, requires patches by caksoylar +CONFIG_ZMK_DISPLAY_FULL_REFRESH_PERIOD=300 +CONFIG_ZMK_DISPLAY_HIDE_MOMENTARY_LAYERS=y +CONFIG_CUSTOM_WIDGET_LAYER_STATUS_HIDE_HEADING=y + +# Combo config, automated by build script +CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY=6 +CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO=3 + +# Bluetooth tweaks +CONFIG_ZMK_BLE_EXPERIMENTAL_CONN=y +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + diff --git a/config/corneish_zen.keymap b/config/corneish_zen.keymap new file mode 100644 index 0000000..adda618 --- /dev/null +++ b/config/corneish_zen.keymap @@ -0,0 +1,15 @@ +/* source key position labels */ +#include "zmk-helpers/key-labels/36.h" + +/* map Zen's extra keys */ +#define X_LH &kp LGUI // thumb row, left +#define X_RH &smart_mouse // thumb row, right + +/* activate bluetooth */ +#define CONFIG_WIRELESS 1 + +/* source the main keymap */ +#include "base.keymap" + +/* use 5-column layout for Zen */ +ZMK_APPLY_MATRIX_TRANSFORM(five_column_transform) diff --git a/config/extra_keys.h b/config/extra_keys.h new file mode 100644 index 0000000..e9e3ed4 --- /dev/null +++ b/config/extra_keys.h @@ -0,0 +1,45 @@ +// The default layout has 34 keys. Additional keys can be added by pre-setting any of +// the macros defined in this file to one or more keys before sourcing this file. + +/* left of left half */ +#if !defined X_LT // top row, left + #define X_LT +#endif +#if !defined X_LM // middle row, left + #define X_LM +#endif +#if !defined X_LB // bottom row, left + #define X_LB +#endif +#if !defined X_LH // thumb row, left + #define X_LH +#endif + +/* between left and right half */ +#if !defined X_MT // top row, middle + #define X_MT +#endif +#if !defined X_MM // middle row, middle + #define X_MM +#endif +#if !defined X_MB // bottom row, middle + #define X_MB +#endif +#if !defined X_MH // thumb row, middle + #define X_MH +#endif + +/* right of right half */ +#if !defined X_RT // top row, right + #define X_RT +#endif +#if !defined X_RM // middle row, right + #define X_RM +#endif +#if !defined X_RB // bottom row, right + #define X_RB +#endif +#if !defined X_RH // thumb row, right + #define X_RH +#endif + diff --git a/config/glove80.conf b/config/glove80.conf new file mode 100644 index 0000000..771442a --- /dev/null +++ b/config/glove80.conf @@ -0,0 +1,18 @@ +# Set sleep timeout to 30min (30*60*1000ms) +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=1800000 + +# Enable mouse +CONFIG_ZMK_MOUSE=y + +# Combo config, automated by build script +CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY=6 +CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO=3 + +# Bluetooth tweaks +CONFIG_ZMK_BLE_EXPERIMENTAL_CONN=y +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y +CONFIG_BT_MAX_CONN=3 +CONFIG_BT_MAX_PAIRED=3 + diff --git a/config/glove80.keymap b/config/glove80.keymap new file mode 100644 index 0000000..1fee54c --- /dev/null +++ b/config/glove80.keymap @@ -0,0 +1,27 @@ +/* source key position labels */ +#include "zmk-helpers/key-labels/glove80.h" + +/* map the Glove's extra keys */ +#define X_LT \ + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 \ + &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS \ + &kp TAB +#define X_RT &kp BACKSLASH + +#define X_LM &kp ESC +#define X_RM &none + +#define X_LB &none +#define X_MB &none &none &none &none &none &none +#define X_RB &none + +#define X_LH &none &none &none &kp LEFT &kp RIGHT +#define X_MH &none &none +#define X_RH &kp UP &kp DOWN &none &none &none + +/* activate bluetooth */ +#define CONFIG_WIRELESS 1 + +/* source the main keymap */ +#include "base.keymap" + diff --git a/config/mouse.dtsi b/config/mouse.dtsi new file mode 100644 index 0000000..7f6cc9d --- /dev/null +++ b/config/mouse.dtsi @@ -0,0 +1,26 @@ +#define ZMK_MOUSE_DEFAULT_MOVE_VAL 1500 // 600 +#define ZMK_MOUSE_DEFAULT_SCRL_VAL 20 // 10 + +#include + +&mmv { + acceleration-exponent = <1>; // 1 + time-to-max-speed-ms = <500>; // 40 + delay-ms = <0>; // 0 +}; + +&msc { + acceleration-exponent = <1>; // 0 + time-to-max-speed-ms = <40>; // 500 + delay-ms = <0>; // 10 +}; + +#define U_MS_U &mmv MOVE_UP +#define U_MS_D &mmv MOVE_DOWN +#define U_MS_L &mmv MOVE_LEFT +#define U_MS_R &mmv MOVE_RIGHT +#define U_WH_U &msc SCRL_UP +#define U_WH_D &msc SCRL_DOWN +#define U_WH_L &msc SCRL_LEFT +#define U_WH_R &msc SCRL_RIGHT + diff --git a/config/planck_rev6.conf b/config/planck_rev6.conf new file mode 100644 index 0000000..6cfc108 --- /dev/null +++ b/config/planck_rev6.conf @@ -0,0 +1,8 @@ +CONFIG_ZMK_KEYBOARD_NAME="Planck Rev6" + +# Combo config, automated by build script +CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY=6 +CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO=3 + +# Enable mouse +CONFIG_ZMK_MOUSE=y diff --git a/config/planck_rev6.keymap b/config/planck_rev6.keymap new file mode 100644 index 0000000..24b8edd --- /dev/null +++ b/config/planck_rev6.keymap @@ -0,0 +1,14 @@ +/* source key position labels */ +#include "zmk-helpers/key-labels/4x12_wide.h" + +/* map Planck's extra keys */ +#define X_MT &none &none // top row, middle +#define X_MM &none &none // middle row, middle +#define X_MB &none &none // bottom row, middle +#define X_LH &none &none &kp LGUI // thumb row, left +#define X_MH &none &none // thumb row, middle +#define X_RH &smart_mouse U_WH_D U_WH_U // thumb row, right + +/* source the main keymap */ +#include "base.keymap" + diff --git a/config/west.yml b/config/west.yml new file mode 100644 index 0000000..ce19a1b --- /dev/null +++ b/config/west.yml @@ -0,0 +1,51 @@ +# This file specifies the build dependencies for Github Action workflows and +# for local build environments. The workspace has three toplevel directories +# containing the user config, user modules and ZMK. Zephyr and its dependencies +# are namespaced under /zmk to keep the toplevel clean. +# +# ZMK-Workspace +# ├── config +# ├── modules (user modules) +# └── zmk +# └── modules (Zephyr modules) +# +# To create a local build environment, clone this repository and then run the +# following commands from its toplevel directory: +# +# $ west init -l config +# $ west update +# $ west zephyr-export +# +--- +manifest: + defaults: + remote: urob + + remotes: + - name: upstream + url-base: https://github.com/zmkfirmware + - name: urob + url-base: https://github.com/urob + + projects: + - name: zmk-helpers + revision: main + path: modules/helpers + - name: zmk-auto-layer + revision: main + path: modules/auto-layer + - name: zmk-tri-state + revision: main + path: modules/tri-state + + # ZMK with Zephyr namespaced under /zmk. This requires that ZMK imports + # Zephyr with a path other than `zephyr` (as in `going-modular`). + - name: zmk + revision: going-modular + path: . + import: + file: app/west.yml + path-prefix: zmk + + self: + path: config diff --git a/draw/config.yaml b/draw/config.yaml new file mode 100644 index 0000000..ee94942 --- /dev/null +++ b/draw/config.yaml @@ -0,0 +1,8 @@ +parse_config: + zmk_preamble: "#include " + zmk_additional_includes: + - "modules/helpers/include" + +draw_config: + footer_text: "urob/zmk-config" + dark_mode: auto diff --git a/draw/default.nix b/draw/default.nix new file mode 100644 index 0000000..c43da62 --- /dev/null +++ b/draw/default.nix @@ -0,0 +1,46 @@ +{ + lib, + buildPythonApplication, + fetchPypi, + poetry-core, + pydantic, + pcpp, + pyparsing, + pyyaml, + platformdirs, + pydantic-settings, +}: +buildPythonApplication rec { + pname = "keymap-drawer"; + version = "0.18.0"; + pyproject = true; + + src = fetchPypi { + pname = "keymap_drawer"; + inherit version; + hash = "sha256-faJB+cjj740Ny2wqVwc5t/+grEWBIEyhex3RoLCuIs8="; + }; + + postPatch = '' + substituteInPlace pyproject.toml --replace 'platformdirs = "^3.5.1"' 'platformdirs = "^4.0.0"' + ''; + + build-system = [poetry-core]; + + propagatedBuildInputs = [ + pydantic + pcpp + pyparsing + pyyaml + platformdirs + pydantic-settings + ]; + + doCheck = false; + + meta = { + homepage = "https://github.com/caksoylar/keymap-drawer"; + description = "Parse QMK & ZMK keymaps and draw them as vector graphics"; + license = lib.licenses.mit; + }; +} diff --git a/draw/keymap.png b/draw/keymap.png new file mode 100644 index 0000000000000000000000000000000000000000..c529cf42fe9094ca45e8e4f4a3192cd0a4dd794f GIT binary patch literal 120334 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 rIc%hGE&~1Ufb#z?chome, end, begin/end of + document on long-press +- more intuitive shift-actions: , ;, . : and ? + ! +- shift + space morphs into dot → + spacesticky-shift +- "Greek" layer for mathematical typesetting (activated as sticky-layer via a + combo) +- nix-based [local build environment](#local-development-workspace) -- simply + `cd` into your workspace and start building without any setup + +![](draw/keymap.png) + +## Timeless homerow mods + +[Homerow mods](https://precondition.github.io/home-row-mods) (aka "HRMs") can be +a game changer -- at least in theory. In practice, they require some finicky +timing: In its most naive implementation, in order to produce a "mod", they must +be held _longer_ than `tapping-term-ms`. In order to produce a "tap", they must +be held _less_ than `tapping-term-ms`. This requires very consistent typing +speeds that, alas, I do not possess. Hence my quest for a "timer-less" HRM +setup.[^2] + +After months of tweaking, I eventually ended up with a HRM setup that is +essentially timer-less, resulting in virtually no misfires. Yet it provides a +fluent typing experience with mostly no delays. + +Let's suppose for a moment we set `tapping-term-ms` to something ridiculously +large, say 5 seconds. This makes the configuration timer-less of sorts. But it +has two problems: (1) To activate a mod we will have to hold the HRM keys for +what feels like eternity. (2) During regular typing, there are delays between +the press of a key and the time it appears on the screen.[^3] Enter two of my +favorite ZMK features: + +- To address the first problem, I use ZMK's `balanced` flavor, which produces a + "hold" if another key is both pressed and released within the tapping-term. + Because that is exactly what I normally do with HRMs, there is virtually never + a need to wait past my long tapping term (see below for two exceptions). +- To address the typing delay, I use ZMK's `require-prior-idle-ms` property, + which immediately resolves a HRM as "tap" when it is pressed shortly _after_ + another key has been tapped. This all but completely eliminates the delay. + +This is great but there are still a few rough edges: + +- When rolling keys, I sometimes unintentionally end up with "nested" key + sequences: `key 1` down, `key 2` down and up, `key 1` up. Because of the + `balanced` flavor, this would falsely register `key 1` as a mod. As a remedy, + I use ZMK's `positional hold-tap` feature to force HRMs to always resolve as + "tap" when the _next_ key is on the same side of the keyboard. Problem solved. +- ... or at least almost. By default, positional-hold-tap performs the + positional check when the next key is _pressed_. This is not ideal, because it + prevents combining multiple modifiers on the same hand. To fix this, I use the + `hold-trigger-on-release` setting, which delays the positional-hold-tap + decision until the next key's _release_. With the setting, multiple mods can + be combined when held, while I still get the benefit from positional-hold-tap + when keys are tapped. +- So far, nothing of the configuration depends on the duration of + `tapping-term-ms`. In practice, there are two reasons why I don't set it to + infinity: + 1. Sometimes, in rare circumstances, I want to combine a mod with a alpha-key + _on the same hand_ (e.g., when using the mouse with the other hand). My + positional hold-tap configuration prevents this _within_ the tapping term. + By setting the tapping term to something large but not crazy large (I use + 280ms), I can still use same-hand `mod` + `alpha` shortcuts by holding the + mod for just a little while before tapping the alpha-key. + 2. Sometimes, I want to press a modifier without another key (e.g., on + Windows, tapping `Win` opens the search menu). Because the `balanced` + flavour only kicks in when another key is pressed, this also requires + waiting past `tapping-term-ms`. +- Finally, it is worth noting that this setup works best in combination with a + dedicated shift for capitalization during normal typing (I like sticky-shift + on a home-thumb). This is because shifting alphas is the one scenario where + pressing a mod may conflict with `require-prior-idle-ms`, which may result in + false negatives when typing fast. + +Here's my configuration (I use a bunch of +[helper macros](https://github.com/urob/zmk-helpers) to simplify the syntax, but +they are not necessary): + +```C++ +/* use helper macros to define left and right hand keys */ +#include "zmk-helpers/key-labels/36.h" // key-position labels +#define KEYS_L LT0 LT1 LT2 LT3 LT4 LM0 LM1 LM2 LM3 LM4 LB0 LB1 LB2 LB3 LB4 // left-hand keys +#define KEYS_R RT0 RT1 RT2 RT3 RT4 RM0 RM1 RM2 RM3 RM4 RB0 RB1 RB2 RB3 RB4 // right-hand keys +#define THUMBS LH2 LH1 LH0 RH0 RH1 RH2 // thumb keys + +/* left-hand HRMs */ +ZMK_HOLD_TAP(hml, + flavor = "balanced"; + tapping-term-ms = <280>; + quick-tap-ms = <175>; // repeat on tap-into-hold + require-prior-idle-ms = <150>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = ; + hold-trigger-on-release; // delay positional check until key-release +) + +/* right-hand HRMs */ +ZMK_HOLD_TAP(hmr, + flavor = "balanced"; + tapping-term-ms = <280>; + quick-tap-ms = <175>; // repeat on tap-into-hold + require-prior-idle-ms = <150>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = ; + hold-trigger-on-release; // delay positional check until key-release +) +``` + +### Required firmware + +After a recent round of patches, the above configuration now works with upstream +ZMK. + +Other parts of my configuration still require a few PRs that aren't yet in +upstream ZMK. My personal [ZMK fork](https://github.com/urob/zmk) includes all +PRs needed to compile my configuration. If you prefer to maintain your own fork +with a custom selection of PRs, you might find this +[ZMK-centric introduction to Git](https://gist.github.com/urob/68a1e206b2356a01b876ed02d3f542c7) +helpful. + +### Troubleshooting + +Hopefully, the above configuration "just works". If it doesn't, here's a few +smaller (and larger) things to try. + +- **Noticeable delay when tapping HRMs:** Increase `require-prior-idle-ms`. As a + rule of thumb, you want to set it to at least `10500/x` where `x` is your + (relaxed) WPM for English prose.[^4] +- **False negatives (same-hand):** Reduce `tapping-term-ms` (or disable + `hold-trigger-key-positions`) +- **False negatives (cross-hand):** Reduce `require-prior-idle-ms` (or set + flavor to `hold-preferred` -- to continue using `hold-trigger-on-release`, you + must also + [patch ZMK](https://github.com/celejewski/zmk/commit/d7a8482712d87963e59b74238667346221199293) + or use [an already patched branch](https://github.com/urob/zmk)) +- **False positives (same-hand):** Increase `tapping-term-ms` +- **False positives (cross-hand):** Increase `require-prior-idle-ms` (or set + flavor to `tap-preferred`, which requires holding HRMs past tapping term to + activate) + +## Using combos instead of a symbol layer + +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 `require-prior-idle-ms` option also +works for combos, which in my experience all but completely eliminates the +problem -- even when rolling keys on the home row! + +My combo layout aims to 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) +- the bottom vertical-combo row is symmetric to the top row (subscript `_` + 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 + with `<`, `>`, `{` and `}` being accessed from the Navigation layer (or when + combined with `Shift`) +- 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 + +## Smart layers and other gimmicks + +##### 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 +[Auto-layer behavior](https://github.com/urob/zmk-auto-layer) for ZMK to set up +Numword. 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 more than a year 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. (It also +toggles off when pressing `Numword` again, but I find it cognitively easier to +have a dedicated "off-switch" than keeping track of which modes are currently +active.) + +##### 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. The exact implementation is tweaked so that `Ctrl` is silently +absorbed in combination with `home` and `end` to avoid accidental document-wide +operations (which are accessible via the dedicated `begin/end document keys`.) + +##### 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 very +happy with my combos prior to that (even with heavy-ish 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 reduce SFUs when typing +double-letter words. + +## Local development workspace + +I streamline my local build process using `nix`, `direnv` and `just`. This +automatically sets up a virtual development environment with `west`, the +`zephyr-sdk` and all its dependencies when `cd`-ing into the ZMK-workspace. The +environment is _completely isolated_ and won't pollute your system. + +### Setup + +#### Pre-requisites + +1. Install the `nix` package manager: + + ```bash + # Install Nix with flake support enabled + curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | + sh -s -- install --no-confirm + + # Start the nix daemon without restarting the shell + . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh + ``` + +2. Install [`direnv`](https://direnv.net/) (and optionally but recommended + [`nix-direnv`](https://github.com/nix-community/nix-direnv)[^5]) using your + package manager of choice. E.g., using the `nix` package manager that we just + installed[^6]: + + ``` + nix profile install nixpkgs#direnv nixpkgs#nix-direnv + ``` + +3. Set up the `direnv` [shell-hook](https://direnv.net/docs/hook.html) for your + shell. E.g., for `bash`: + + ```bash + # Install the shell-hook + echo 'eval "$(direnv hook bash)"' >> ~/.bashrc + + # Enable nix-direnv (if installed in the previous step) + mkdir -p ~/.config/direnv + echo 'source $HOME/.nix-profile/share/nix-direnv/direnvrc' >> ~/.config/direnv/direnvrc + + # Optional: make direnv less verbose + echo '[global]\nwarn_timeout = "2m"\nhide_env_diff = true' >> ~/.config/direnv/direnv.toml + + # Source the bashrc to activate the hook (or start a new shell) + source ~/.bashrc + ``` + +#### Set up the workspace + +1. Clone _your fork_ of this repository. I like to name my local clone + `zmk-workspace` as it will be the toplevel of the development environment. + + ```bash + # Replace `urob` with your username + git clone https://github.com/urob/zmk-config zmk-workspace + ``` + +2. Enter the workspace and set up the environment. + + ```bash + # The first time you enter the workspace, you will be prompted to allow direnv + cd zmk-workspace + + # Allow direnv for the workspace, which will set up the environment + direnv allow + + # Initialize the Zephyr workspace and pull in the ZMK dependencies + # (same as `west init -l config && west update && west zephyr-export`) + just init + ``` + +### Usage + +After following the steps above your workspace should look like this: + +```bash +zmk-workspace +├── config +├── firmware (created after building) +├── modules +│ ├── auto-layer +│ ├── helpers +│ └── tri-state +└── zmk + └── ... +``` + +#### Building the firmware + +To build the firmware, simply type `just build all` from anywhere within the +workspace. This will parse `build.yaml` and build the firmware for all board and +shield combinations listed there. + +To only build the firmware for a specific target, use `just build `. +This will build the firmware for all matching board and shield combinations. For +instance, to build the firmware for my Corneish Zen, I can type +`just build zen`, which builds both `corneish_zen_v2_left` and +`corneish_zen_v2_right`. (`just list` shows all valid build targets.) + +Additional arguments to `just build` are passed on to `west`. For instance, a +pristine build can be triggered with `just build all -p`. + +(For this particular example, there is also a `just clean` recipe, which clears +the build cache. To list all available recipes, type `just`. Bonus tip: `just` +provides +[completion scripts](https://github.com/casey/just?tab=readme-ov-file#shell-completion-scripts) +for many shells.) + +#### Drawing the keymap + +The build environment packages +[keymap-drawer](https://github.com/caksoylar/keymap-drawer). `just draw` parses +`base.keymap` and draws it to `draw/base.svg`. I haven't gotten around to +tweaking the output yet, so for now this is just a demonstration of how to set +things up. + +#### Hacking the firmware + +To make changes to the ZMK source or any of the modules, simply edit the files +or use `git` to pull in changes. + +To switch to any remote branches or tags, use `git fetch` inside a module +directory to make the remote refs locally available. Then switch to the desired +branch with `git checkout ` as usual. You may also want to register +additional remotes to work with or consider making them the default in +`config/west.yml`. + +#### Updating the build environment + +To update the ZMK dependencies, use `just update`. This will pull in the latest +version of ZMK and all modules specified in `config/west.yml`. Make sure to +commit and push all local changes you have made to ZMK and the modules before +running this command, as this will overwrite them. + +To upgrade the Zephyr SDK and Python build dependencies, use `just upgrade-sdk`. + +## Issues and workarounds + +Since I switched from QMK to ZMK I have been very impressed with how easy it is +to set up relatively complex layouts in ZMK. For the most parts I don't miss 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)), requiring a brief + pause when wanting to chord HRMs that overlap with combo positions. As a + workaround, I implemented all homerow combos as homerow-mod-combos. This is + good enough for day-to-day, but does not address all edge cases (eg + dynamically adding/removing mods doesn't work well). Having a native solution + akin to QMK's "COMBO_MUST_TAP" property would be fantastic. +- 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. 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 + `require-prior-idle` timeout. However, with both a large tapping-term and + positional-hold-taps, the behavior is _not_ actually sensitive to the + `require-prior-idle` timing: All it does is reduce the delay in typing; + i.e., variations in typing speed won't affect _what_ is being typed but + merely _how fast_ it appears on the screen. + +[^3]: + The delay is determined by how quickly a key is released and is not directly + related to the tapping-term. But regardless of its length, most people still + find it noticable and disruptive. + +[^4]: + E.g, if your WPM is 70 or larger, then the default of 150ms (=10500/70) + should work well. The rule of thumb is based on an average character length + of 4.7 for English words. Taking into account 1 extra tap for `space`, this + yields a minimum `require-prior-idle-ms` of (60 _ 1000) / (5.7 _ x) ≈ 10500 + / x milliseconds. The approximation errs on the safe side, as in practice + home row taps tend to be faster than average. + +[^5]: + `nix-direnv` provides a vastly improved caching experience compared to only + having `direnv`, making entering and exiting the workspace instantaneous + after the first time. + +[^6]: + This will permanently install the packages into your local profile, forgoing + many of the benefits that make Nix uniquely powerful. A better approach, + though beyond the scope of this document, is to use `home-manager` to + maintain your user environment.