// commetns #include #include // requires auto-layer module #include #ifdef CONFIG_WIRELESS #include #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/german.dtsi" #include "zmk-helpers/unicode-chars/greek.dtsi" #define DEF 0 #define NAV 1 #define FN 2 #define NUM 3 #define SYS 4 #define MOUSE 5 #define XXX &none #define ___ &trans /* Global settings */ #define QUICK_TAP_MS 175 &sk { // sticky-key config release - after - ms = <900>; // release after 0.9s 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 #ifndef LH2 #define THUMBS LH1 LH0 RH0 RH1 // thumbs on 34 keys #else #define THUMBS LH2 LH1 LH0 RH0 RH1 RH2 // thumbs on 36+ keys #endif #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 // HRM combo hack - workaround for lack of tap-only combos (ZMK issue #544) #define ZMK_COMBO_8(NAME, TAP, KEYPOS, LAYERS, COMBO_TERM, COMBO_IDLE, HOLD, \ SIDE) \ MAKE_HRM(hm_combo_##NAME, &kp, TAP, SIDE THUMBS) \ ZMK_COMBO_6(NAME, &hm_combo_##NAME HOLD 0, KEYPOS, LAYERS, COMBO_TERM, \ COMBO_IDLE) /* Combos, leader key sequences, mouse emulation */ #include "combos.dtsi" // must be sources after HRM-combo hack #include "extra_keys.h" #include "leader.dtsi" #include "mouse.dtsi" /* 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 = ;) // 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)>;) // Sticky shift + leader ZMK_MACRO(leader_sft, bindings = < &sk LSHFT & leader > ;) // 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 & lt_spc NAV 0 & lt 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 ___ ___ ___ 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 ___ 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(mouse, // ╭──────╮ // ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ // ╭──────╮ // ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ // ╭──────╮ X_LT ___ ___ ___ ___ ___ X_MT ___ &kp PG_UP U_MS_U &kp PG_DN ___ X_RT // ├──────┤ // ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ // ├──────┤ // ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ // ├──────┤ X_LM ___ ___ ___ ___ ___ X_MM U_WH_L U_MS_L U_MS_D U_MS_R U_WH_R X_RM // ├──────┤ // ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ // ├──────┤ // ├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤ // ├──────┤ X_LB ___ ___ ___ ___ ___ X_MB ___ &mkp LCLK &mkp MCLK &mkp RCLK ___ X_RB // ├──────┤ // ╰─────────────┼─────────────┴─────────────┼─────────────┼─────────────┤ // ├──────┤ // ├─────────────┼─────────────┼─────────────┴───────────────────────────╯ // ├──────┤ X_LH ___ ___ X_MH U_WH_U U_WH_D X_RH // ╰──────╯ ╰─────────────┴─────────────╯ ╰──────╯ // ╰─────────────┴─────────────╯ ╰──────╯ ) /* vim: set ft=c tw=174: */