From 548231cee36773be4c4f669a229b6457be75b203 Mon Sep 17 00:00:00 2001 From: urob <978080+urob@users.noreply.github.com> Date: Thu, 11 May 2023 14:37:48 -0400 Subject: [PATCH] Adaptive double-space a la iOS * double space morphs into `DOT SPACE STICKY-SHIFT` * using adaptive key instead of tap-dance to avoid delay on single shift * shift + space yields protected space so one can type double spaces --- config/base.keymap | 36 ++++++++++++++++++++--- config/combos.dtsi | 72 +++++++++++++++++++++++----------------------- 2 files changed, 68 insertions(+), 40 deletions(-) diff --git a/config/base.keymap b/config/base.keymap index a4587f7..16523a9 100644 --- a/config/base.keymap +++ b/config/base.keymap @@ -18,6 +18,7 @@ #define SYS 4 #define UC 5 #define MOUSE 6 +#define SPACE_LAYER 7 #include "combos.dtsi" // requires layer aliases #include "mouse.dtsi" @@ -31,7 +32,7 @@ #define QUICK_TAP_MS 175 &sk { // sticky-key config - release-after-ms = <600>; // release after 0.6s + release-after-ms = <1200>; // release after 1.2s quick-release; // no double capitalization when rolling keys }; @@ -180,7 +181,7 @@ ZMK_BEHAVIOR(qexcl, mod_morph, mods = <(MOD_LSFT|MOD_RSFT)>; ) -// tap: space | shift + tap: dot -> space -> sticky shift | hold: activate layer +// tap: space | double-tap: dot -> space -> sticky shift | shift + tap: protected space | hold: activate layer ZMK_BEHAVIOR(lt_spc, hold_tap, flavor = "balanced"; tapping-term-ms = <200>; @@ -188,13 +189,28 @@ ZMK_BEHAVIOR(lt_spc, hold_tap, bindings = <&mo>, <&spc_morph>; ) ZMK_BEHAVIOR(spc_morph, mod_morph, - bindings = <&kp SPACE>, <&dot_spc>; + bindings = <&spc_layer>, <&kp SPACE>; + mods = <(MOD_LSFT|MOD_RSFT)>; +) +ZMK_BEHAVIOR(spc_layer, macro, + wait-ms = <0>; + tap-ms = <5>; + bindings = <&kp SPACE &sl SPACE_LAYER>; +) +ZMK_BEHAVIOR(lt_spc2, hold_tap, + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; + bindings = <&mo>, <&spc_morph2>; +) +ZMK_BEHAVIOR(spc_morph2, mod_morph, + bindings = <&dot_spc>, <&kp SPACE>; mods = <(MOD_LSFT|MOD_RSFT)>; ) ZMK_BEHAVIOR(dot_spc, macro, wait-ms = <0>; tap-ms = <5>; - bindings = <&kp DOT &kp SPACE &sk LSHFT>; + bindings = <&kp BSPC &kp DOT &kp SPACE &sk LSHIFT>; ) // tap: backspace | lshft + tap: delete | rshft + tap: shift-delete @@ -323,4 +339,16 @@ ZMK_LAYER(mouse, //╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ) +ZMK_LAYER(space, +//╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ + X_LT ___ ___ ___ ___ ___ X_MT ___ ___ ___ ___ ___ X_RT +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LM ___ ___ ___ ___ ___ X_MM ___ ___ ___ ___ ___ X_RM +//├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ + X_LB ___ ___ ___ ___ ___ X_MB ___ ___ ___ ___ ___ X_RB +//├──────┤ ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ ├──────┤ + X_LH <_spc2 NAV 0 ___ X_MH ___ ___ X_RH +//╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ +) + /* vim: set ft=c tw=174: */ diff --git a/config/combos.dtsi b/config/combos.dtsi index 79dde3b..907d9dc 100644 --- a/config/combos.dtsi +++ b/config/combos.dtsi @@ -21,53 +21,53 @@ #define HRC_RPAR &hmr_rpar_gt LA(LCTRL) 0 /* Horizontal combos - left hand */ -ZMK_COMBO(esc, &kp ESC, LT3 LT2, DEF NAV NUM, COMBO_TERM_FAST) -ZMK_COMBO(ret, &kp RETURN, LT2 LT1, DEF NAV NUM, COMBO_TERM_FAST) -ZMK_COMBO(mouse, &smart_mouse, LT3 LT1, DEF NAV NUM, COMBO_TERM_SLOW) +ZMK_COMBO(esc, &kp ESC, LT3 LT2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(ret, &kp RETURN, LT2 LT1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(mouse, &smart_mouse, LT3 LT1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) -ZMK_COMBO(tab, HRC_TAB, LM3 LM2, DEF NAV NUM, COMBO_TERM_FAST) -ZMK_COMBO(repeat,HRC_REPEAT, LM2 LM1, DEF NAV NUM, COMBO_TERM_FAST) +ZMK_COMBO(tab, HRC_TAB, LM3 LM2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(repeat,HRC_REPEAT, LM2 LM1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) -ZMK_COMBO(cut, &kp LC(X), LB3 LB1, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(copy, &kp LC(INS), LB3 LB2, DEF NAV NUM, COMBO_TERM_FAST) -ZMK_COMBO(paste, &kp LS(INS), LB2 LB1, DEF NAV NUM, COMBO_TERM_FAST) +ZMK_COMBO(cut, &kp LC(X), LB3 LB1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(copy, &kp LC(INS), LB3 LB2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(paste, &kp LS(INS), LB2 LB1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) /* Horizontal combos - right hand */ -ZMK_COMBO(bspc, &kp BSPC, RT1 RT2, DEF NAV NUM, COMBO_TERM_FAST) -ZMK_COMBO(del, &kp DEL, RT2 RT3, DEF NAV NUM, COMBO_TERM_FAST) +ZMK_COMBO(bspc, &kp BSPC, RT1 RT2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(del, &kp DEL, RT2 RT3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_FAST) -ZMK_COMBO(lpar, HRC_LPAR, RM1 RM2, DEF NUM, COMBO_TERM_FAST) -ZMK_COMBO(rpar, HRC_RPAR, RM2 RM3, DEF NUM, COMBO_TERM_FAST) -ZMK_COMBO(lt, &kp LT, RM1 RM2, NAV , COMBO_TERM_FAST) -ZMK_COMBO(gt, &kp GT, RM2 RM3, NAV , COMBO_TERM_FAST) +ZMK_COMBO(lpar, HRC_LPAR, RM1 RM2, DEF NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(rpar, HRC_RPAR, RM2 RM3, DEF NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(lt, &kp LT, RM1 RM2, NAV SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(gt, &kp GT, RM2 RM3, NAV SPACE_LAYER, COMBO_TERM_FAST) -ZMK_COMBO(lbkt, &kp LBKT, RB1 RB2, DEF NUM, COMBO_TERM_FAST) -ZMK_COMBO(rbkt, &kp RBKT, RB2 RB3, DEF NUM, COMBO_TERM_FAST) -ZMK_COMBO(lbrc, &kp LBRC, RB1 RB2, NAV , COMBO_TERM_FAST) -ZMK_COMBO(rbrc, &kp RBRC, RB2 RB3, NAV , COMBO_TERM_FAST) +ZMK_COMBO(lbkt, &kp LBKT, RB1 RB2, DEF NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(rbkt, &kp RBKT, RB2 RB3, DEF NUM SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(lbrc, &kp LBRC, RB1 RB2, NAV SPACE_LAYER, COMBO_TERM_FAST) +ZMK_COMBO(rbrc, &kp RBRC, RB2 RB3, NAV SPACE_LAYER, COMBO_TERM_FAST) -ZMK_COMBO(grk, &sl UC, RT1 RT3, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(cpgrk, &sls 0, RT1 RT2 RT3, DEF NAV NUM, COMBO_TERM_SLOW) +ZMK_COMBO(grk, &sl UC, RT1 RT3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(cpgrk, &sls 0, RT1 RT2 RT3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) /* Vertical combos - left hand */ -ZMK_COMBO(at, &kp AT, LT3 LM3, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(hash, &kp HASH, LT2 LM2, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(dllr, &kp DLLR, LT1 LM1, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(prcnt, &kp PRCNT, LT0 LM0, DEF NAV NUM, COMBO_TERM_SLOW) +ZMK_COMBO(at, &kp AT, LT3 LM3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(hash, &kp HASH, LT2 LM2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(dllr, &kp DLLR, LT1 LM1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(prcnt, &kp PRCNT, LT0 LM0, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) -ZMK_COMBO(grave, &kp GRAVE, LM3 LB3, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(bslh, &kp BSLH, LM2 LB2, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(equal, &kp EQUAL, LM1 LB1, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(tilde, &kp TILDE, LM0 LB0, DEF NAV NUM, COMBO_TERM_SLOW) +ZMK_COMBO(grave, &kp GRAVE, LM3 LB3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(bslh, &kp BSLH, LM2 LB2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(equal, &kp EQUAL, LM1 LB1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(tilde, &kp TILDE, LM0 LB0, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) /* Vertical combos - right hand */ -ZMK_COMBO(caret, &kp CARET, RT0 RM0, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(plus, &kp PLUS, RT1 RM1, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(star, &kp STAR, RT2 RM2, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(amps, &kp AMPS, RT3 RM3, DEF NAV NUM, COMBO_TERM_SLOW) +ZMK_COMBO(caret, &kp CARET, RT0 RM0, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(plus, &kp PLUS, RT1 RM1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(star, &kp STAR, RT2 RM2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(amps, &kp AMPS, RT3 RM3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) -ZMK_COMBO(under, &kp UNDER, RM0 RB0, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(minus, &kp MINUS, RM1 RB1, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(fslh, &kp FSLH, RM2 RB2, DEF NAV NUM, COMBO_TERM_SLOW) -ZMK_COMBO(pipe, &kp PIPE, RM3 RB3, DEF NAV NUM, COMBO_TERM_SLOW) +ZMK_COMBO(under, &kp UNDER, RM0 RB0, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(minus, &kp MINUS, RM1 RB1, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(fslh, &kp FSLH, RM2 RB2, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW) +ZMK_COMBO(pipe, &kp PIPE, RM3 RB3, DEF NAV NUM SPACE_LAYER, COMBO_TERM_SLOW)