diff --git a/README.md b/README.md index 2c32c67..9e04fed 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ See [interactive layer map][6] for overview and documentation. ## Keymaps 🗺️ -- for Engrammer layout: https://my.glove80.com/#/layout/user/58dfc53a-24cd-442d-a786-4d91c7200d6b -- for Arno's Engram 2.0: https://my.glove80.com/#/layout/user/71ec842a-0704-41b4-85ce-b7059c2648e4 +- for Engrammer layout: https://my.glove80.com/#/layout/user/25f556e8-29e8-466a-aaa6-e317519f8ad8 +- for Arno's Engram 2.0: https://my.glove80.com/#/layout/user/d91e2ace-0feb-4278-aeac-f24a45a26df0 ## Installing 🪄 diff --git a/engram.dtsi b/engram.dtsi index 33bb4d3..cf0fcae 100644 --- a/engram.dtsi +++ b/engram.dtsi @@ -1,21 +1,27 @@ ////////////////////////////////////////////////////////////////////// -// IMPORTANT: You need to set Firmware Version to "pr16.zephyr-3-2" // -// or any other newer ZMK 3.2 based firmware (such as PR18 or PR19) // -// under Settings > Advanced Settings in the Glove80 Layout Editor! // +// NOTE: Use the `#define` settings below to customize this keymap! // +////////////////////////////////////////////////////////////////////// +// IMPORTANT: You need to set Firmware Version to "pr19.zephyr-3-2" // +// under Settings > Advanced Settings in the Glove80 Layout Editor // +// if you want to use the `hold-trigger-on-release` feature in ZMK. // +////////////////////////////////////////////////////////////////////// +// CAUTION: PR19 firmware is not production quality; it has issues: // +// https://discord.com/channels/877392805654306816/1137025078979203142 ////////////////////////////////////////////////////////////////////// // -// Sunaku's Layout v21 featuring Engram(mer) layout and Miryoku system -// -// https://sunaku.github.io/moergo-glove80-keyboard.html -// https://discord.com/channels/877392805654306816/1111469812850380831 +// Sunaku's Layout v22 featuring Arno's Engram 2.0 layout and Miryoku +// - https://sunaku.github.io/moergo-glove80-keyboard.html +// - https://sunaku.github.io/engram-keyboard-layout.html +// - https://discord.com/channels/877392805654306816/1111469812850380831 // behaviors { - // - // Miryoku home row mods and thumb layer keys - // https://sunaku.github.io/home-row-mods.html - // https://github.com/urob/zmk-config#timeless-homerow-mods + ////////////////////////////////////////////////////////////////// + // Miryoku layers (thumb keys) and home row mods (non-thumb keys) + // - https://sunaku.github.io/home-row-mods.html + // - https://github.com/urob/zmk-config#timeless-homerow-mods + ////////////////////////////////////////////////////////////////// // // TYPING_STREAK_TERM defines how long you need to wait (milliseconds) // after typing before you can use home row mods again. It prevents @@ -32,22 +38,18 @@ behaviors { // home row mod keys in order to send their modifiers to the computer // (i.e. "register" them) for mod-click mouse usage (e.g. Ctrl-Click). // - // NOTE: The "balanced" flavor of ZMK hold-tap for home row mods already - // provides instant modifier activation for keyboard-only usage, so this - // setting is meant for combined keyboard/mouse usage such as mod-clicks. + #define HOMEY_TAPPING_TERM 260 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER + // + // HOMEY_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use + // for the pinky, ring, and middle fingers (which are assigned to Super, + // Alt, and Ctrl respectively in the Miryoku system) on home row keys. // - #define HOMEY_TAPPING_TERM 280 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER + #define HOMEY_HOLDING_TYPE "tap-preferred" // // INDEX_TAPPING_TERM defines how long you need to hold (milliseconds) // index finger keys in order to send their modifiers to the computer // (i.e. "register" them) for mod-click mouse usage (e.g. Shift-Click). // - // NOTE: The "tap-preferred" flavor of ZMK hold-tap for index finger keys - // allows faster activation of the Shift modifier (without having to wait - // for the modified key to be released as the "balanced" flavor requires). - // Typing streaks and the `hold-trigger-on-release` setting are disabled - // for the index fingers so as not to hinder their speed and dexterity. - // // CAUTION: You'll need to perform inward rolls from pinky->ring->middle // fingers toward the index fingers when activating multiple modifiers // because `hold-trigger-on-release` is disabled for the index fingers. @@ -57,14 +59,34 @@ behaviors { // #define INDEX_TAPPING_TERM 180 // + // INDEX_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use + // for index fingers (which Miryoku assigns to Shift) on home row keys. + // + // NOTE: The "tap-preferred" flavor of ZMK hold-tap for index finger keys + // allows faster activation of the Shift modifier (without having to wait + // for the modified key to be released as the "balanced" flavor requires). + // Typing streaks and the `hold-trigger-on-release` setting are disabled + // for the index fingers so as not to hinder their speed and dexterity. + // + #define INDEX_HOLDING_TYPE "tap-preferred" + // // THUMB_TAPPING_TERM defines how long you need to hold (milliseconds) // a thumb key to activate a layer. Shorter holds are treated as taps. // #define THUMB_TAPPING_TERM 200 // + // THUMB_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use + // for the thumbs (which are assigned to 6 layers in the Miryoku system). + // + // NOTE: The "balanced" flavor of ZMK hold-tap provides instant modifier + // activation for the symbol layer (if the tapped symbol key is released + // while the thumb layer key is still held down) for quicker programming. + // + #define THUMB_HOLDING_TYPE "balanced" + // // Glove80 key positions index for positional hold-tap - // https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248 - // https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png + // - https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248 + // - https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png // // |------------------------|------------------------| // | LEFT_HAND_KEYS | RIGHT_HAND_KEYS | @@ -104,7 +126,7 @@ behaviors { homey_left: miryoku_home_row_mods_left_hand { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_LEFT_HAND"; - flavor = "balanced"; + flavor = HOMEY_HOLDING_TYPE; hold-trigger-key-positions = ; hold-trigger-on-release; // wait for other home row mods tapping-term-ms = ; @@ -116,7 +138,7 @@ behaviors { homey_right: miryoku_home_row_mods_right_hand { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_RIGHT_HAND"; - flavor = "balanced"; + flavor = HOMEY_HOLDING_TYPE; hold-trigger-key-positions = ; hold-trigger-on-release; // wait for other home row mods tapping-term-ms = ; @@ -131,7 +153,7 @@ behaviors { index_left: miryoku_home_row_mods_left_index_shift { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_LEFT_INDEX_SHIFT"; - flavor = "tap-preferred"; + flavor = INDEX_HOLDING_TYPE; hold-trigger-key-positions = ; //hold-trigger-on-release; // don't wait for other mods tapping-term-ms = ; @@ -143,7 +165,7 @@ behaviors { index_right: miryoku_home_row_mods_right_index_shift { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_RIGHT_INDEX_SHIFT"; - flavor = "tap-preferred"; + flavor = INDEX_HOLDING_TYPE; hold-trigger-key-positions = ; //hold-trigger-on-release; // don't wait for other mods tapping-term-ms = ; @@ -158,7 +180,7 @@ behaviors { thumb: miryoku_thumb_layer { compatible = "zmk,behavior-hold-tap"; label = "MIRYOKU_LAYER_TAP_WITH_REPEAT"; - flavor = "balanced"; + flavor = THUMB_HOLDING_TYPE; tapping-term-ms = ; quick-tap-ms = ; // enable repeat //global-quick-tap; // no typing streak @@ -195,8 +217,8 @@ behaviors { // // CapsWord - ported from Pascal Getreuer's extension for QMK - // https://zmk.dev/docs/behaviors/caps-word - // https://getreuer.info/posts/keyboards/caps-word/index.html + // - https://zmk.dev/docs/behaviors/caps-word + // - https://getreuer.info/posts/keyboards/caps-word/index.html // behavior_caps_word { continue-list = ; @@ -204,7 +226,8 @@ behaviors { // // Custom shifted pairs for the Engram layout - // https://engram.dev/ + // - https://engram.dev/ + // - https://sunaku.github.io/engram-keyboard-layout.html // one: engram_one_and_pipe { compatible = "zmk,behavior-mod-morph"; @@ -337,10 +360,17 @@ behaviors { macros { + ////////////////////////////////////////////////////////////////// + // Approximation of Pascal Getreuer's Select Word macro from QMK + // - https://getreuer.info/posts/keyboards/select-word/index.html + ////////////////////////////////////////////////////////////////// // - // Approximation of Pascal Getreuer's SelectWord trick from QMK - // https://getreuer.info/posts/keyboards/select-word/index.html + // SELECT_WORD_DELAY defines how long the macro waits (milliseconds) + // after moving the cursor before it selects a word. A larger delay + // may allow the macro to move to the next word upon each invocation. // + #define SELECT_WORD_DELAY 10 + select_word_right: select_word_right { compatible = "zmk,behavior-macro"; label = "SELECT_WORD_RIGHT"; @@ -349,7 +379,7 @@ macros { wait-ms = <0>; bindings = <¯o_tap &kp LC(RIGHT)> - , <¯o_wait_time 1> // let cursor move to the next word! + , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word! , <¯o_tap &kp LC(LEFT) &kp LC(LS(RIGHT))> ; }; @@ -390,9 +420,8 @@ macros { tap-ms = <0>; wait-ms = <0>; bindings - /* = <¯o_tap &kp LC(RIGHT)> */ = <¯o_tap &kp LC(LEFT)> - , <¯o_wait_time 1> // let cursor move to the next word! + , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word! , <¯o_tap &kp LC(RIGHT) &kp LC(LS(LEFT))> ; }; diff --git a/engram.json b/engram.json index fc0f0b2..0de7733 100644 --- a/engram.json +++ b/engram.json @@ -1,12 +1,12 @@ { "keyboard": "glove80", - "uuid": "", + "uuid": "57cf92fe-3646-4f10-9465-f5022bc565a5", "date": 1694416780, "creator": "", "parent_uuid": "71ec842a-0704-41b4-85ce-b7059c2648e4", "firmware_api_version": "1", - "title": "Sunaku's Layout v21 (Engram)", - "notes": "My Glove80 keymap [1], featuring Arno's Engram 2.0 layout [2] with Miryoku layers & home row mods [3], as discussed on Discord [4].\n\n[1] https://sunaku.github.io/moergo-glove80-keyboard.html\n[2] https://sunaku.github.io/engram-keyboard-layout.html\n[3] https://sunaku.github.io/home-row-mods.html\n[4] https://discord.com/channels/877392805654306816/1111469812850380831\n\nChanges:\n- Symbol layer: swap backslash and percentage to place backslash on the same key as ESC. Percentage is useful as the \"matchit\" operator in Vim.\n- Custom Defined Behaviors: add a CAUTION note about the inward-rolling requirement for index fingers' deviation from hold-trigger-on-release semantics.\n\nInstalling (first time):\n- For the initial flash, use the \"bootloader mass storage device mode\" method (see page 31 in the Glove80 User Guide). Thereafter, use the &bootloader key on any Miryoku layer.\n- After flashing both halves, perform a \"configuration factory reset\" on both halves (see page 36 in the Glove80 User Guide) and then toggle the per-key RGB effects on and then off. This allows the Glove80 beta firmware to take full effect.\n\nUpgrading:\n- Copy the \"Custom Defined Behaviors\" snippet from the textbox on the left and paste into your keymap.\n- See attached screenshots for key positions & assignments that need to be updated manually. Alternatively, you can copy/paste the entire layer from a JSON export (via \"Advanced Settings\" > \"Enable local config\" then go back to \"Edit\" and click \"Download\").", + "title": "Sunaku's Layout v22 (Engram)", + "notes": "My Glove80 keymap [1], featuring Arno's Engram 2.0 layout [2] with Miryoku layers & home row mods [3], as discussed on Discord [4].\n\n[1] https://sunaku.github.io/moergo-glove80-keyboard.html\n[2] https://sunaku.github.io/engram-keyboard-layout.html\n[3] https://sunaku.github.io/home-row-mods.html\n[4] https://discord.com/channels/877392805654306816/1111469812850380831\n\nVersion 22:\n- for release notes: https://github.com/sunaku/glove80-keymaps/releases/tag/v22\n- for setup instructions: https://github.com/sunaku/glove80-keymaps#readme\n\nChanges:\n- Homey mods: use \"tap-preferred\" flavor instead of \"balanced\" for all home row mods. This has significantly improved typing responsiveness (less delay from keystroke to letter showing up on the computer screen) and also increased my confidence of not accidentally triggering home row mods while typing. Hooray!\n- Homey mods: reduce required holding time from 280ms to 260ms.\n- SelectWord macro: increase wait time from 1ms to 10ms for better compatibility in jumping to next word.\n- Custom Defined Behaviors: update header comment to clarify PR19 necessity; add `*_HOLDING_TYPE` definitions for easier customization of ZMK hold-tap behaviors; add `SELECT_WORD_DELAY` definition for SelectWord macros.", "tags": [ "sunaku", "engrammer", @@ -6004,6 +6004,6 @@ } ] ], - "custom_defined_behaviors": "//////////////////////////////////////////////////////////////////////\n// IMPORTANT: You need to set Firmware Version to \"pr16.zephyr-3-2\" //\n// or any other newer ZMK 3.2 based firmware (such as PR18 or PR19) //\n// under Settings > Advanced Settings in the Glove80 Layout Editor! //\n//////////////////////////////////////////////////////////////////////\n//\n// Sunaku's Layout v21 featuring Engram(mer) layout and Miryoku system\n//\n// https://sunaku.github.io/moergo-glove80-keyboard.html\n// https://discord.com/channels/877392805654306816/1111469812850380831\n//\n\nbehaviors {\n\n //\n // Miryoku home row mods and thumb layer keys\n // https://sunaku.github.io/home-row-mods.html\n // https://github.com/urob/zmk-config#timeless-homerow-mods\n //\n // TYPING_STREAK_TERM defines how long you need to wait (milliseconds)\n // after typing before you can use home row mods again. It prevents\n // unintended activation of home row mods when you're actively typing.\n //\n #define TYPING_STREAK_TERM 160 // global-quick-tap-ms\n //\n // KEY_REPEATING_TERM defines how much time you have left (milliseconds)\n // after tapping a key to hold it again in order to make it auto-repeat.\n //\n #define KEY_REPEATING_TERM 300 // \"tap then hold\" for key auto-repeat\n //\n // HOMEY_TAPPING_TERM defines how long you need to hold (milliseconds)\n // home row mod keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Ctrl-Click).\n //\n // NOTE: The \"balanced\" flavor of ZMK hold-tap for home row mods already\n // provides instant modifier activation for keyboard-only usage, so this\n // setting is meant for combined keyboard/mouse usage such as mod-clicks.\n //\n #define HOMEY_TAPPING_TERM 280 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n // INDEX_TAPPING_TERM defines how long you need to hold (milliseconds)\n // index finger keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Shift-Click).\n //\n // NOTE: The \"tap-preferred\" flavor of ZMK hold-tap for index finger keys\n // allows faster activation of the Shift modifier (without having to wait\n // for the modified key to be released as the \"balanced\" flavor requires).\n // Typing streaks and the `hold-trigger-on-release` setting are disabled\n // for the index fingers so as not to hinder their speed and dexterity.\n //\n // CAUTION: You'll need to perform inward rolls from pinky->ring->middle\n // fingers toward the index fingers when activating multiple modifiers\n // because `hold-trigger-on-release` is disabled for the index fingers.\n // Otherwise, you may be surprised that the index fingers' modifier is\n // sent immediately without the rest of your multi-mod chord when you\n // perform outward rolls from your index fingers toward your pinkies.\n //\n #define INDEX_TAPPING_TERM 180\n //\n // THUMB_TAPPING_TERM defines how long you need to hold (milliseconds)\n // a thumb key to activate a layer. Shorter holds are treated as taps.\n //\n #define THUMB_TAPPING_TERM 200\n //\n // Glove80 key positions index for positional hold-tap\n // https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248\n // https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png\n //\n // |------------------------|------------------------|\n // | LEFT_HAND_KEYS | RIGHT_HAND_KEYS |\n // | | |\n // | 0 1 2 3 4 | 5 6 7 8 9 |\n // | 10 11 12 13 14 15 | 16 17 18 19 20 21 |\n // | 22 23 24 25 26 27 | 28 29 30 31 32 33 |\n // | 34 35 36 37 38 39 | 40 41 42 43 44 45 |\n // | 46 47 48 49 50 51 | 58 59 60 61 62 63 |\n // | 64 65 66 67 68 | 75 76 77 78 79 |\n // | 69 52 | 57 74 |\n // | 70 53 | 56 73 |\n // | 71 54 | 55 72 |\n // |------------------------|------------------------|\n //\n #define LEFT_HAND_KEYS \\\n 0 1 2 3 4 \\\n 10 11 12 13 14 15 \\\n 22 23 24 25 26 27 \\\n 34 35 36 37 38 39 \\\n 46 47 48 49 50 51 \\\n 64 65 66 67 68\n #define RIGHT_HAND_KEYS \\\n 5 6 7 8 9 \\\n 16 17 18 19 20 21 \\\n 28 29 30 31 32 33 \\\n 40 41 42 43 44 45 \\\n 58 59 60 61 62 63 \\\n 75 76 77 78 79\n #define THUMB_KEYS \\\n 69 52 57 74 \\\n 70 53 56 73 \\\n 71 54 55 72\n //\n // Home row mod-tap keys for all except index fingers\n //\n homey_left: miryoku_home_row_mods_left_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_HAND\";\n flavor = \"balanced\";\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n homey_right: miryoku_home_row_mods_right_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_HAND\";\n flavor = \"balanced\";\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Special home row mod-tap keys for the index fingers\n //\n index_left: miryoku_home_row_mods_left_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_INDEX_SHIFT\";\n flavor = \"tap-preferred\";\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n index_right: miryoku_home_row_mods_right_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_INDEX_SHIFT\";\n flavor = \"tap-preferred\";\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Thumb cluster hold-tap keys for Miryoku layers\n //\n thumb: miryoku_thumb_layer {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"MIRYOKU_LAYER_TAP_WITH_REPEAT\";\n flavor = \"balanced\";\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&mo>, <&kp>;\n };\n\n // Shift + LEFT_PARENTHESIS = LESS_THAN\n parang_left: left_parenthesis_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"LEFT_PARENTHESIS_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp LEFT_PARENTHESIS>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + RIGHT_PARENTHESIS = GREATER_THAN\n parang_right: right_parenthesis_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"RIGHT_PARENTHESIS_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp RIGHT_PARENTHESIS>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + CapsWord = CapsLock\n cappy: capsword_and_capslock {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"CAPSWORD_AND_CAPSLOCK\";\n #binding-cells = <0>;\n bindings = <&caps_word>, <&kp CAPSLOCK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n //\n // CapsWord - ported from Pascal Getreuer's extension for QMK\n // https://zmk.dev/docs/behaviors/caps-word\n // https://getreuer.info/posts/keyboards/caps-word/index.html\n //\n behavior_caps_word {\n continue-list = ;\n };\n\n //\n // Custom shifted pairs for the Engram layout\n // https://engram.dev/\n //\n one: engram_one_and_pipe {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_ONE_AND_PIPE\";\n #binding-cells = <0>;\n bindings = <&kp N1>, <&kp PIPE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n two: engram_two_and_equal {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_TWO_AND_EQUAL\";\n #binding-cells = <0>;\n bindings = <&kp N2>, <&kp EQUAL>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n three: engram_three_and_tilde {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_THREE_AND_TILDE\";\n #binding-cells = <0>;\n bindings = <&kp N3>, <&kp TILDE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n four: engram_four_and_plus {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_FOUR_AND_PLUS\";\n #binding-cells = <0>;\n bindings = <&kp N4>, <&kp PLUS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n five: engram_five_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_FIVE_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N5>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n six: engram_six_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SIX_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N6>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n seven: engram_seven_and_caret {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SEVEN_AND_CARET\";\n #binding-cells = <0>;\n bindings = <&kp N7>, <&kp CARET>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n eight: engram_eight_and_ampersand {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_EIGHT_AND_AMPERSAND\";\n #binding-cells = <0>;\n bindings = <&kp N8>, <&kp AMPERSAND>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n nine: engram_nine_and_percent {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_NINE_AND_PERCENT\";\n #binding-cells = <0>;\n bindings = <&kp N9>, <&kp PERCENT>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n zero: engram_zero_and_asterisk {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_ZERO_AND_ASTERISK\";\n #binding-cells = <0>;\n bindings = <&kp N0>, <&kp ASTERISK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n apos: engram_apostrophe_and_left_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_APOSTROPHE_AND_LEFT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp APOSTROPHE>, <&kp LEFT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n dquote: engram_double_quotes_and_right_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_DOUBLE_QUOTES_AND_RIGHT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp DOUBLE_QUOTES>, <&kp RIGHT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n comma: engram_comma_and_semicolon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_COMMA_AND_SEMICOLON\";\n #binding-cells = <0>;\n bindings = <&kp COMMA>, <&kp SEMICOLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n period: engram_period_and_colon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_PERIOD_AND_COLON\";\n #binding-cells = <0>;\n bindings = <&kp PERIOD>, <&kp COLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n question: engram_question_and_exclamation {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_QUESTION_AND_EXCLAMATION\";\n #binding-cells = <0>;\n bindings = <&kp QUESTION>, <&kp EXCLAMATION>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n hash: engram_hash_and_dollar {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_HASH_AND_DOLLAR\";\n #binding-cells = <0>;\n bindings = <&kp HASH>, <&kp DOLLAR>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n at: engram_at_and_grave {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_AT_AND_GRAVE\";\n #binding-cells = <0>;\n bindings = <&kp AT>, <&kp GRAVE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n slash: engram_slash_and_backslash {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SLASH_AND_BACKSLASH\";\n #binding-cells = <0>;\n bindings = <&kp SLASH>, <&kp BACKSLASH>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};\n\nmacros {\n\n //\n // Approximation of Pascal Getreuer's SelectWord trick from QMK\n // https://getreuer.info/posts/keyboards/select-word/index.html\n //\n select_word_right: select_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(RIGHT)>\n , <¯o_wait_time 1> // let cursor move to the next word!\n , <¯o_tap &kp LC(LEFT) &kp LC(LS(RIGHT))>\n ;\n };\n extend_word_right: extend_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(RIGHT))>\n ;\n };\n select_line_right: select_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp HOME &kp LS(END)>\n ;\n };\n extend_line_right: extend_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(DOWN) &kp LS(END)>\n ;\n };\n select_word_left: select_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n /* = <¯o_tap &kp LC(RIGHT)> */\n = <¯o_tap &kp LC(LEFT)>\n , <¯o_wait_time 1> // let cursor move to the next word!\n , <¯o_tap &kp LC(RIGHT) &kp LC(LS(LEFT))>\n ;\n };\n extend_word_left: extend_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(LEFT))>\n ;\n };\n select_line_left: select_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp END &kp LS(HOME)>\n ;\n };\n extend_line_left: extend_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(UP) &kp LS(HOME)>\n ;\n };\n select_word: select_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_WORD\";\n #binding-cells = <0>;\n bindings = <&select_word_right>, <&select_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_word: extend_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_WORD\";\n #binding-cells = <0>;\n bindings = <&extend_word_right>, <&extend_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n select_line: select_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_LINE\";\n #binding-cells = <0>;\n bindings = <&select_line_right>, <&select_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_line: extend_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_LINE\";\n #binding-cells = <0>;\n bindings = <&extend_line_right>, <&extend_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};", + "custom_defined_behaviors": "//////////////////////////////////////////////////////////////////////\n// NOTE: Use the `#define` settings below to customize this keymap! //\n//////////////////////////////////////////////////////////////////////\n// IMPORTANT: You need to set Firmware Version to \"pr19.zephyr-3-2\" //\n// under Settings > Advanced Settings in the Glove80 Layout Editor //\n// if you want to use the `hold-trigger-on-release` feature in ZMK. //\n//////////////////////////////////////////////////////////////////////\n// CAUTION: PR19 firmware is not production quality; it has issues: //\n// https://discord.com/channels/877392805654306816/1137025078979203142\n//////////////////////////////////////////////////////////////////////\n//\n// Sunaku's Layout v22 featuring Arno's Engram 2.0 layout and Miryoku\n// - https://sunaku.github.io/moergo-glove80-keyboard.html\n// - https://sunaku.github.io/engram-keyboard-layout.html\n// - https://discord.com/channels/877392805654306816/1111469812850380831\n//\n\nbehaviors {\n\n //////////////////////////////////////////////////////////////////\n // Miryoku layers (thumb keys) and home row mods (non-thumb keys)\n // - https://sunaku.github.io/home-row-mods.html\n // - https://github.com/urob/zmk-config#timeless-homerow-mods\n //////////////////////////////////////////////////////////////////\n //\n // TYPING_STREAK_TERM defines how long you need to wait (milliseconds)\n // after typing before you can use home row mods again. It prevents\n // unintended activation of home row mods when you're actively typing.\n //\n #define TYPING_STREAK_TERM 160 // global-quick-tap-ms\n //\n // KEY_REPEATING_TERM defines how much time you have left (milliseconds)\n // after tapping a key to hold it again in order to make it auto-repeat.\n //\n #define KEY_REPEATING_TERM 300 // \"tap then hold\" for key auto-repeat\n //\n // HOMEY_TAPPING_TERM defines how long you need to hold (milliseconds)\n // home row mod keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Ctrl-Click).\n //\n #define HOMEY_TAPPING_TERM 260 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n // HOMEY_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use\n // for the pinky, ring, and middle fingers (which are assigned to Super,\n // Alt, and Ctrl respectively in the Miryoku system) on home row keys.\n //\n #define HOMEY_HOLDING_TYPE \"tap-preferred\"\n //\n // INDEX_TAPPING_TERM defines how long you need to hold (milliseconds)\n // index finger keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Shift-Click).\n //\n // CAUTION: You'll need to perform inward rolls from pinky->ring->middle\n // fingers toward the index fingers when activating multiple modifiers\n // because `hold-trigger-on-release` is disabled for the index fingers.\n // Otherwise, you may be surprised that the index fingers' modifier is\n // sent immediately without the rest of your multi-mod chord when you\n // perform outward rolls from your index fingers toward your pinkies.\n //\n #define INDEX_TAPPING_TERM 180\n //\n // INDEX_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use\n // for index fingers (which Miryoku assigns to Shift) on home row keys.\n //\n // NOTE: The \"tap-preferred\" flavor of ZMK hold-tap for index finger keys\n // allows faster activation of the Shift modifier (without having to wait\n // for the modified key to be released as the \"balanced\" flavor requires).\n // Typing streaks and the `hold-trigger-on-release` setting are disabled\n // for the index fingers so as not to hinder their speed and dexterity.\n //\n #define INDEX_HOLDING_TYPE \"tap-preferred\"\n //\n // THUMB_TAPPING_TERM defines how long you need to hold (milliseconds)\n // a thumb key to activate a layer. Shorter holds are treated as taps.\n //\n #define THUMB_TAPPING_TERM 200\n //\n // THUMB_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use\n // for the thumbs (which are assigned to 6 layers in the Miryoku system).\n //\n // NOTE: The \"balanced\" flavor of ZMK hold-tap provides instant modifier\n // activation for the symbol layer (if the tapped symbol key is released\n // while the thumb layer key is still held down) for quicker programming.\n //\n #define THUMB_HOLDING_TYPE \"balanced\"\n //\n // Glove80 key positions index for positional hold-tap\n // - https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248\n // - https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png\n //\n // |------------------------|------------------------|\n // | LEFT_HAND_KEYS | RIGHT_HAND_KEYS |\n // | | |\n // | 0 1 2 3 4 | 5 6 7 8 9 |\n // | 10 11 12 13 14 15 | 16 17 18 19 20 21 |\n // | 22 23 24 25 26 27 | 28 29 30 31 32 33 |\n // | 34 35 36 37 38 39 | 40 41 42 43 44 45 |\n // | 46 47 48 49 50 51 | 58 59 60 61 62 63 |\n // | 64 65 66 67 68 | 75 76 77 78 79 |\n // | 69 52 | 57 74 |\n // | 70 53 | 56 73 |\n // | 71 54 | 55 72 |\n // |------------------------|------------------------|\n //\n #define LEFT_HAND_KEYS \\\n 0 1 2 3 4 \\\n 10 11 12 13 14 15 \\\n 22 23 24 25 26 27 \\\n 34 35 36 37 38 39 \\\n 46 47 48 49 50 51 \\\n 64 65 66 67 68\n #define RIGHT_HAND_KEYS \\\n 5 6 7 8 9 \\\n 16 17 18 19 20 21 \\\n 28 29 30 31 32 33 \\\n 40 41 42 43 44 45 \\\n 58 59 60 61 62 63 \\\n 75 76 77 78 79\n #define THUMB_KEYS \\\n 69 52 57 74 \\\n 70 53 56 73 \\\n 71 54 55 72\n //\n // Home row mod-tap keys for all except index fingers\n //\n homey_left: miryoku_home_row_mods_left_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_HAND\";\n flavor = HOMEY_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n homey_right: miryoku_home_row_mods_right_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_HAND\";\n flavor = HOMEY_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Special home row mod-tap keys for the index fingers\n //\n index_left: miryoku_home_row_mods_left_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_INDEX_SHIFT\";\n flavor = INDEX_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n index_right: miryoku_home_row_mods_right_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_INDEX_SHIFT\";\n flavor = INDEX_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Thumb cluster hold-tap keys for Miryoku layers\n //\n thumb: miryoku_thumb_layer {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"MIRYOKU_LAYER_TAP_WITH_REPEAT\";\n flavor = THUMB_HOLDING_TYPE;\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&mo>, <&kp>;\n };\n\n // Shift + LEFT_PARENTHESIS = LESS_THAN\n parang_left: left_parenthesis_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"LEFT_PARENTHESIS_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp LEFT_PARENTHESIS>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + RIGHT_PARENTHESIS = GREATER_THAN\n parang_right: right_parenthesis_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"RIGHT_PARENTHESIS_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp RIGHT_PARENTHESIS>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + CapsWord = CapsLock\n cappy: capsword_and_capslock {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"CAPSWORD_AND_CAPSLOCK\";\n #binding-cells = <0>;\n bindings = <&caps_word>, <&kp CAPSLOCK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n //\n // CapsWord - ported from Pascal Getreuer's extension for QMK\n // - https://zmk.dev/docs/behaviors/caps-word\n // - https://getreuer.info/posts/keyboards/caps-word/index.html\n //\n behavior_caps_word {\n continue-list = ;\n };\n\n //\n // Custom shifted pairs for the Engram layout\n // - https://engram.dev/\n // - https://sunaku.github.io/engram-keyboard-layout.html\n //\n one: engram_one_and_pipe {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_ONE_AND_PIPE\";\n #binding-cells = <0>;\n bindings = <&kp N1>, <&kp PIPE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n two: engram_two_and_equal {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_TWO_AND_EQUAL\";\n #binding-cells = <0>;\n bindings = <&kp N2>, <&kp EQUAL>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n three: engram_three_and_tilde {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_THREE_AND_TILDE\";\n #binding-cells = <0>;\n bindings = <&kp N3>, <&kp TILDE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n four: engram_four_and_plus {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_FOUR_AND_PLUS\";\n #binding-cells = <0>;\n bindings = <&kp N4>, <&kp PLUS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n five: engram_five_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_FIVE_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N5>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n six: engram_six_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SIX_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N6>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n seven: engram_seven_and_caret {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SEVEN_AND_CARET\";\n #binding-cells = <0>;\n bindings = <&kp N7>, <&kp CARET>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n eight: engram_eight_and_ampersand {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_EIGHT_AND_AMPERSAND\";\n #binding-cells = <0>;\n bindings = <&kp N8>, <&kp AMPERSAND>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n nine: engram_nine_and_percent {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_NINE_AND_PERCENT\";\n #binding-cells = <0>;\n bindings = <&kp N9>, <&kp PERCENT>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n zero: engram_zero_and_asterisk {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_ZERO_AND_ASTERISK\";\n #binding-cells = <0>;\n bindings = <&kp N0>, <&kp ASTERISK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n apos: engram_apostrophe_and_left_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_APOSTROPHE_AND_LEFT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp APOSTROPHE>, <&kp LEFT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n dquote: engram_double_quotes_and_right_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_DOUBLE_QUOTES_AND_RIGHT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp DOUBLE_QUOTES>, <&kp RIGHT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n comma: engram_comma_and_semicolon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_COMMA_AND_SEMICOLON\";\n #binding-cells = <0>;\n bindings = <&kp COMMA>, <&kp SEMICOLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n period: engram_period_and_colon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_PERIOD_AND_COLON\";\n #binding-cells = <0>;\n bindings = <&kp PERIOD>, <&kp COLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n question: engram_question_and_exclamation {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_QUESTION_AND_EXCLAMATION\";\n #binding-cells = <0>;\n bindings = <&kp QUESTION>, <&kp EXCLAMATION>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n hash: engram_hash_and_dollar {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_HASH_AND_DOLLAR\";\n #binding-cells = <0>;\n bindings = <&kp HASH>, <&kp DOLLAR>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n at: engram_at_and_grave {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_AT_AND_GRAVE\";\n #binding-cells = <0>;\n bindings = <&kp AT>, <&kp GRAVE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n slash: engram_slash_and_backslash {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SLASH_AND_BACKSLASH\";\n #binding-cells = <0>;\n bindings = <&kp SLASH>, <&kp BACKSLASH>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};\n\nmacros {\n\n //////////////////////////////////////////////////////////////////\n // Approximation of Pascal Getreuer's Select Word macro from QMK\n // - https://getreuer.info/posts/keyboards/select-word/index.html\n //////////////////////////////////////////////////////////////////\n //\n // SELECT_WORD_DELAY defines how long the macro waits (milliseconds)\n // after moving the cursor before it selects a word. A larger delay\n // may allow the macro to move to the next word upon each invocation.\n //\n #define SELECT_WORD_DELAY 10\n\n select_word_right: select_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(RIGHT)>\n , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word!\n , <¯o_tap &kp LC(LEFT) &kp LC(LS(RIGHT))>\n ;\n };\n extend_word_right: extend_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(RIGHT))>\n ;\n };\n select_line_right: select_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp HOME &kp LS(END)>\n ;\n };\n extend_line_right: extend_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(DOWN) &kp LS(END)>\n ;\n };\n select_word_left: select_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LEFT)>\n , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word!\n , <¯o_tap &kp LC(RIGHT) &kp LC(LS(LEFT))>\n ;\n };\n extend_word_left: extend_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(LEFT))>\n ;\n };\n select_line_left: select_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp END &kp LS(HOME)>\n ;\n };\n extend_line_left: extend_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(UP) &kp LS(HOME)>\n ;\n };\n select_word: select_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_WORD\";\n #binding-cells = <0>;\n bindings = <&select_word_right>, <&select_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_word: extend_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_WORD\";\n #binding-cells = <0>;\n bindings = <&extend_word_right>, <&extend_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n select_line: select_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_LINE\";\n #binding-cells = <0>;\n bindings = <&select_line_right>, <&select_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_line: extend_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_LINE\";\n #binding-cells = <0>;\n bindings = <&extend_line_right>, <&extend_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};", "config_parameters": [] } \ No newline at end of file diff --git a/engrammer.dtsi b/engrammer.dtsi index 33bb4d3..2e98d32 100644 --- a/engrammer.dtsi +++ b/engrammer.dtsi @@ -1,21 +1,27 @@ ////////////////////////////////////////////////////////////////////// -// IMPORTANT: You need to set Firmware Version to "pr16.zephyr-3-2" // -// or any other newer ZMK 3.2 based firmware (such as PR18 or PR19) // -// under Settings > Advanced Settings in the Glove80 Layout Editor! // +// NOTE: Use the `#define` settings below to customize this keymap! // +////////////////////////////////////////////////////////////////////// +// IMPORTANT: You need to set Firmware Version to "pr19.zephyr-3-2" // +// under Settings > Advanced Settings in the Glove80 Layout Editor // +// if you want to use the `hold-trigger-on-release` feature in ZMK. // +////////////////////////////////////////////////////////////////////// +// CAUTION: PR19 firmware is not production quality; it has issues: // +// https://discord.com/channels/877392805654306816/1137025078979203142 ////////////////////////////////////////////////////////////////////// // -// Sunaku's Layout v21 featuring Engram(mer) layout and Miryoku system -// -// https://sunaku.github.io/moergo-glove80-keyboard.html -// https://discord.com/channels/877392805654306816/1111469812850380831 +// Sunaku's Layout v22 featuring the Engrammer layout and Miryoku +// - https://sunaku.github.io/moergo-glove80-keyboard.html +// - https://sunaku.github.io/engrammer-keyboard-layout.html +// - https://discord.com/channels/877392805654306816/1111469812850380831 // behaviors { - // - // Miryoku home row mods and thumb layer keys - // https://sunaku.github.io/home-row-mods.html - // https://github.com/urob/zmk-config#timeless-homerow-mods + ////////////////////////////////////////////////////////////////// + // Miryoku layers (thumb keys) and home row mods (non-thumb keys) + // - https://sunaku.github.io/home-row-mods.html + // - https://github.com/urob/zmk-config#timeless-homerow-mods + ////////////////////////////////////////////////////////////////// // // TYPING_STREAK_TERM defines how long you need to wait (milliseconds) // after typing before you can use home row mods again. It prevents @@ -32,22 +38,18 @@ behaviors { // home row mod keys in order to send their modifiers to the computer // (i.e. "register" them) for mod-click mouse usage (e.g. Ctrl-Click). // - // NOTE: The "balanced" flavor of ZMK hold-tap for home row mods already - // provides instant modifier activation for keyboard-only usage, so this - // setting is meant for combined keyboard/mouse usage such as mod-clicks. + #define HOMEY_TAPPING_TERM 260 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER // - #define HOMEY_TAPPING_TERM 280 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER + // HOMEY_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use + // for the pinky, ring, and middle fingers (which are assigned to Super, + // Alt, and Ctrl respectively in the Miryoku system) on home row keys. + // + #define HOMEY_HOLDING_TYPE "tap-preferred" // // INDEX_TAPPING_TERM defines how long you need to hold (milliseconds) // index finger keys in order to send their modifiers to the computer // (i.e. "register" them) for mod-click mouse usage (e.g. Shift-Click). // - // NOTE: The "tap-preferred" flavor of ZMK hold-tap for index finger keys - // allows faster activation of the Shift modifier (without having to wait - // for the modified key to be released as the "balanced" flavor requires). - // Typing streaks and the `hold-trigger-on-release` setting are disabled - // for the index fingers so as not to hinder their speed and dexterity. - // // CAUTION: You'll need to perform inward rolls from pinky->ring->middle // fingers toward the index fingers when activating multiple modifiers // because `hold-trigger-on-release` is disabled for the index fingers. @@ -57,14 +59,34 @@ behaviors { // #define INDEX_TAPPING_TERM 180 // + // INDEX_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use + // for index fingers (which Miryoku assigns to Shift) on home row keys. + // + // NOTE: The "tap-preferred" flavor of ZMK hold-tap for index finger keys + // allows faster activation of the Shift modifier (without having to wait + // for the modified key to be released as the "balanced" flavor requires). + // Typing streaks and the `hold-trigger-on-release` setting are disabled + // for the index fingers so as not to hinder their speed and dexterity. + // + #define INDEX_HOLDING_TYPE "tap-preferred" + // // THUMB_TAPPING_TERM defines how long you need to hold (milliseconds) // a thumb key to activate a layer. Shorter holds are treated as taps. // #define THUMB_TAPPING_TERM 200 // + // THUMB_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use + // for the thumbs (which are assigned to 6 layers in the Miryoku system). + // + // NOTE: The "balanced" flavor of ZMK hold-tap provides instant modifier + // activation for the symbol layer (if the tapped symbol key is released + // while the thumb layer key is still held down) for quicker programming. + // + #define THUMB_HOLDING_TYPE "balanced" + // // Glove80 key positions index for positional hold-tap - // https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248 - // https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png + // - https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248 + // - https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png // // |------------------------|------------------------| // | LEFT_HAND_KEYS | RIGHT_HAND_KEYS | @@ -104,7 +126,7 @@ behaviors { homey_left: miryoku_home_row_mods_left_hand { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_LEFT_HAND"; - flavor = "balanced"; + flavor = HOMEY_HOLDING_TYPE; hold-trigger-key-positions = ; hold-trigger-on-release; // wait for other home row mods tapping-term-ms = ; @@ -116,7 +138,7 @@ behaviors { homey_right: miryoku_home_row_mods_right_hand { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_RIGHT_HAND"; - flavor = "balanced"; + flavor = HOMEY_HOLDING_TYPE; hold-trigger-key-positions = ; hold-trigger-on-release; // wait for other home row mods tapping-term-ms = ; @@ -131,7 +153,7 @@ behaviors { index_left: miryoku_home_row_mods_left_index_shift { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_LEFT_INDEX_SHIFT"; - flavor = "tap-preferred"; + flavor = INDEX_HOLDING_TYPE; hold-trigger-key-positions = ; //hold-trigger-on-release; // don't wait for other mods tapping-term-ms = ; @@ -143,7 +165,7 @@ behaviors { index_right: miryoku_home_row_mods_right_index_shift { compatible = "zmk,behavior-hold-tap"; label = "HOME_ROW_MODS_RIGHT_INDEX_SHIFT"; - flavor = "tap-preferred"; + flavor = INDEX_HOLDING_TYPE; hold-trigger-key-positions = ; //hold-trigger-on-release; // don't wait for other mods tapping-term-ms = ; @@ -158,7 +180,7 @@ behaviors { thumb: miryoku_thumb_layer { compatible = "zmk,behavior-hold-tap"; label = "MIRYOKU_LAYER_TAP_WITH_REPEAT"; - flavor = "balanced"; + flavor = THUMB_HOLDING_TYPE; tapping-term-ms = ; quick-tap-ms = ; // enable repeat //global-quick-tap; // no typing streak @@ -195,152 +217,28 @@ behaviors { // // CapsWord - ported from Pascal Getreuer's extension for QMK - // https://zmk.dev/docs/behaviors/caps-word - // https://getreuer.info/posts/keyboards/caps-word/index.html + // - https://zmk.dev/docs/behaviors/caps-word + // - https://getreuer.info/posts/keyboards/caps-word/index.html // behavior_caps_word { continue-list = ; }; - // - // Custom shifted pairs for the Engram layout - // https://engram.dev/ - // - one: engram_one_and_pipe { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_ONE_AND_PIPE"; - #binding-cells = <0>; - bindings = <&kp N1>, <&kp PIPE>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - two: engram_two_and_equal { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_TWO_AND_EQUAL"; - #binding-cells = <0>; - bindings = <&kp N2>, <&kp EQUAL>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - three: engram_three_and_tilde { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_THREE_AND_TILDE"; - #binding-cells = <0>; - bindings = <&kp N3>, <&kp TILDE>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - four: engram_four_and_plus { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_FOUR_AND_PLUS"; - #binding-cells = <0>; - bindings = <&kp N4>, <&kp PLUS>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - five: engram_five_and_less_than { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_FIVE_AND_LESS_THAN"; - #binding-cells = <0>; - bindings = <&kp N5>, <&kp LESS_THAN>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - six: engram_six_and_greater_than { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_SIX_AND_GREATER_THAN"; - #binding-cells = <0>; - bindings = <&kp N6>, <&kp GREATER_THAN>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - seven: engram_seven_and_caret { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_SEVEN_AND_CARET"; - #binding-cells = <0>; - bindings = <&kp N7>, <&kp CARET>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - eight: engram_eight_and_ampersand { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_EIGHT_AND_AMPERSAND"; - #binding-cells = <0>; - bindings = <&kp N8>, <&kp AMPERSAND>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - nine: engram_nine_and_percent { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_NINE_AND_PERCENT"; - #binding-cells = <0>; - bindings = <&kp N9>, <&kp PERCENT>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - zero: engram_zero_and_asterisk { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_ZERO_AND_ASTERISK"; - #binding-cells = <0>; - bindings = <&kp N0>, <&kp ASTERISK>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - apos: engram_apostrophe_and_left_parenthesis { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_APOSTROPHE_AND_LEFT_PARENTHESIS"; - #binding-cells = <0>; - bindings = <&kp APOSTROPHE>, <&kp LEFT_PARENTHESIS>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - dquote: engram_double_quotes_and_right_parenthesis { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_DOUBLE_QUOTES_AND_RIGHT_PARENTHESIS"; - #binding-cells = <0>; - bindings = <&kp DOUBLE_QUOTES>, <&kp RIGHT_PARENTHESIS>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - comma: engram_comma_and_semicolon { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_COMMA_AND_SEMICOLON"; - #binding-cells = <0>; - bindings = <&kp COMMA>, <&kp SEMICOLON>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - period: engram_period_and_colon { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_PERIOD_AND_COLON"; - #binding-cells = <0>; - bindings = <&kp PERIOD>, <&kp COLON>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - question: engram_question_and_exclamation { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_QUESTION_AND_EXCLAMATION"; - #binding-cells = <0>; - bindings = <&kp QUESTION>, <&kp EXCLAMATION>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - hash: engram_hash_and_dollar { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_HASH_AND_DOLLAR"; - #binding-cells = <0>; - bindings = <&kp HASH>, <&kp DOLLAR>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - at: engram_at_and_grave { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_AT_AND_GRAVE"; - #binding-cells = <0>; - bindings = <&kp AT>, <&kp GRAVE>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - slash: engram_slash_and_backslash { - compatible = "zmk,behavior-mod-morph"; - label = "ENGRAM_SLASH_AND_BACKSLASH"; - #binding-cells = <0>; - bindings = <&kp SLASH>, <&kp BACKSLASH>; - mods = <(MOD_LSFT|MOD_RSFT)>; - }; - }; macros { + ////////////////////////////////////////////////////////////////// + // Approximation of Pascal Getreuer's Select Word macro from QMK + // - https://getreuer.info/posts/keyboards/select-word/index.html + ////////////////////////////////////////////////////////////////// // - // Approximation of Pascal Getreuer's SelectWord trick from QMK - // https://getreuer.info/posts/keyboards/select-word/index.html + // SELECT_WORD_DELAY defines how long the macro waits (milliseconds) + // after moving the cursor before it selects a word. A larger delay + // may allow the macro to move to the next word upon each invocation. // + #define SELECT_WORD_DELAY 10 + select_word_right: select_word_right { compatible = "zmk,behavior-macro"; label = "SELECT_WORD_RIGHT"; @@ -349,7 +247,7 @@ macros { wait-ms = <0>; bindings = <¯o_tap &kp LC(RIGHT)> - , <¯o_wait_time 1> // let cursor move to the next word! + , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word! , <¯o_tap &kp LC(LEFT) &kp LC(LS(RIGHT))> ; }; @@ -390,9 +288,8 @@ macros { tap-ms = <0>; wait-ms = <0>; bindings - /* = <¯o_tap &kp LC(RIGHT)> */ = <¯o_tap &kp LC(LEFT)> - , <¯o_wait_time 1> // let cursor move to the next word! + , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word! , <¯o_tap &kp LC(RIGHT) &kp LC(LS(LEFT))> ; }; diff --git a/engrammer.json b/engrammer.json index 7edaf10..fa4da1a 100644 --- a/engrammer.json +++ b/engrammer.json @@ -1,12 +1,12 @@ { "keyboard": "glove80", "uuid": "", - "date": 1694416504, + "date": 1695134264, "creator": "", - "parent_uuid": "58dfc53a-24cd-442d-a786-4d91c7200d6b", + "parent_uuid": "25f556e8-29e8-466a-aaa6-e317519f8ad8", "firmware_api_version": "1", - "title": "Sunaku's Layout v21 (Engrammer)", - "notes": "My Glove80 keymap [1], featuring the Engrammer layout [2] with Miryoku layers & home row mods [3], as discussed on Discord [4].\n\n[1] https://sunaku.github.io/moergo-glove80-keyboard.html\n[2] https://sunaku.github.io/engrammer-keyboard-layout.html\n[3] https://sunaku.github.io/home-row-mods.html\n[4] https://discord.com/channels/877392805654306816/1111469812850380831\n\nChanges:\n- Symbol layer: swap backslash and percentage to place backslash on the same key as ESC. Percentage is useful as the \"matchit\" operator in Vim.\n- Custom Defined Behaviors: add a CAUTION note about the inward-rolling requirement for index fingers' deviation from hold-trigger-on-release semantics.\n\nInstalling (first time):\n- For the initial flash, use the \"bootloader mass storage device mode\" method (see page 31 in the Glove80 User Guide). Thereafter, use the &bootloader key on any Miryoku layer.\n- After flashing both halves, perform a \"configuration factory reset\" on both halves (see page 36 in the Glove80 User Guide) and then toggle the per-key RGB effects on and then off. This allows the Glove80 beta firmware to take full effect.\n\nUpgrading:\n- Copy the \"Custom Defined Behaviors\" snippet from the textbox on the left and paste into your keymap.\n- See attached screenshots for key positions & assignments that need to be updated manually. Alternatively, you can copy/paste the entire layer from a JSON export (via \"Advanced Settings\" > \"Enable local config\" then go back to \"Edit\" and click \"Download\").", + "title": "Sunaku's Layout v22 (Engrammer)", + "notes": "My Glove80 keymap [1], featuring the Engrammer layout [2] with Miryoku layers & home row mods [3], as discussed on Discord [4].\n\n[1] https://sunaku.github.io/moergo-glove80-keyboard.html\n[2] https://sunaku.github.io/engrammer-keyboard-layout.html\n[3] https://sunaku.github.io/home-row-mods.html\n[4] https://discord.com/channels/877392805654306816/1111469812850380831\n\nVersion 22:\n- for release notes: https://github.com/sunaku/glove80-keymaps/releases/tag/v22\n- for setup instructions: https://github.com/sunaku/glove80-keymaps#readme\n\nChanges:\n- Homey mods: use \"tap-preferred\" flavor instead of \"balanced\" for all home row mods. This has significantly improved typing responsiveness (less delay from keystroke to letter showing up on the computer screen) and also increased my confidence of not accidentally triggering home row mods while typing. Hooray!\n- Homey mods: reduce required holding time from 280ms to 260ms.\n- SelectWord macro: increase wait time from 1ms to 10ms for better compatibility in jumping to next word.\n- Custom Defined Behaviors: update header comment to clarify PR19 necessity; add `*_HOLDING_TYPE` definitions for easier customization of ZMK hold-tap behaviors; add `SELECT_WORD_DELAY` definition for SelectWord macros.", "tags": [ "sunaku", "engrammer", @@ -6004,6 +6004,6 @@ } ] ], - "custom_defined_behaviors": "//////////////////////////////////////////////////////////////////////\n// IMPORTANT: You need to set Firmware Version to \"pr16.zephyr-3-2\" //\n// or any other newer ZMK 3.2 based firmware (such as PR18 or PR19) //\n// under Settings > Advanced Settings in the Glove80 Layout Editor! //\n//////////////////////////////////////////////////////////////////////\n//\n// Sunaku's Layout v21 featuring Engram(mer) layout and Miryoku system\n//\n// https://sunaku.github.io/moergo-glove80-keyboard.html\n// https://discord.com/channels/877392805654306816/1111469812850380831\n//\n\nbehaviors {\n\n //\n // Miryoku home row mods and thumb layer keys\n // https://sunaku.github.io/home-row-mods.html\n // https://github.com/urob/zmk-config#timeless-homerow-mods\n //\n // TYPING_STREAK_TERM defines how long you need to wait (milliseconds)\n // after typing before you can use home row mods again. It prevents\n // unintended activation of home row mods when you're actively typing.\n //\n #define TYPING_STREAK_TERM 160 // global-quick-tap-ms\n //\n // KEY_REPEATING_TERM defines how much time you have left (milliseconds)\n // after tapping a key to hold it again in order to make it auto-repeat.\n //\n #define KEY_REPEATING_TERM 300 // \"tap then hold\" for key auto-repeat\n //\n // HOMEY_TAPPING_TERM defines how long you need to hold (milliseconds)\n // home row mod keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Ctrl-Click).\n //\n // NOTE: The \"balanced\" flavor of ZMK hold-tap for home row mods already\n // provides instant modifier activation for keyboard-only usage, so this\n // setting is meant for combined keyboard/mouse usage such as mod-clicks.\n //\n #define HOMEY_TAPPING_TERM 280 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n // INDEX_TAPPING_TERM defines how long you need to hold (milliseconds)\n // index finger keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Shift-Click).\n //\n // NOTE: The \"tap-preferred\" flavor of ZMK hold-tap for index finger keys\n // allows faster activation of the Shift modifier (without having to wait\n // for the modified key to be released as the \"balanced\" flavor requires).\n // Typing streaks and the `hold-trigger-on-release` setting are disabled\n // for the index fingers so as not to hinder their speed and dexterity.\n //\n // CAUTION: You'll need to perform inward rolls from pinky->ring->middle\n // fingers toward the index fingers when activating multiple modifiers\n // because `hold-trigger-on-release` is disabled for the index fingers.\n // Otherwise, you may be surprised that the index fingers' modifier is\n // sent immediately without the rest of your multi-mod chord when you\n // perform outward rolls from your index fingers toward your pinkies.\n //\n #define INDEX_TAPPING_TERM 180\n //\n // THUMB_TAPPING_TERM defines how long you need to hold (milliseconds)\n // a thumb key to activate a layer. Shorter holds are treated as taps.\n //\n #define THUMB_TAPPING_TERM 200\n //\n // Glove80 key positions index for positional hold-tap\n // https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248\n // https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png\n //\n // |------------------------|------------------------|\n // | LEFT_HAND_KEYS | RIGHT_HAND_KEYS |\n // | | |\n // | 0 1 2 3 4 | 5 6 7 8 9 |\n // | 10 11 12 13 14 15 | 16 17 18 19 20 21 |\n // | 22 23 24 25 26 27 | 28 29 30 31 32 33 |\n // | 34 35 36 37 38 39 | 40 41 42 43 44 45 |\n // | 46 47 48 49 50 51 | 58 59 60 61 62 63 |\n // | 64 65 66 67 68 | 75 76 77 78 79 |\n // | 69 52 | 57 74 |\n // | 70 53 | 56 73 |\n // | 71 54 | 55 72 |\n // |------------------------|------------------------|\n //\n #define LEFT_HAND_KEYS \\\n 0 1 2 3 4 \\\n 10 11 12 13 14 15 \\\n 22 23 24 25 26 27 \\\n 34 35 36 37 38 39 \\\n 46 47 48 49 50 51 \\\n 64 65 66 67 68\n #define RIGHT_HAND_KEYS \\\n 5 6 7 8 9 \\\n 16 17 18 19 20 21 \\\n 28 29 30 31 32 33 \\\n 40 41 42 43 44 45 \\\n 58 59 60 61 62 63 \\\n 75 76 77 78 79\n #define THUMB_KEYS \\\n 69 52 57 74 \\\n 70 53 56 73 \\\n 71 54 55 72\n //\n // Home row mod-tap keys for all except index fingers\n //\n homey_left: miryoku_home_row_mods_left_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_HAND\";\n flavor = \"balanced\";\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n homey_right: miryoku_home_row_mods_right_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_HAND\";\n flavor = \"balanced\";\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Special home row mod-tap keys for the index fingers\n //\n index_left: miryoku_home_row_mods_left_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_INDEX_SHIFT\";\n flavor = \"tap-preferred\";\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n index_right: miryoku_home_row_mods_right_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_INDEX_SHIFT\";\n flavor = \"tap-preferred\";\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Thumb cluster hold-tap keys for Miryoku layers\n //\n thumb: miryoku_thumb_layer {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"MIRYOKU_LAYER_TAP_WITH_REPEAT\";\n flavor = \"balanced\";\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&mo>, <&kp>;\n };\n\n // Shift + LEFT_PARENTHESIS = LESS_THAN\n parang_left: left_parenthesis_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"LEFT_PARENTHESIS_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp LEFT_PARENTHESIS>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + RIGHT_PARENTHESIS = GREATER_THAN\n parang_right: right_parenthesis_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"RIGHT_PARENTHESIS_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp RIGHT_PARENTHESIS>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + CapsWord = CapsLock\n cappy: capsword_and_capslock {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"CAPSWORD_AND_CAPSLOCK\";\n #binding-cells = <0>;\n bindings = <&caps_word>, <&kp CAPSLOCK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n //\n // CapsWord - ported from Pascal Getreuer's extension for QMK\n // https://zmk.dev/docs/behaviors/caps-word\n // https://getreuer.info/posts/keyboards/caps-word/index.html\n //\n behavior_caps_word {\n continue-list = ;\n };\n\n //\n // Custom shifted pairs for the Engram layout\n // https://engram.dev/\n //\n one: engram_one_and_pipe {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_ONE_AND_PIPE\";\n #binding-cells = <0>;\n bindings = <&kp N1>, <&kp PIPE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n two: engram_two_and_equal {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_TWO_AND_EQUAL\";\n #binding-cells = <0>;\n bindings = <&kp N2>, <&kp EQUAL>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n three: engram_three_and_tilde {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_THREE_AND_TILDE\";\n #binding-cells = <0>;\n bindings = <&kp N3>, <&kp TILDE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n four: engram_four_and_plus {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_FOUR_AND_PLUS\";\n #binding-cells = <0>;\n bindings = <&kp N4>, <&kp PLUS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n five: engram_five_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_FIVE_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N5>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n six: engram_six_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SIX_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N6>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n seven: engram_seven_and_caret {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SEVEN_AND_CARET\";\n #binding-cells = <0>;\n bindings = <&kp N7>, <&kp CARET>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n eight: engram_eight_and_ampersand {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_EIGHT_AND_AMPERSAND\";\n #binding-cells = <0>;\n bindings = <&kp N8>, <&kp AMPERSAND>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n nine: engram_nine_and_percent {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_NINE_AND_PERCENT\";\n #binding-cells = <0>;\n bindings = <&kp N9>, <&kp PERCENT>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n zero: engram_zero_and_asterisk {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_ZERO_AND_ASTERISK\";\n #binding-cells = <0>;\n bindings = <&kp N0>, <&kp ASTERISK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n apos: engram_apostrophe_and_left_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_APOSTROPHE_AND_LEFT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp APOSTROPHE>, <&kp LEFT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n dquote: engram_double_quotes_and_right_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_DOUBLE_QUOTES_AND_RIGHT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp DOUBLE_QUOTES>, <&kp RIGHT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n comma: engram_comma_and_semicolon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_COMMA_AND_SEMICOLON\";\n #binding-cells = <0>;\n bindings = <&kp COMMA>, <&kp SEMICOLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n period: engram_period_and_colon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_PERIOD_AND_COLON\";\n #binding-cells = <0>;\n bindings = <&kp PERIOD>, <&kp COLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n question: engram_question_and_exclamation {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_QUESTION_AND_EXCLAMATION\";\n #binding-cells = <0>;\n bindings = <&kp QUESTION>, <&kp EXCLAMATION>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n hash: engram_hash_and_dollar {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_HASH_AND_DOLLAR\";\n #binding-cells = <0>;\n bindings = <&kp HASH>, <&kp DOLLAR>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n at: engram_at_and_grave {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_AT_AND_GRAVE\";\n #binding-cells = <0>;\n bindings = <&kp AT>, <&kp GRAVE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n slash: engram_slash_and_backslash {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ENGRAM_SLASH_AND_BACKSLASH\";\n #binding-cells = <0>;\n bindings = <&kp SLASH>, <&kp BACKSLASH>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};\n\nmacros {\n\n //\n // Approximation of Pascal Getreuer's SelectWord trick from QMK\n // https://getreuer.info/posts/keyboards/select-word/index.html\n //\n select_word_right: select_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(RIGHT)>\n , <¯o_wait_time 1> // let cursor move to the next word!\n , <¯o_tap &kp LC(LEFT) &kp LC(LS(RIGHT))>\n ;\n };\n extend_word_right: extend_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(RIGHT))>\n ;\n };\n select_line_right: select_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp HOME &kp LS(END)>\n ;\n };\n extend_line_right: extend_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(DOWN) &kp LS(END)>\n ;\n };\n select_word_left: select_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n /* = <¯o_tap &kp LC(RIGHT)> */\n = <¯o_tap &kp LC(LEFT)>\n , <¯o_wait_time 1> // let cursor move to the next word!\n , <¯o_tap &kp LC(RIGHT) &kp LC(LS(LEFT))>\n ;\n };\n extend_word_left: extend_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(LEFT))>\n ;\n };\n select_line_left: select_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp END &kp LS(HOME)>\n ;\n };\n extend_line_left: extend_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(UP) &kp LS(HOME)>\n ;\n };\n select_word: select_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_WORD\";\n #binding-cells = <0>;\n bindings = <&select_word_right>, <&select_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_word: extend_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_WORD\";\n #binding-cells = <0>;\n bindings = <&extend_word_right>, <&extend_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n select_line: select_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_LINE\";\n #binding-cells = <0>;\n bindings = <&select_line_right>, <&select_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_line: extend_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_LINE\";\n #binding-cells = <0>;\n bindings = <&extend_line_right>, <&extend_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};", + "custom_defined_behaviors": "//////////////////////////////////////////////////////////////////////\n// NOTE: Use the `#define` settings below to customize this keymap! //\n//////////////////////////////////////////////////////////////////////\n// IMPORTANT: You need to set Firmware Version to \"pr19.zephyr-3-2\" //\n// under Settings > Advanced Settings in the Glove80 Layout Editor //\n// if you want to use the `hold-trigger-on-release` feature in ZMK. //\n//////////////////////////////////////////////////////////////////////\n// CAUTION: PR19 firmware is not production quality; it has issues: //\n// https://discord.com/channels/877392805654306816/1137025078979203142\n//////////////////////////////////////////////////////////////////////\n//\n// Sunaku's Layout v22 featuring the Engrammer layout and Miryoku\n// - https://sunaku.github.io/moergo-glove80-keyboard.html\n// - https://sunaku.github.io/engrammer-keyboard-layout.html\n// - https://discord.com/channels/877392805654306816/1111469812850380831\n//\n\nbehaviors {\n\n //////////////////////////////////////////////////////////////////\n // Miryoku layers (thumb keys) and home row mods (non-thumb keys)\n // - https://sunaku.github.io/home-row-mods.html\n // - https://github.com/urob/zmk-config#timeless-homerow-mods\n //////////////////////////////////////////////////////////////////\n //\n // TYPING_STREAK_TERM defines how long you need to wait (milliseconds)\n // after typing before you can use home row mods again. It prevents\n // unintended activation of home row mods when you're actively typing.\n //\n #define TYPING_STREAK_TERM 160 // global-quick-tap-ms\n //\n // KEY_REPEATING_TERM defines how much time you have left (milliseconds)\n // after tapping a key to hold it again in order to make it auto-repeat.\n //\n #define KEY_REPEATING_TERM 300 // \"tap then hold\" for key auto-repeat\n //\n // HOMEY_TAPPING_TERM defines how long you need to hold (milliseconds)\n // home row mod keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Ctrl-Click).\n //\n #define HOMEY_TAPPING_TERM 260 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n // HOMEY_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use\n // for the pinky, ring, and middle fingers (which are assigned to Super,\n // Alt, and Ctrl respectively in the Miryoku system) on home row keys.\n //\n #define HOMEY_HOLDING_TYPE \"tap-preferred\"\n //\n // INDEX_TAPPING_TERM defines how long you need to hold (milliseconds)\n // index finger keys in order to send their modifiers to the computer\n // (i.e. \"register\" them) for mod-click mouse usage (e.g. Shift-Click).\n //\n // CAUTION: You'll need to perform inward rolls from pinky->ring->middle\n // fingers toward the index fingers when activating multiple modifiers\n // because `hold-trigger-on-release` is disabled for the index fingers.\n // Otherwise, you may be surprised that the index fingers' modifier is\n // sent immediately without the rest of your multi-mod chord when you\n // perform outward rolls from your index fingers toward your pinkies.\n //\n #define INDEX_TAPPING_TERM 180\n //\n // INDEX_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use\n // for index fingers (which Miryoku assigns to Shift) on home row keys.\n //\n // NOTE: The \"tap-preferred\" flavor of ZMK hold-tap for index finger keys\n // allows faster activation of the Shift modifier (without having to wait\n // for the modified key to be released as the \"balanced\" flavor requires).\n // Typing streaks and the `hold-trigger-on-release` setting are disabled\n // for the index fingers so as not to hinder their speed and dexterity.\n //\n #define INDEX_HOLDING_TYPE \"tap-preferred\"\n //\n // THUMB_TAPPING_TERM defines how long you need to hold (milliseconds)\n // a thumb key to activate a layer. Shorter holds are treated as taps.\n //\n #define THUMB_TAPPING_TERM 200\n //\n // THUMB_HOLDING_TYPE defines the flavor of ZMK hold-tap behavior to use\n // for the thumbs (which are assigned to 6 layers in the Miryoku system).\n //\n // NOTE: The \"balanced\" flavor of ZMK hold-tap provides instant modifier\n // activation for the symbol layer (if the tapped symbol key is released\n // while the thumb layer key is still held down) for quicker programming.\n //\n #define THUMB_HOLDING_TYPE \"balanced\"\n //\n // Glove80 key positions index for positional hold-tap\n // - https://discord.com/channels/877392805654306816/937645688244826154/1066713913351221248\n // - https://media.discordapp.net/attachments/937645688244826154/1066713913133121556/image.png\n //\n // |------------------------|------------------------|\n // | LEFT_HAND_KEYS | RIGHT_HAND_KEYS |\n // | | |\n // | 0 1 2 3 4 | 5 6 7 8 9 |\n // | 10 11 12 13 14 15 | 16 17 18 19 20 21 |\n // | 22 23 24 25 26 27 | 28 29 30 31 32 33 |\n // | 34 35 36 37 38 39 | 40 41 42 43 44 45 |\n // | 46 47 48 49 50 51 | 58 59 60 61 62 63 |\n // | 64 65 66 67 68 | 75 76 77 78 79 |\n // | 69 52 | 57 74 |\n // | 70 53 | 56 73 |\n // | 71 54 | 55 72 |\n // |------------------------|------------------------|\n //\n #define LEFT_HAND_KEYS \\\n 0 1 2 3 4 \\\n 10 11 12 13 14 15 \\\n 22 23 24 25 26 27 \\\n 34 35 36 37 38 39 \\\n 46 47 48 49 50 51 \\\n 64 65 66 67 68\n #define RIGHT_HAND_KEYS \\\n 5 6 7 8 9 \\\n 16 17 18 19 20 21 \\\n 28 29 30 31 32 33 \\\n 40 41 42 43 44 45 \\\n 58 59 60 61 62 63 \\\n 75 76 77 78 79\n #define THUMB_KEYS \\\n 69 52 57 74 \\\n 70 53 56 73 \\\n 71 54 55 72\n //\n // Home row mod-tap keys for all except index fingers\n //\n homey_left: miryoku_home_row_mods_left_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_HAND\";\n flavor = HOMEY_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n homey_right: miryoku_home_row_mods_right_hand {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_HAND\";\n flavor = HOMEY_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n hold-trigger-on-release; // wait for other home row mods\n tapping-term-ms = ;\n quick-tap-ms = ;\n global-quick-tap; // with typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Special home row mod-tap keys for the index fingers\n //\n index_left: miryoku_home_row_mods_left_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_LEFT_INDEX_SHIFT\";\n flavor = INDEX_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n index_right: miryoku_home_row_mods_right_index_shift {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"HOME_ROW_MODS_RIGHT_INDEX_SHIFT\";\n flavor = INDEX_HOLDING_TYPE;\n hold-trigger-key-positions = ;\n //hold-trigger-on-release; // don't wait for other mods\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&kp>, <&kp>;\n };\n //\n // Thumb cluster hold-tap keys for Miryoku layers\n //\n thumb: miryoku_thumb_layer {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"MIRYOKU_LAYER_TAP_WITH_REPEAT\";\n flavor = THUMB_HOLDING_TYPE;\n tapping-term-ms = ;\n quick-tap-ms = ; // enable repeat\n //global-quick-tap; // no typing streak\n #binding-cells = <2>;\n bindings = <&mo>, <&kp>;\n };\n\n // Shift + LEFT_PARENTHESIS = LESS_THAN\n parang_left: left_parenthesis_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"LEFT_PARENTHESIS_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp LEFT_PARENTHESIS>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + RIGHT_PARENTHESIS = GREATER_THAN\n parang_right: right_parenthesis_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"RIGHT_PARENTHESIS_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp RIGHT_PARENTHESIS>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n // Shift + CapsWord = CapsLock\n cappy: capsword_and_capslock {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"CAPSWORD_AND_CAPSLOCK\";\n #binding-cells = <0>;\n bindings = <&caps_word>, <&kp CAPSLOCK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n //\n // CapsWord - ported from Pascal Getreuer's extension for QMK\n // - https://zmk.dev/docs/behaviors/caps-word\n // - https://getreuer.info/posts/keyboards/caps-word/index.html\n //\n behavior_caps_word {\n continue-list = ;\n };\n\n};\n\nmacros {\n\n //////////////////////////////////////////////////////////////////\n // Approximation of Pascal Getreuer's Select Word macro from QMK\n // - https://getreuer.info/posts/keyboards/select-word/index.html\n //////////////////////////////////////////////////////////////////\n //\n // SELECT_WORD_DELAY defines how long the macro waits (milliseconds)\n // after moving the cursor before it selects a word. A larger delay\n // may allow the macro to move to the next word upon each invocation.\n //\n #define SELECT_WORD_DELAY 10\n\n select_word_right: select_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(RIGHT)>\n , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word!\n , <¯o_tap &kp LC(LEFT) &kp LC(LS(RIGHT))>\n ;\n };\n extend_word_right: extend_word_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(RIGHT))>\n ;\n };\n select_line_right: select_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp HOME &kp LS(END)>\n ;\n };\n extend_line_right: extend_line_right {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_RIGHT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(DOWN) &kp LS(END)>\n ;\n };\n select_word_left: select_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LEFT)>\n , <¯o_wait_time SELECT_WORD_DELAY> // let cursor move to the next word!\n , <¯o_tap &kp LC(RIGHT) &kp LC(LS(LEFT))>\n ;\n };\n extend_word_left: extend_word_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_WORD_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LC(LS(LEFT))>\n ;\n };\n select_line_left: select_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"SELECT_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp END &kp LS(HOME)>\n ;\n };\n extend_line_left: extend_line_left {\n compatible = \"zmk,behavior-macro\";\n label = \"EXTEND_LINE_LEFT\";\n #binding-cells = <0>;\n tap-ms = <0>;\n wait-ms = <0>;\n bindings\n = <¯o_tap &kp LS(UP) &kp LS(HOME)>\n ;\n };\n select_word: select_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_WORD\";\n #binding-cells = <0>;\n bindings = <&select_word_right>, <&select_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_word: extend_word {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_WORD\";\n #binding-cells = <0>;\n bindings = <&extend_word_right>, <&extend_word_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n select_line: select_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SELECT_LINE\";\n #binding-cells = <0>;\n bindings = <&select_line_right>, <&select_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n extend_line: extend_line {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EXTEND_LINE\";\n #binding-cells = <0>;\n bindings = <&extend_line_right>, <&extend_line_left>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n\n};", "config_parameters": [] } \ No newline at end of file