├── .editorconfig ├── config ├── cradio.conf ├── west.yml └── cradio.keymap ├── .github └── workflows │ └── build.yml ├── LICENSE └── readme.md /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*] 3 | charset = utf-8 4 | indent_style = space 5 | indent_size = 4 6 | -------------------------------------------------------------------------------- /config/cradio.conf: -------------------------------------------------------------------------------- 1 | # Copyright 2022 @filterpaper 2 | # SPDX-License-Identifier: MIT 3 | 4 | CONFIG_ZMK_SLEEP=y 5 | CONFIG_ZMK_POINTING=y 6 | CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=1800000 7 | CONFIG_ZMK_BATTERY_REPORT_INTERVAL=21600 8 | CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -------------------------------------------------------------------------------- /config/west.yml: -------------------------------------------------------------------------------- 1 | manifest: 2 | remotes: 3 | - name: zmkfirmware 4 | url-base: https://github.com/zmkfirmware 5 | - name: filterpaper 6 | url-base: https://github.com/filterpaper 7 | projects: 8 | - name: zmk 9 | remote: zmkfirmware 10 | revision: main 11 | import: app/west.yml 12 | self: 13 | path: config 14 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build ZMK firmware 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '0 10 * * *' 6 | push: 7 | paths-ignore: 8 | - '**.md' 9 | 10 | jobs: 11 | build: 12 | uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main 13 | 14 | release: 15 | needs: build 16 | uses: filterpaper/scripts/.github/workflows/publish-artifact.yml@main 17 | with: 18 | release_name: ZMK Firmware 19 | release_tag: latest 20 | 21 | purge: 22 | if: github.event_name == 'schedule' 23 | uses: filterpaper/scripts/.github/workflows/purge-workflow.yml@main 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 @filterpaper 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | This is my personal [ZMK](https://github.com/zmkfirmware/zmk) configuration for 34-key Cradio ([Hypergolic](https://github.com/davidphilipbarr/hypergolic)). It uses contextual hold-tap configuration to make home row modifiers easier to use, along with simple macros to manage the keymap. 3 | 4 | ![kb](https://github.com/filterpaper/filterpaper.github.io/raw/main/images/nice_cradio.png) 5 | 6 |  
 
7 | 8 | # Contextual Hold-Taps 9 | ZMK's interrupt based input detection offers a large number of configuration options for managing hold or tap keys. These are my contextual configuration setup for ease of triggering modifiers while avoiding false positives. 10 | 11 | ## Home Row Modifiers 12 | Modifiers should not be triggered when a mod-tap key is pressed together with another key on the *same hand*. However, they should be triggered when held down and another key is tapped with the *opposite hand*. This is accomplished using `balanced` flavor with the following positional hold-tap behavior for left and right mod-taps: 13 | ```c 14 | #define TAPPING_TERM 240 15 | #define SHIFT_TAP_MS 170 16 | #define QUICK_TAP_MS 140 17 | 18 | lmt: left_mod_tap { 19 | compatible = "zmk,behavior-hold-tap"; 20 | #binding-cells = <2>; 21 | flavor = "preferred"; 22 | tapping-term-ms = ; 23 | quick-tap-ms = ; 24 | bindings = <&kp>, <&kp>; 25 | require-prior-idle-ms = ; 26 | hold-trigger-key-positions = < 27 | 5 6 7 8 9 28 | 13 15 16 17 18 19 29 | 25 26 27 28 29 30 | 30 31 32 33 31 | >; 32 | }; 33 | rmt: right_mod_tap { 34 | compatible = "zmk,behavior-hold-tap"; 35 | #binding-cells = <2>; 36 | flavor = "preferred"; 37 | tapping-term-ms = ; 38 | quick-tap-ms = ; 39 | bindings = <&kp>, <&kp>; 40 | require-prior-idle-ms = ; 41 | hold-trigger-key-positions = < 42 | 0 1 2 3 4 43 | 10 11 12 13 14 16 44 | 17 21 22 23 24 45 | 30 31 32 33 46 | >; 47 | }; 48 | ``` 49 | [Hold trigger keys](https://zmk.dev/docs/keymaps/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) are setup with positions on the opposite hand of each side for ease of activation. The `require-prior-idle-ms` feature is used to prevent unintended modifier activation during regular typing. 50 | 51 | ## Home Row Shift 52 | The home row hold-tap Shift key is setup with a shorter tapping term, using `balanced` flavor and without `require-prior-idle-ms` for quicker capitalization while typing. They are defined with the following bindings: 53 | ```c 54 | lst: left_shift_tap { 55 | compatible = "zmk,behavior-hold-tap"; 56 | #binding-cells = <2>; 57 | flavor = "balanced"; 58 | tapping-term-ms = ; 59 | quick-tap-ms = ; 60 | bindings = <&kp>, <&kp>; 61 | hold-trigger-key-positions = < 62 | 5 6 7 8 9 63 | 15 16 17 18 19 64 | 25 26 27 28 29 65 | 30 31 32 33 66 | >; 67 | }; 68 | rst: right_shift_tap { 69 | compatible = "zmk,behavior-hold-tap"; 70 | #binding-cells = <2>; 71 | flavor = "balanced"; 72 | tapping-term-ms = ; 73 | quick-tap-ms = ; 74 | bindings = <&kp>, <&kp>; 75 | hold-trigger-key-positions = < 76 | 0 1 2 3 4 77 | 10 11 12 13 14 78 | 20 21 22 23 24 79 | 30 31 32 33 80 | >; 81 | }; 82 | ``` 83 | 84 |  
 
