// -*- mode: dts-mode; tab-width: 2 -*- // Loosely based on https://github.com/urob/zmk-config/tree/main/config #include #include #include #include #define COMBO_TIMEOUT_MS 25 #define DV 0 #define QW 1 #define GAMING 2 #define COLEMAK 3 #define GRAPHITE 4 #define LOW 5 #define UPR 6 #define NAV 7 #define MOUSE 8 #define QVLOW 9 #define GAMELOW 10 #define FN 11 #define SPACEKEY &layer_mo NAV SPACE #define HL1(k) hm_left LGUI k #define HL2(k) hm_left LALT k #define HL3(k) hm_left LCTL k #define HL4(k) hm_left LSHFT k #define HR1(k) hm_right LGUI k #define HR2(k) hm_right LALT k #define HR3(k) hm_right LCTL k #define HR4(k) hm_right LSHFT k #include "extra_keys.h" / { behaviors { hm_left: homerow_modifiers_left { compatible = "zmk,behavior-hold-tap"; flavor = "balanced"; #binding-cells = <2>; tapping-term-ms = <280>; quick-tap-ms = <175>; require-prior-idle-ms = <150>; bindings = <&kp>, <&kp>; hold-trigger-key-positions = ; hold-trigger-on-release; }; hm_right: homerow_modifiers_right { compatible = "zmk,behavior-hold-tap"; flavor = "balanced"; #binding-cells = <2>; tapping-term-ms = <280>; quick-tap-ms = <175>; require-prior-idle-ms = <150>; bindings = <&kp>, <&kp>; hold-trigger-key-positions = ; hold-trigger-on-release; }; layer_mo: layer_modifiers { compatible = "zmk,behavior-hold-tap"; flavor = "balanced"; #binding-cells = <2>; tapping-term-ms = <280>; quick-tap-ms = <175>; require-prior-idle-ms = <150>; bindings = <&mo>, <&kp>; hold-trigger-on-release; }; }; /* combos { */ /* compatible = "zmk,combos"; */ /* combo_q_c_x { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&hm_left LS(LCTRL) LC(B)>; */ /* }; */ /* combo_q_c_c { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&hm_left LA(LCTRL) LC(I)>; */ /* }; */ /* combo_d_c_x { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&hm_left LS(LCTRL) LC(X)>; */ /* }; */ /* combo_d_c_c { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&hm_left LA(LCTRL) LC(C)>; */ /* }; */ /* combo_tab { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&kp TAB>; */ /* }; */ /* combo_ret { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&hm_right LS(LCTRL) RET>; */ /* }; */ /* combo_bspc { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&kp BSPC>; */ /* }; */ /* combo_del { */ /* timeout-ms = ; */ /* require-prior-idle-ms = <100>; */ /* key-positions = ; */ /* layers = ; */ /* bindings = <&kp DEL>; */ /* }; */ /* } ; */ conditional_layers { compatible = "zmk,conditional-layers"; fn_layer { if-layers = ; then-layer = ; }; qwlow_layer { if-layers = ; then-layer = ; }; gamelow_layer { if-layers = ; then-layer = ; }; }; keymap { compatible = "zmk,keymap"; default_layer { display-name = "Dvorak"; // DV - Dvorak layer bindings = < R1X &kp SQT &kp COMMA &kp DOT &kp P &kp Y R1Y &kp F &kp G &kp C &kp R &kp L R1Z R2X &HL1(A) &HL2(O) &HL3(E) &HL4(U) &kp I R2Y &kp D &HR4(H) &HR3(T) &HR2(N) &HR1(S) R2Z R3X &kp SEMI &kp Q &kp J &kp K &kp X R3Y &kp B &kp M &kp W &kp V &kp Z R3Z R4X &mo LOW &kp LSHIFT R4Y SPACEKEY &mo UPR R4Z >; }; dvorak_layer { display-name = "Qwerty"; // This is a "QWERTY" keymap, but it's really intended to be used in dvorak mode // (with setxkbmap us -variant dvorak -option compose:ralt). bindings = < R1X &kp Q &kp W &kp E &kp R &kp T R1Y &kp Y &kp U &kp I &kp O &kp P R1Z R2X &HL1(A) &HL2(S) &HL3(D) &HL4(F) &kp G R2Y &kp H &HR4(J) &HR3(K) &HR2(L) &HR1(SEMI) R2Z R3X &kp Z &kp X &kp C &kp V &kp B R3Y &kp N &kp M &kp COMMA &kp DOT &kp SLASH R3Z R4X &mo LOW &kp LSHIFT R4Y SPACEKEY &mo UPR R4Z >; }; gaming_layer { display-name = "Gaming"; bindings = < R1X &kp Q &kp W &kp E &kp R &kp T R1Y &kp Y &kp U &kp I &kp O &kp P R1Z R2X &kp A &kp S &kp D &kp F &kp G R2Y &kp H &kp J &kp K &kp L &kp SEMI R2Z R3X &kp Z &kp X &kp C &kp V &kp B R3Y &kp N &kp M &kp COMMA &kp DOT &kp SLASH R3Z R4X &mo LOW &kp LSHIFT R4Y SPACEKEY &mo UPR R4Z >; }; colemak_layer { display-name = "Colemak"; bindings = < R1X &kp Q &kp W &kp F &kp P &kp B R1Y &kp J &kp L &kp U &kp Y &kp SEMI R1Z R2X &kp A &kp R &kp S &kp T &kp G R2Y &kp M &kp N &kp E &kp I &kp O R2Z R3X &kp Z &kp X &kp C &kp D &kp V R3Y &kp K &kp H &kp COMMA &kp DOT &kp SQT R3Z R4X &mo LOW &kp LSHIFT R4Y SPACEKEY &mo UPR R4Z >; }; graphite_layer { display-name = "Graphite"; bindings = < R1X &kp B &kp L &kp D &kp W &kp Z R1Y &kp SQT &kp F &kp O &kp U &kp J R1Z R2X &HL1(N) &HL2(R) &HL3(T) &HL4(S) &kp G R2Y &kp Y &HL4(H) &HL3(A) &HL2(E) &HL1(I) R2Z R3X &kp Q &kp X &kp M &kp C &kp V R3Y &kp K &kp P &kp DOT &kp MINUS &kp FSLH R3Z R4X &mo LOW SPACEKEY R4Y &kp LSHIFT &mo UPR R4Z >; }; lower_layer { display-name = "lower"; bindings = < R1X &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT R1Y &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR R1Z R2X &kp LGUI &kp LALT &kp LCTL &kp LSHFT &kp BSLH R2Y &kp FSLH &kp UNDER &kp PLUS &kp LBRC &kp RBRC R2Z R3X &kp GRAVE &kp TILDE &kp TAB &kp ESC &kp PIPE R3Y &kp QMARK &kp MINUS &kp EQUAL &kp LBKT &kp RBKT R3Z R4X &trans &trans SPACEKEY R4Y &trans &trans R4Z >; }; raise_layer { display-name = "raise"; bindings = < R1X &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 R1Y &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 R1Z R2X &trans &trans &trans &trans &trans R2Y &kp BSPC &kp LSHFT &kp LCTL &kp LALT &kp LGUI R2Z R3X &trans &trans &trans &trans &trans R3Y &kp RALT &kp RET &kp DEL &trans &trans R3Z R4X &trans &trans SPACEKEY R4Y TX &trans &trans R4Z >; }; navigation_layer { display-name = "nav"; bindings = < R1X &mkp MB4 &mkp MB3 &mkp MB2 &mkp MB1 &trans R1Y &trans &trans &trans &trans &trans R1Z R2X &trans &trans &trans &trans &trans R2Y &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT R2Z R3X &trans &trans &trans &trans &trans R3Y &trans &kp HOME &kp PG_DN &kp PG_UP &kp END R3Z R4X &trans &trans SPACEKEY R4Y TX &trans &trans R4Z >; }; mouse_layer { // Waiting for https://github.com/zmkfirmware/zmk/pull/778 // Using fork at https://github.com/ftc/zmk/blob/mouse-ftc display-name = "mouse"; bindings = < R1X &trans &trans &trans &trans &trans R1Y &trans &trans &trans &trans &trans R1Z R2X &mkp MB4 &mkp MB3 &mkp MB2 &mkp MB1 &trans R2Y &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT R2Z R3X &trans &trans &trans &trans &trans R3Y &trans &trans &trans &trans &trans R3Z R4X &trans &trans SPACEKEY R4Y TX &trans &trans R4Z >; }; qwerty_lower_layer { display-name = "lower"; bindings = < R1X &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT R1Y &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR R1Z R2X &kp LGUI &kp LALT &kp LCTL &kp LSHFT &kp BSLH R2Y &kp LBKT &kp DQT &kp RBRC &kp UNDER &kp PLUS R2Z R3X &kp GRAVE &kp TILDE &kp TAB &kp ESC &kp PIPE R3Y &kp LBRC &kp SQT &kp RBKT &kp MINUS &kp EQUAL R3Z R4X &trans &trans SPACEKEY R4Y TX &trans &trans R4Z >; }; gaming_lower_layer { display-name = "gaming"; bindings = < R1X &kp N1 &kp N2 &kp N3 &kp N4 &kp N9 R1Y &trans &trans &trans &trans &trans R1Z R2X &kp N5 &kp N6 &kp N7 &kp N8 &kp N0 R2Y &trans &trans &trans &trans &trans R2Z R3X &trans &trans &trans &trans &trans R3Y &trans &trans &trans &trans &trans R3Z R4X &trans &trans SPACEKEY R4Y TX &trans &trans R4Z >; }; // TODO: Add gaming layer. function_layer { display-name = "fn"; bindings = < R1X &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 R1Y &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 R1Z R2X &kp F11 &kp F12 &trans &to DV &to QW R2Y &to COLEMAK &to GRAPHITE &trans &trans &trans R2Z R3X FUNC_KEYS R3Z R4X &trans &trans SPACEKEY R4Y TX &trans &trans R4Z >; }; }; };