diff --git a/config/base.keymap b/config/base.keymap index 6117cdf..7b9db18 100644 --- a/config/base.keymap +++ b/config/base.keymap @@ -19,7 +19,7 @@ #define UC 5 #define MOUSE 6 -#include "combos.dtsi" // must be sourced after layer-shortcuts +#include "combos.dtsi" // requires layer aliases #include "mouse.dtsi" #include "extra_keys.h" @@ -36,7 +36,7 @@ }; &sl { // sticky-layer config - ignore-modifiers; + ignore-modifiers; // allow chording sticky mods & layers }; < { // layer-tap config @@ -47,9 +47,9 @@ /* Homerow mods */ -#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 +#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_BEHAVIOR(NAME, hold_tap, \ @@ -94,25 +94,103 @@ ZMK_BEHAVIOR(mt_end, hold_tap, bindings = <&masked_end>, <&kp>; MT_CORE) MASK_MODS(masked_home, (MOD_LCTL), &kp HOME) MASK_MODS(masked_end, (MOD_LCTL), &kp END) -/* Custom behaviors */ +/* Caps-word, num-word and smart-mouse */ + +// tap: sticky-shift | shift + tap/ double-tap: caps-word | hold: shift +ZMK_BEHAVIOR(smart_shft, mod_morph, + bindings = <&sk LSHFT>, <&caps_word>; + mods = <(MOD_LSFT)>; +) +&caps_word { // mods deactivate caps-word, requires PR #1441 + /delete-property/ ignore-modifiers; +}; // tap: num-word | double-tap: sticky num-layer | hold: num-layer -ZMK_BEHAVIOR(num_dance, tap_dance, - tapping-term-ms = <200>; - bindings = <&num_word>, <&sl NUM>; // might want to reverse if rarely using more than 1 digit -) -ZMK_BEHAVIOR(num_layer_word, hold_tap, +#define SMART_NUM &smart_num NUM 0 +ZMK_BEHAVIOR(smart_num, hold_tap, flavor = "balanced"; tapping-term-ms = <200>; quick-tap-ms = ; bindings = <&mo>, <&num_dance>; ) -#define NUM_WORD &num_layer_word NUM 0 +ZMK_BEHAVIOR(num_dance, tap_dance, + tapping-term-ms = <200>; + bindings = <&num_word>, <&sl NUM>; // reverse this for sticky-num on single tap +) +&num_word { // num-word, requires PR #1441 + layers = ; +}; -// tap: sticky-shift | shift + tap/ double-tap: caps-word | hold: shift -ZMK_BEHAVIOR(ss_cw, mod_morph, - bindings = <&sk LSHFT>, <&caps_word>; - mods = <(MOD_LSFT)>; +// smart-mouse, requires PR #1366 +ZMK_BEHAVIOR(smart_mouse, tri_state, + bindings = <&tog MOUSE>, <&none>, <&tog MOUSE>; + ignored-key-positions = ; + ignored-layers = ; +) + +/* Custom behaviors */ + +// Alt+Tab swapper, requires PR #1366 +ZMK_BEHAVIOR(swapper, tri_state, + bindings = <&kt LALT>, <&kp TAB>, <&kt LALT>; + ignored-key-positions = ; +) + +// Sticky layer + sticky shift (workaround for issue #1421) +ZMK_BEHAVIOR(sls, sticky_key, + release-after-ms = <1000>; + bindings = <&uc_shift>; + ignore-modifiers; +) +ZMK_BEHAVIOR(uc_shift, macro, + wait-ms = <0>; + tap-ms = <1>; + bindings = <¯o_press &mo UC &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo UC &kp LSHFT>; +) + +// tap: comma | shift + tap: semicolon | ctrl + shift + tap: < +ZMK_BEHAVIOR(comma_morph, mod_morph, + mods = <(MOD_LSFT|MOD_RSFT)>; + bindings = <&kp COMMA>, <&comma_inner_morph>; +) +ZMK_BEHAVIOR(comma_inner_morph, mod_morph, + bindings = <&kp SEMICOLON>, <&kp LESS_THAN>; + mods = <(MOD_LCTL|MOD_RCTL)>; +) + +// tap: dot | shift + tap: colon | ctrl + shift + tap: > +ZMK_BEHAVIOR(dot_morph, mod_morph, + bindings = <&kp DOT>, <&dot_inner_morph>; + mods = <(MOD_LSFT|MOD_RSFT)>; +) +ZMK_BEHAVIOR(dot_inner_morph, mod_morph, + bindings = <&kp COLON>, <&kp GREATER_THAN>; + mods = <(MOD_LCTL|MOD_RCTL)>; +) + +// tap: qmark | shift + tap: excl +ZMK_BEHAVIOR(qexcl, mod_morph, + bindings = <&kp QMARK>, <&kp EXCL>; + mods = <(MOD_LSFT|MOD_RSFT)>; +) + +// tap: space | shift + tap: dot -> space -> sticky shift | hold: activate layer +ZMK_BEHAVIOR(lt_spc, hold_tap, + flavor = "balanced"; + tapping-term-ms = <200>; + quick-tap-ms = ; + bindings = <&mo>, <&spc_morph>; +) +ZMK_BEHAVIOR(spc_morph, mod_morph, + bindings = <&kp SPACE>, <&dot_spc>; + mods = <(MOD_LSFT|MOD_RSFT)>; +) +ZMK_BEHAVIOR(dot_spc, macro, + wait-ms = <0>; + tap-ms = <5>; + bindings = <&kp DOT &kp SPACE &sk LSHFT>; ) // tap: backspace | lshft + tap: delete | rshft + tap: shift-delete @@ -122,23 +200,6 @@ ZMK_BEHAVIOR(bs_del, mod_morph, keep-mods = ; ) -// tap: space | shift + tap: dot -> space -> sticky shift | hold: activate layer -ZMK_BEHAVIOR(dot_spc, macro, - wait-ms = <0>; - tap-ms = <5>; - bindings = <&kp DOT &kp SPACE &sk LSHFT>; -) -ZMK_BEHAVIOR(spc_morph, mod_morph, - bindings = <&kp SPACE>, <&dot_spc>; - mods = <(MOD_LSFT|MOD_RSFT)>; -) -ZMK_BEHAVIOR(lt_spc, hold_tap, - flavor = "balanced"; - tapping-term-ms = <200>; - quick-tap-ms = ; - bindings = <&mo>, <&spc_morph>; -) - // tap: copy | double-tap: cut ZMK_BEHAVIOR(copy_cut, tap_dance, tapping-term-ms = <200>; @@ -152,77 +213,15 @@ ZMK_BEHAVIOR(win_sleep, macro, bindings = <&kp LG(X) &kp U &kp S>; ) -// Sticky layer + sticky shift (workaround for issue #1421) -ZMK_BEHAVIOR(uc_shift, macro, - wait-ms = <0>; - tap-ms = <1>; - bindings = <¯o_press &mo UC &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo UC &kp LSHFT>; -) -ZMK_BEHAVIOR(sls, sticky_key, - release-after-ms = <1000>; - bindings = <&uc_shift>; - ignore-modifiers; -) - -// tap: comma | shift + tap: semicolon | ctrl + shift + tap: < -ZMK_BEHAVIOR(comma_inner_morph, mod_morph, - bindings = <&kp SEMICOLON>, <&kp LESS_THAN>; - mods = <(MOD_LCTL|MOD_RCTL)>; -) -ZMK_BEHAVIOR(comma_morph, mod_morph, - mods = <(MOD_LSFT|MOD_RSFT)>; - bindings = <&kp COMMA>, <&comma_inner_morph>; -) - -// tap: dot | shift + tap: colon | ctrl + shift + tap: > -ZMK_BEHAVIOR(dot_inner_morph, mod_morph, - bindings = <&kp COLON>, <&kp GREATER_THAN>; - mods = <(MOD_LCTL|MOD_RCTL)>; -) -ZMK_BEHAVIOR(dot_morph, mod_morph, - bindings = <&kp DOT>, <&dot_inner_morph>; - mods = <(MOD_LSFT|MOD_RSFT)>; -) - -// tap: qmark | shift + tap: excl -ZMK_BEHAVIOR(qexcl, mod_morph, - bindings = <&kp QMARK>, <&kp EXCL>; - mods = <(MOD_LSFT|MOD_RSFT)>; -) - -// Alt+Tab swapper, requires PR #1366 -ZMK_BEHAVIOR(swap, tri_state, - bindings = <&kt LALT>, <&kp TAB>, <&kt LALT>; - ignored-key-positions = ; -) - // misc aliases #define CANCEL &kp K_CANCEL // cancel caps-word, num-word and smart-mouse #define DSK_PREV &hmr RSHFT LG(LC(LEFT)) // previous desktop #define DSK_NEXT &hmr LALT LG(LC(RIGHT)) // next desktop #define VOL_DOWN &hmr LCTRL C_VOL_DN -/* Caps-word, num-word and smart-mouse */ - -&caps_word { // mods deactivate caps-word, requires PR #1441 - /delete-property/ ignore-modifiers; -}; - -&num_word { // num-word, requires PR #1441 - layers = ; -}; - -ZMK_BEHAVIOR(smart_mouse, tri_state, // smart-mouse, requires PR #1366 - bindings = <&tog MOUSE>, <&none>, <&tog MOUSE>; - ignored-key-positions = ; - ignored-layers = ; -) - /* Keymap */ -ZMK_CONDITIONAL_LAYER(FN NUM, SYS) // FN + NUM --> SYS +ZMK_CONDITIONAL_LAYER(FN NUM, SYS) // FN + NUM --> SYS ZMK_LAYER(base, //╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ @@ -232,13 +231,13 @@ 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 SMART_NUM &smart_shft X_RH //╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ ) ZMK_LAYER(nav, //╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ ╭──────╮ - X_LT ___ ___ &kp LS(TAB) &swap ___ X_MT &kp PG_UP NAV_BSPC NAV_UP NAV_DEL ___ X_RT + 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 LCTRL &sk LSHFT ___ X_MM &kp PG_DN NAV_LEFT NAV_DOWN NAV_RIGHT &kp RET X_RM //├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ ├──────┤ diff --git a/config/combos.dtsi b/config/combos.dtsi index 3bb9521..2fe1b16 100644 --- a/config/combos.dtsi +++ b/config/combos.dtsi @@ -9,21 +9,21 @@ // use global-quick-tap-ms for combos (requires PR 1387) #undef COMBO_HOOK -#define COMBO_HOOK global-quick-tap-ms = <75>; +#define COMBO_HOOK global-quick-tap-ms = <100>; #define COMBO_TERM_FAST 20 #define COMBO_TERM_SLOW 35 -// make homerow combos tap-only (so mods can be chorded correctly) +// make homerow combos tap-only (so HRMs can be chorded instantaneously) #define HRC_TAB &hml LA(LCTRL) TAB #define HRC_REPEAT &hml_repeat LS(LCTRL) 0 #define HRC_LPAR &hmr RS(LCTRL) LPAR #define HRC_RPAR &hmr LA(LCTRL) RPAR -/* Punctuation (horizontal left hand) */ +/* 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_FAST) +ZMK_COMBO(mouse, &smart_mouse, LT3 LT1, DEF NAV NUM, 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) @@ -32,13 +32,15 @@ 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) -/* Brackets (horizontal right hand) */ +/* 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(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(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) @@ -47,22 +49,23 @@ ZMK_COMBO(rbrc, &kp RBRC, RB2 RB3, NAV , 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) -/* Other symbols (vertical combos) */ +/* 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(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(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) +/* 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(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)