85 | 86 | # Preprocessor Macros 87 | Preprocessor macros can minimize code duplication, making it easier to update and modify behavior nodes over time. 88 | ## Home Row Modifiers 89 | Repetitive hold-tap behavior nodes can be simplified to single-line macros that allows customization of home row mod-tap actions with the following definition: 90 | ```c 91 | #define HOLD_TAP(_name_, \ 92 | _flavor_, \ 93 | _tapping_term_, \ 94 | _require_prior_idle_, \ 95 | _key_positions_) \ 96 | _name_: hold_tap_##_name_ { \ 97 | compatible = "zmk,behavior-hold-tap"; \ 98 | #binding-cells = <2>; \ 99 | flavor = #_flavor_; \ 100 | quick-tap-ms = ; \ 101 | tapping-term-ms = <_tapping_term_>; \ 102 | require-prior-idle-ms = <_require_prior_idle_>; \ 103 | hold-trigger-key-positions = <_key_positions_>; \ 104 | bindings = <&kp>, <&kp>; \ 105 | }; 106 | #define L_SHIFT 13 107 | #define R_SHIFT 16 108 | #define L_KEYS 0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 109 | #define R_KEYS 5 6 7 8 9 15 16 17 18 19 25 26 27 28 29 30 31 32 33 110 | 111 | / { 112 | behaviors { 113 | // Positional hold-tap for non-Shift modifiers 114 | HOLD_TAP(lmt, tap-preferred, TAPPING_TERM, QUICK_TAP_MS, L_SHIFT R_KEYS) 115 | HOLD_TAP(rmt, tap-preferred, TAPPING_TERM, QUICK_TAP_MS, R_SHIFT L_KEYS) 116 | // Positional hold-tap for Shift 117 | HOLD_TAP(lst, balanced, SHIFT_TAP_MS, 0, R_KEYS) 118 | HOLD_TAP(rst, balanced, SHIFT_TAP_MS, 0, L_KEYS) 119 | }; 120 | }; 121 | ``` 122 | ## Combos and Macros 123 | Both combos and macros are also simplified into one-liners using the following preprocessors: 124 | ```c 125 | #define COMBO(_name_, _bindings_, _key_positions_) \ 126 | combo_##_name_ { \ 127 | timeout-ms = <30>; \ 128 | require-prior-idle-ms = ; \ 129 | bindings = <_bindings_>; \ 130 | key-positions = <_key_positions_>; \ 131 | layers = <0 1>; \ 132 | }; 133 | 134 | / { 135 | combos { 136 | compatible = "zmk,combos"; 137 | COMBO(caps_w, &caps_word, 13 16) 138 | }; 139 | }; 140 | 141 | 142 | #define MACRO(_name_, _bindings_) \ 143 | _name_: macro_##_name_ { \ 144 | compatible = "zmk,behavior-macro"; \ 145 | #binding-cells = <0>; \ 146 | tap-ms = <1>; \ 147 | wait-ms = <1>; \ 148 | bindings = <_bindings_>; \ 149 | }; 150 | 151 | / { 152 | macros { 153 | MACRO(dir_up, &kp DOT &kp DOT &kp FSLH) 154 | MACRO(bt_0, &out OUT_BLE &bt BT_SEL 0 &bt BT_DISC 1) 155 | }; 156 | }; 157 | ``` 158 | 159 |  
 
