// Copyright (c) 2022 The ZMK Contributors
// SPDX-License-Identifier: MIT
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
// Home row mods macro
#define HRML(k1,k2,k3,k4) &hltl SYM k1 &hml LALT k2 &hml LSHFT k3 &hml LCTRL k4
#define HRMR(k1,k2,k3,k4) &hmr RCTRL k1 &hmr RSHFT k2 &hmr LALT k3 &hltr SYM k4
#define RIGHT_KEYS 5 6 7 8 9 15 16 17 18 19 25 26 27 28 29 32 33
#define LEFT_KEYS 0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31
#define BASE 0
#define SYM 1
#define NUM 2
#define NAV 3
#define CTRL 4
#define WM 5
#define CZ_ACUTE 6
#define CZ_CARET 7
#define FKEYS 8
#define DEAD_KEY_MACRO(name, dead_key, symbol) \
/ { \
macros { \
name: name { \
compatible = "zmk,behavior-macro"; \
wait-ms = <0>; \
tap-ms = <0>; \
#binding-cells = <0>; \
bindings = <¯o_tap dead_key>, \
<¯o_tap &kp symbol> ; \
}; \
}; \
};
#define SHIFTED_DEAD_KEY_MACRO(name, dead_key, symbol) \
/ { \
macros { \
name: name { \
compatible = "zmk,behavior-macro"; \
wait-ms = <0>; \
tap-ms = <0>; \
#binding-cells = <0>; \
bindings = <¯o_tap dead_key>, \
<¯o_tap &kp LS(symbol)>; \
}; \
}; \
};
#define DEAD_KEY_BEHAVIOR(name, nonshifted_name, shifted_name) \
/ { \
behaviors { \
name: name { \
compatible = "zmk,behavior-mod-morph"; \
#binding-cells = <0>; \
bindings = <&nonshifted_name>, <&shifted_name>; \
mods = <(MOD_LSFT|MOD_RSFT)>; \
}; \
}; \
};
#define CZECH_CHAR_MACRO(name, dead_key, symbol) \
DEAD_KEY_MACRO(nonshifted_czech_ ## name, dead_key, symbol) \
SHIFTED_DEAD_KEY_MACRO(shifted_czech_ ## name, dead_key, symbol) \
DEAD_KEY_BEHAVIOR(czech_ ## name, nonshifted_czech_ ## name, shifted_czech_ ## name)
#define CZECH_CARET_MACRO(symbol) \
CZECH_CHAR_MACRO(caret ## _ ## symbol, &kp LS(RA(EQUAL)), symbol)
#define CZECH_ACUTE_MACRO(symbol) \
CZECH_CHAR_MACRO(acute ## _ ## symbol, &kp RA(EQUAL), symbol)
#define CZ_AC_A &czech_acute_A
#define CZ_AC_E &czech_acute_E
#define CZ_AC_I &czech_acute_I
#define CZ_AC_O &czech_acute_O
#define CZ_AC_U &czech_acute_U
#define CZ_AC_Y &czech_acute_Y
#define CZ_CA_E &czech_caret_E
#define CZ_CA_R &czech_caret_R
#define CZ_CA_S &czech_caret_S
#define CZ_CA_D &czech_caret_D
#define CZ_CA_C &czech_caret_C
#define CZ_CA_T &czech_caret_T
#define CZ_CA_Z &czech_caret_Z
#define CZ_CA_N &czech_caret_N
#define CZ_CA_T &czech_caret_T
#define CZ_CA_U &kp RA(SEMI)
CZECH_ACUTE_MACRO(A)
CZECH_ACUTE_MACRO(E)
CZECH_ACUTE_MACRO(I)
CZECH_ACUTE_MACRO(O)
CZECH_ACUTE_MACRO(U)
CZECH_ACUTE_MACRO(Y)
CZECH_CARET_MACRO(E)
CZECH_CARET_MACRO(S)
CZECH_CARET_MACRO(D)
CZECH_CARET_MACRO(C)
CZECH_CARET_MACRO(T)
CZECH_CARET_MACRO(Z)
CZECH_CARET_MACRO(N)
CZECH_CARET_MACRO(R)
< {
tapping-term-ms = <170>;
require-prior-idle-ms = <50>;
quick-tap-ms = <150>;
flavor = "balanced";
hold-trigger-on-release;
};
/ {
behaviors {
prog_caps: prog_caps {
compatible = "zmk,behavior-caps-word";
#binding-cells = <0>;
continue-list = <UNDERSCORE MINUS>;
};
ht: hold_tap {
compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>;
flavor = "tap-preferred";
tapping-term-ms = <220>;
quick-tap-ms = <150>;
require-prior-idle-ms = <100>;
bindings = <&kp>, <&kp>;
};
hltl: home_row_layer_toggle_l {
compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>;
flavor = "balanced";
require-prior-idle-ms = <50>;
tapping-term-ms = <170>;
quick-tap-ms = <100>;
bindings = <&mo>, <&kp>;
hold-trigger-key-positions = <RIGHT_KEYS>;
hold-trigger-on-release;
};
hltr: home_row_layer_toggle_r {
compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>;
flavor = "balanced";
require-prior-idle-ms = <50>;
tapping-term-ms = <170>;
quick-tap-ms = <100>;
bindings = <&mo>, <&kp>;
hold-trigger-key-positions = <LEFT_KEYS>;
hold-trigger-on-release;
};
hml: home_row_mod_left {
compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>;
flavor = "balanced";
require-prior-idle-ms = <50>;
tapping-term-ms = <170>;
quick-tap-ms = <100>;
bindings = <&kp>, <&kp>;
hold-trigger-key-positions = <RIGHT_KEYS>;
hold-trigger-on-release;
};
hmr: home_row_mod_right {
compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>;
flavor = "balanced";
require-prior-idle-ms = <50>;
tapping-term-ms = <170>;
quick-tap-ms = <100>;
bindings = <&kp>, <&kp>;
hold-trigger-key-positions = <LEFT_KEYS>;
hold-trigger-on-release;
};
comma_excl: mod_morph_comma {
compatible = "zmk,behavior-mod-morph";
#binding-cells = <0>;
bindings = <&kp COMMA>, <&kp EXCL>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
dot_ques: mod_morph_dot {
compatible = "zmk,behavior-mod-morph";
#binding-cells = <0>;
bindings = <&kp DOT>, <&kp QMARK>;
mods = <(MOD_LSFT|MOD_RSFT)>;
};
};
combos {
compatible = "zmk,combos";
combo_tab {
timeout-ms = <20>;
key-positions = <1 2>;
bindings = <&kp TAB>;
layers = <BASE>;
};
combo_caps_word {
timeout-ms = <50>;
key-positions = <12 17>;
bindings = <&prog_caps>;
layers = <BASE>;
};
};
conditional_layers {
compatible = "zmk,conditional-layers";
ctrl_layer {
if-layers = <NAV NUM>;
then-layer = <CTRL>;
};
function_layer {
if-layers = <CZ_ACUTE CZ_CARET>;
then-layer = <FKEYS>;
};
};
keymap {
compatible = "zmk,keymap";
default_layer {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │
&hml LGUI Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &hmr RGUI P
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ' " │
HRML(A, S, D, F) &kp G &kp H HRMR(J, K, L, SEMI)
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ Z │ X │ C │ V │ B │ │ N │ M │ , < │ . > │ / ? │
&kp Z &kp X &kp C &kp V &kp B &kp N &hltr 5 M &comma_excl &dot_ques &kp FSLH
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
< NAV ESC < NUM SPACE < CZ_ACUTE ENTER < CZ_CARET BSPC
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
sym_layer {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ ' │ < │ > │ \ │ ` │ │ & │ _ │ [ │ ] │ % │
&kp SQT &kp LT &kp GT &kp BSLH &kp GRAVE &kp AMPS &kp UNDER &kp LBKT &kp RBKT &kp PRCNT
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ ! │ - │ + │ = │ # │ │ | │ ~ │ ( │ ) │ " │
&kp EXCL &kp MINUS &kp PLUS &kp EQUAL &kp HASH &kp PIPE &kp TILDE &kp LPAR &kp RPAR &kp DQT
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ : │ / │ * │ ^ │ │ │ & │ $ │ { │ } │ @ │
&kp COLON &kp FSLH &kp ASTRK &kp CARET &trans &kp AMPS &kp DLLR &kp LBRC &kp RBRC &kp AT
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &kp DEL
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
num_layer {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ │ │ │ │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │
&trans &trans &trans &trans &trans &trans &kp N8 &kp N9 &kp N4 &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ │ │ │ │ │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │
&trans &trans &trans &trans &trans &trans &kp N1 &kp N2 &kp N3 &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ CAPS │ │ │ │ │ │ │ │ │ │ │
&caps_word &trans &trans &trans &trans &trans &kp N7 &kp N6 &kp N5 &trans
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &kp ESC &kp N0 &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
nav_layer {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ │
&kp SCLK &trans &trans &trans &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &kp INS
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ DELETE │ 4 │ 5 │ 6 │ │ │ LEFT │ DOWN │ UP │ RIGHT │ │
&kp CAPS &trans &trans &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp SEMI
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ CAPS │ 7 │ 8 │ 9 │ 0 │ │ │ │ │ │ │
&caps_word &trans &trans &trans &trans &trans &trans &trans &kp K_APP &kp PSCRN
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
ctrl_layer {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │
&sys_reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &sys_reset
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│BOOTLOADER│ │ │ │PROFILE 1 │ │ │ │ │ │BOOTLOADER│
&bootloader &trans &trans &trans &bt BT_SEL 1 &trans &trans &trans &trans &bootloader
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ │ │ │ CLEAR BT │PROFILE 2 │ │ │ │ │ │ │
&trans &trans &trans &bt BT_CLR &bt BT_SEL 2 &trans &trans &trans &trans &trans
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
wm_layer {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
&kp LG(E) &kp LG(N4) &kp LG(N9) &kp LG(N8) &trans &trans &trans &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
&kp LG(W) &kp LG(N3) &kp LG(N2) &kp LG(N1) &trans &trans &trans &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
&kp LG(R) &kp LG(N5) &kp LG(N6) &kp LG(N7) &trans &trans &trans &trans &trans &trans
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
cz_acute {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ │ │ │ │ │ │ │ │ │ │ │
&trans &trans CZ_AC_E &trans &trans CZ_AC_Y CZ_AC_U CZ_AC_I CZ_AC_O &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ │ │ │ │ │ │ │ │ │ │ │
CZ_AC_A &trans &trans &trans &trans &trans &trans &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ │ │ │ │ │ │ │ │ │ │ │
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
cz_caret {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
//│ │ │ │ │ │ │ │ │ │ │ │
&trans &trans CZ_CA_E CZ_CA_R CZ_CA_T &trans CZ_CA_U &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ │ │ │ │ │ │ │ │ │ │ │
&trans CZ_CA_S CZ_CA_D &trans &trans &trans &trans &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ │ │ │ │ │ │ │ │ │ │ │
CZ_CA_Z &trans CZ_CA_C &trans &trans CZ_CA_N &trans &trans &trans &trans
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
function_keys {
bindings = <
//╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮
&trans &kp F4 &kp F9 &kp F8 &kp F10 &trans &trans &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
&trans &kp F3 &kp F2 &kp F1 &kp F11 &trans &trans &trans &trans &trans
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
&trans &kp F5 &kp F6 &kp F7 &kp F12 &trans &trans &trans &trans &trans
//╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯
&trans &trans &trans &trans
// ╰──────────┴──────────╯ ╰──────────┴──────────╯
>;
};
/* transparent { */
/* bindings = < */
/* //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ */
/* //│ │ │ │ │ │ │ │ │ │ │ │ */
/* &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans */
/* //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ */
/* //│ │ │ │ │ │ │ │ │ │ │ │ */
/* &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans */
/* //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ */
/* //│ │ │ │ │ │ │ │ │ │ │ │ */
/* &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans */
/* //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ */
/* &trans &trans &trans &trans */
/* // ╰──────────┴──────────╯ ╰──────────┴──────────╯ */
/* >; */
/* }; */
};
};