160 | 161 | # Useful Links 162 | * nice!nano v2 [Pinout](https://nicekeyboards.com/docs/nice-nano/pinout-schematic/) 163 | * Customizing [ZMK](https://zmk.dev/docs/customization) 164 | * [Hypergolic](https://github.com/davidphilipbarr/hypergolic) PCBs 165 | * [Sockets](https://github.com/joric/nrfmicro/wiki/Sockets) 166 | * [Keymapviz](https://github.com/yskoht/keymapviz) 167 | * [Keymap Drawer](https://github.com/caksoylar/keymap-drawer) 168 | ## Hardware Parts 169 | * Machined [header sockets](https://www.aliexpress.com/item/32852480645.html) 170 | * Mill-Max [315-43-164-41-001000](https://www.digikey.com/en/products/detail/mill-max-manufacturing-corp/315-43-164-41-001000/1212142) sockets 171 | * Mill-Max [connector pins](https://www.digikey.com/product-detail/en/3320-0-00-15-00-00-03-0/ED1134-ND/4147392) 172 | * [301230](https://www.aliexpress.com/item/4000336497558.html) Li-po batteries 173 | * [MSK-12C02](https://www.aliexpress.com/item/1005001398386692.html) SMD Switch 174 | * [Silicone bumper](https://www.aliexpress.com/item/32912066603.html) feet 175 | * Kailh [gchoc v1 switches](https://www.aliexpress.com/item/4000907409650.html) 176 | -------------------------------------------------------------------------------- /config/cradio.keymap: -------------------------------------------------------------------------------- 1 | // Copyright @filterpaper 2 | // SPDX-License-Identifier: MIT 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #define ZMK_POINTING_DEFAULT_MOVE_VAL 2300 10 | #include 11 | 12 | // Adjusted pin arrangement 13 | &kscan0 { 14 | input-gpios 15 | = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 16 | , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 17 | , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 18 | , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 19 | , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 20 | , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 21 | , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 22 | , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 23 | , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 24 | , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 25 | , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 26 | , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 27 | , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 28 | , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 29 | , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 30 | , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 31 | , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> 32 | ; 33 | }; 34 | 35 | 36 | 37 | #define CMK 1 38 | #define SYM 2 39 | #define NUM 3 40 | #define FNC 4 41 | 42 | #define TAPPING_TERM 225 43 | #define QUICK_TAP_MS 105 44 | #define SHIFT_TAP_MS 165 45 | #define COMBO_IDLE_MS TAPPING_TERM 46 | #define PRIOR_IDLE_MS QUICK_TAP_MS 47 | 48 | < { 49 | flavor = "hold-preferred"; 50 | quick-tap-ms = ; 51 | tapping-term-ms = ; 52 | }; 53 | 54 | &mt { 55 | flavor = "tap-preferred"; 56 | quick-tap-ms = ; 57 | tapping-term-ms = ; 58 | }; 59 | 60 | &caps_word { 61 | continue-list = ; 62 | }; 63 | 64 | &mmv { 65 | trigger-period-ms = <8>; 66 | time-to-max-speed-ms = <300>; 67 | acceleration-exponent = <1>; 68 | }; 69 | 70 | 71 | 72 | #define HOLD_TAP(_name_, \ 73 | _flavor_, \ 74 | _tapping_term_, \ 75 | _require_prior_idle_, \ 76 | _key_positions_) \ 77 | _name_: hold_tap_##_name_ { \ 78 | compatible = "zmk,behavior-hold-tap"; \ 79 | #binding-cells = <2>; \ 80 | flavor = #_flavor_; \ 81 | quick-tap-ms = ; \ 82 | tapping-term-ms = <_tapping_term_>; \ 83 | require-prior-idle-ms = <_require_prior_idle_>; \ 84 | hold-trigger-key-positions = <_key_positions_>; \ 85 | bindings = <&kp>, <&kp>; \ 86 | }; 87 | #define L_SHIFT 13 88 | #define R_SHIFT 16 89 | #define L_KEYS 0 1 2 3 4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 90 | #define R_KEYS 5 6 7 8 9 15 16 17 18 19 25 26 27 28 29 30 31 32 33 91 | 92 | / { 93 | behaviors { 94 | // Clipboard shortcuts 95 | HOLD_TAP(ht, tap-preferred, TAPPING_TERM, PRIOR_IDLE_MS, 33) 96 | // Positional hold-tap for non-Shift modifiers 97 | HOLD_TAP(lmt, tap-preferred, TAPPING_TERM, PRIOR_IDLE_MS, L_SHIFT R_KEYS) 98 | HOLD_TAP(rmt, tap-preferred, TAPPING_TERM, PRIOR_IDLE_MS, R_SHIFT L_KEYS) 99 | // Positional hold-tap for Shift 100 | HOLD_TAP(lst, balanced, SHIFT_TAP_MS, 0, R_KEYS) 101 | HOLD_TAP(rst, balanced, SHIFT_TAP_MS, 0, L_KEYS) 102 | }; 103 | }; 104 | 105 | 106 | 107 | #define COMBO(_name_, _bindings_, _key_positions_) \ 108 | combo_##_name_ { \ 109 | timeout-ms = <30>; \ 110 | require-prior-idle-ms = ; \ 111 | bindings = <_bindings_>; \ 112 | key-positions = <_key_positions_>; \ 113 | layers = <0 1>; \ 114 | }; 115 | /* Key positions 116 | 0 1 2 3 4 5 6 7 8 9 117 | 10 11 12 13 14 15 16 17 18 19 118 | 20 21 22 23 24 25 26 27 28 29 119 | 30 31 32 33 */ 120 | / { 121 | combos { 122 | compatible = "zmk,combos"; 123 | // invoke macros 124 | COMBO(vim_q, &vim_q, 0 1) 125 | COMBO(vim_s, &vim_s, 20 21) 126 | COMBO(dir_up, &dir_up, 28 29) 127 | // media keys 128 | COMBO(vol_up, &kp C_VOL_UP, 9 19) 129 | COMBO(vol_dn, &kp C_VOL_DN, 19 29) 130 | // navigation 131 | COMBO(arr_up, &kp UARW, 17 27) 132 | COMBO(arr_dn, &kp DARW, 16 26) 133 | COMBO(arr_lt, &kp LARW, 15 25) 134 | COMBO(arr_rt, &kp RARW, 18 28) 135 | COMBO(pageup, &kp PG_UP, 7 17) 136 | COMBO(pagedn, &kp PG_DN, 6 16) 137 | // shortcuts 138 | COMBO(nav_up, &kp LS(LA(UARW)), 27 28) 139 | COMBO(nav_dn, &kp LS(LA(DARW)), 26 27) 140 | COMBO(sg_spc, &kp LS(LG(SPACE)), 12 13) 141 | // layer toggle 142 | COMBO(numb, &tog NUM, 25 26 33) 143 | COMBO(func, &tog FNC, 23 24 30) 144 | }; 145 | }; 146 | 147 | 148 | 149 | #define MACRO(_name_, _bindings_) \ 150 | _name_: macro_##_name_ { \ 151 | compatible = "zmk,behavior-macro"; \ 152 | #binding-cells = <0>; \ 153 | tap-ms = <1>; \ 154 | wait-ms = <1>; \ 155 | bindings = <_bindings_>; \ 156 | }; 157 | 158 | / { 159 | macros { 160 | MACRO(vim_q, &kp COLON &kp Q &kp EXCL) 161 | MACRO(vim_s, &kp COLON &kp X) 162 | MACRO(dir_up, &kp DOT &kp DOT &kp FSLH) 163 | MACRO(bt_0, &out OUT_BLE &bt BT_DISC 1 &bt BT_SEL 0) 164 | MACRO(bt_1, &out OUT_BLE &bt BT_DISC 0 &bt BT_SEL 1) 165 | MACRO(bt_2, &out OUT_BLE &bt BT_DISC 0 &bt BT_SEL 2) 166 | }; 167 | }; 168 | 169 | 170 | 171 | #define MS_UP &mmv MOVE_UP 172 | #define MS_DN &mmv MOVE_DOWN 173 | #define MS_LT &mmv MOVE_LEFT 174 | #define MS_RT &mmv MOVE_RIGHT 175 | #define WH_UP &msc SCRL_UP 176 | #define WH_DN &msc SCRL_DOWN 177 | #define MS_B1 &mkp MB1 178 | #define MS_B2 &mkp MB2 179 | 180 | #define Z_SLEEP &kp LA(LG(C_PWR)) 181 | #define Z_SSAVE &kp LC(LA(LS(LG(S)))) 182 | #define NAV_UP &kp LS(LA(UARW)) 183 | #define NAV_DN &kp LS(LA(DARW)) 184 | #define ALT_BSP &kp LA(BSPC) 185 | #define ________ &trans 186 | 187 | #define HRML(k1,k2,k3,k4) &lmt LCTRL k1 &lmt LALT k2 &lmt LGUI k3 &lst LSHFT k4 188 | #define HRMR(k1,k2,k3,k4) &rst RSHFT k1 &rmt RGUI k2 &rmt RALT k3 &rmt RCTRL k4 189 | #define HT(k1,k2,k3,k4) &ht LG(V) k1 &ht LG(C) k2 &ht LG(X) k3 &ht LG(Z) k4 190 | 191 | #define SYM_TAB < SYM TAB 192 | #define LCA_ENT &mt LC(LALT) ENTER 193 | #define SFT_SPC &mt RSHFT SPACE 194 | #define NUM_BSP < NUM BSPC 195 | 196 | / { 197 | keymap { 198 | compatible = "zmk,keymap"; 199 | BASE_layer { 200 | bindings = < 201 | //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ 202 | //│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ 203 | &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P 204 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 205 | //│ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ' " │ 206 | HRML(A, S, D, F) &kp G &kp H HRMR(J, K, L, SQT) 207 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 208 | //│ Z │ X │ C │ V │ B │ │ N │ M │ , < │ . > │ / ? │ 209 | &kp Z &kp X &kp C &kp V &kp B &kp N HT(M, COMMA, DOT, FSLH) 210 | //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ 211 | SYM_TAB LCA_ENT SFT_SPC NUM_BSP 212 | // ╰──────────┴──────────╯ ╰──────────┴──────────╯ 213 | >; 214 | }; 215 | CMK_layer { 216 | bindings = < 217 | //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ 218 | //│ Q │ W │ F │ P │ G │ │ J │ L │ U │ Y │ ' " │ 219 | &kp Q &kp W &kp F &kp P &kp G &kp J &kp L &kp U &kp Y &kp SQT 220 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 221 | //│ A │ R │ S │ T │ D │ │ H │ N │ E │ I │ O │ 222 | HRML(A, R, S, T) &kp D &kp H HRMR(N, E, I, O) 223 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 224 | //│ Z │ X │ C │ V │ B │ │ N │ M │ , < │ . > │ / ? │ 225 | &kp Z &kp X &kp C &kp V &kp B &kp K HT(M, COMMA, DOT, FSLH) 226 | //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ 227 | ________ ________ ________ ________ 228 | // ╰──────────┴──────────╯ ╰──────────┴──────────╯ 229 | >; 230 | }; 231 | SYM_layer { 232 | bindings = < 233 | //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ 234 | //│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │ 235 | ________ &kp LBKT &kp LBRC &kp RBRC ________ &kp CARET &kp LPAR &kp RPAR &kp RBKT &kp TILDE 236 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 237 | //│ ! │ @ │ # │ $ │ % │ │ * │ - │ = │ \ │ ` │ 238 | &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp ASTRK &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE 239 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 240 | //│ │ │ < │ > │ │ │ & │ _ │ + │ │ │ │ 241 | ________ ________ &kp LT &kp GT ________ &kp AMPS &kp UNDER &kp PLUS &kp PIPE ________ 242 | //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ 243 | ________ ________ ________ ________ 244 | // ╰──────────┴──────────╯ ╰──────────┴──────────╯ 245 | >; 246 | }; 247 | NUM_layer { 248 | bindings = < 249 | //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ 250 | //│ INSERT │ 1 │ 2 │ 3 │ VOL UP │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │ 251 | &kp INS &kp N1 &kp N2 &kp N3 &kp C_VOL_UP &kp HOME &kp PG_DN &kp PG_UP &kp END &kp COLON 252 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 253 | //│ CAPS │ 4 │ 5 │ 6 │ VOL DN │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │ 254 | &caps_word &kp N4 &kp N5 &kp N6 &kp C_VOL_DN &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp SEMI 255 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 256 | //│ DELETE │ 7 │ 8 │ 9 │ 0 │ │ │ SHFTA DN │ SHFTA UP │ │ │ 257 | &kp DEL &kp N7 &kp N8 &kp N9 &kp N0 ________ NAV_DN NAV_UP ________ ________ 258 | //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ 259 | &mo FNC &kp ESC ________ ________ 260 | // ╰──────────┴──────────╯ ╰──────────┴──────────╯ 261 | >; 262 | }; 263 | FNC_layer { 264 | bindings = < 265 | //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ 266 | //│ RESET │ │ │ │PROFILE 0 │ │ │ WHEEL UP │ WHEEL DN │ │ COLEMAK │ 267 | &sys_reset ________ ________ &out OUT_BLE &bt_0 ________ WH_UP WH_DN ________ &tog CMK 268 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 269 | //│BOOTLOADER│ │ │ │PROFILE 1 │ │ MOUSE LT │ MOUSE DN │ MOUSE UP │ MOUSE RT │BOOTLOADER│ 270 | &bootloader ________ ________ &out OUT_USB &bt_1 MS_LT MS_DN MS_UP MS_RT &bootloader 271 | //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ 272 | //│ SLEEP │ │ │CLEAR PROF│PROFILE 2 │ │ │MOUSE BTN2│MOUSE BTN1│ │ SSAVE │ 273 | Z_SLEEP ________ ________ &bt BT_CLR &bt_2 ________ MS_B2 MS_B1 ________ Z_SSAVE 274 | //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ 275 | ________ ________ ________ ________ 276 | // ╰──────────┴──────────╯ ╰──────────┴──────────╯ 277 | >; 278 | }; 279 | }; 280 | }; 281 | --------------------------------------------------------------------------------