diff --git a/README.md b/README.md index 5c16e70..6fc7c44 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/d2c58310-f226-4542-97d5-ebce0ffe61a7 -- for Arno's Engram 2.0: https://my.glove80.com/#/layout/user/2ae4bc80-2361-4c5a-ac43-f984fdc5b1c3 +- for Engrammer layout: https://my.glove80.com/#/layout/user/2ca35aae-67bf-4d9a-a5ee-38a2dc6520c4 +- for Arno's Engram 2.0: https://my.glove80.com/#/layout/user/c950bf51-8758-406b-ab28-58d7bba4ade9 ## Installing πŸͺ„ diff --git a/engram.dtsi b/engram.dtsi index d26dedc..a63706c 100644 --- a/engram.dtsi +++ b/engram.dtsi @@ -9,11 +9,8 @@ // https://discord.com/channels/877392805654306816/1137025078979203142 ////////////////////////////////////////////////////////////////////// // -// Sunaku's Keymap v23 featuring Arno's Engram 2.0 layout and Miryoku +// Sunaku's Keymap v24 featuring Arno's Engram 2.0 layout with Miryoku // - https://github.com/sunaku/glove80-keymaps -// - https://sunaku.github.io/moergo-glove80-keyboard.html -// - https://sunaku.github.io/engram-keyboard-layout.html -// - https://discord.com/channels/877392805654306816/1111469812850380831 // behaviors { diff --git a/engram.json b/engram.json index e470ea4..8dac466 100644 --- a/engram.json +++ b/engram.json @@ -1,13 +1,13 @@ { "keyboard": "glove80", "uuid": "", - "date": 1695135947, + "date": 1696232432, "creator": "", - "parent_uuid": "2ae4bc80-2361-4c5a-ac43-f984fdc5b1c3", + "parent_uuid": "c950bf51-8758-406b-ab28-58d7bba4ade9", "firmware_api_version": "1", "locale": "en-US", - "title": "Sunaku's Layout v23 (Engram)", - "notes": "Sunaku's Keymap v23 featuring Arno's Engram 2.0 layout and legendary Miryoku\n- for setup instructions: https://github.com/sunaku/glove80-keymaps#readme\n- for release notes: https://github.com/sunaku/glove80-keymaps/releases/tag/v23\n- for upgrade diffs: https://github.com/sunaku/glove80-keymaps/compare/v22...v23\n\nSummary:\nHey everyone, I'm pleased to announce a new version 23 of my Glove80 keymaps featuring ultra responsive ⚑️ and satisfyingly *crisp* home row mods. πŸ‘Œ This is it! ❀️‍πŸ”₯\n\nChanges:\n- Split `TYPING_STREAK_TERM` into separate `HOMEY_STREAK_DECAY` and `INDEX_STREAK_DECAY` settings.\n- Renamed settings: `*_TAPPING_TERM` to `*_HOLDING_TIME`, and `KEY_REPEATING_TERM` to `THUMB_REPEAT_DECAY`.\n- Reduced `THUMB_REPEAT_DECAY` from 300ms to 200ms to allow faster access to characters in symbol layer separated by spaces, such as the equal sign in \"x = y\" assignments.\n- Reduced `THUMB_HOLDING_TIME` from 200ms to 170ms for faster layer activation and responsive typing (spaces after words).\n- Enabled retro-tap for thumb keys for lingering taps (e.g. when I type \"after \", the space after R wasn't being emitted).\n- Enabled typing streaks for index fingers and reduced `INDEX_STREAK_DECAY` from 160ms to 70ms for faster CamelCase typing.\n- Reduced `INDEX_HOLDING_TIME` from 180ms to 170ms for CamelCase: 160ms \"av\" -> \"v\", 170ms \"av\" -> \"V\", 180ms \"av\" -> \"av\".\n- Aligned all timing thresholds to 70ms which is the magic number for me. πŸͺ„ I determined this using my typing layer on the QMK Configurator's testing tool at https://config.qmk.fm/#/test whereby I would pretend to use home row mods and observe the timing & duration of keystrokes as reported by the testing tool. πŸ₯Ό", + "title": "Sunaku's Layout v24 (Engram)", + "notes": "Sunaku's Keymap v24 featuring Arno's Engram 2.0 layout and legendary Miryoku\n- for setup instructions: https://github.com/sunaku/glove80-keymaps#readme\n- for release notes: https://github.com/sunaku/glove80-keymaps/releases/tag/v24\n- for upgrade diffs: https://github.com/sunaku/glove80-keymaps/compare/v23...v24\n\nSummary:\nHey everyone, I'm pleased to announce a new version 24 of my Glove80 keymaps featuring a completed symbol layer. πŸ’―\n\nChanges:\n- Symbol layer: put apostrophe, comma, dot (like the Dvorak layout) on bottom row. The comma and dot align with the angle brackets above them. The apostrophe is just there for completeness; and `'<,'>` ranges in Vim.\n- Text selection macros: reduce delay from 30ms to 1ms because the latency is visibly noticeable with 30ms and thus it feels a lot slower... I'm having to wait for it to finish selecting. 😩 This ignores ZMK docs: \"a wait and tap time of at least 30ms is recommended to avoid having HID notifications grouped at the BLE protocol level and then processed out of order\", because 1ms worked fine for me all along.\n- Use `ZMK_MACRO()` convenience C macro to simplify implementation and also document & reorganize definitions for better readability.", "tags": [ "sunaku", "engrammer", @@ -3694,7 +3694,7 @@ "value": "&kp", "params": [ { - "value": "LBKT", + "value": "COMMA", "params": [] } ] @@ -3703,7 +3703,7 @@ "value": "&kp", "params": [ { - "value": "RBKT", + "value": "LBKT", "params": [] } ] @@ -3730,7 +3730,7 @@ "value": "&kp", "params": [ { - "value": "SEMI", + "value": "RBKT", "params": [] } ] @@ -3739,7 +3739,7 @@ "value": "&kp", "params": [ { - "value": "COMMA", + "value": "SEMI", "params": [] } ] @@ -4082,8 +4082,13 @@ "params": [] }, { - "value": "&none", - "params": [] + "value": "&kp", + "params": [ + { + "value": "SQT", + "params": [] + } + ] }, { "value": "&kp", @@ -4116,7 +4121,7 @@ "value": "&kp", "params": [ { - "value": "SEMI", + "value": "DOT", "params": [] } ] @@ -6005,6 +6010,6 @@ } ] ], - "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 Keymap v23 featuring Arno's Engram 2.0 layout and Miryoku\n// - https://github.com/sunaku/glove80-keymaps\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 and home row mods (ported from my QMK endgame)\n // - https://sunaku.github.io/home-row-mods.html#porting-to-zmk\n // - https://github.com/urob/zmk-config#timeless-homerow-mods\n //\n //----------------------------------------------------------------\n // homey fingers (pinky, ring, middle)\n //----------------------------------------------------------------\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 // HOMEY_HOLDING_TIME 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_HOLDING_TIME 270 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n //\n // HOMEY_STREAK_DECAY 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 HOMEY_STREAK_DECAY 170 // global-quick-tap-ms\n //\n //----------------------------------------------------------------\n // index fingers\n //----------------------------------------------------------------\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 // INDEX_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // INDEX_STREAK_DECAY 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 INDEX_STREAK_DECAY 70 // global-quick-tap-ms\n //\n //----------------------------------------------------------------\n // thumbs\n //----------------------------------------------------------------\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 // THUMB_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // THUMB_REPEAT_DECAY 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 THUMB_REPEAT_DECAY 200 // \"tap then hold\" for key auto-repeat\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 = ;\n global-quick-tap; // with 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 = ;\n global-quick-tap; // with 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 retro-tap; // allow slow (hold-like) taps\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};", + "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 Keymap v24 featuring Arno's Engram 2.0 layout with Miryoku\n// - https://github.com/sunaku/glove80-keymaps\n//\n\nbehaviors {\n\n //////////////////////////////////////////////////////////////////\n //\n // Miryoku layers and home row mods (ported from my QMK endgame)\n // - https://sunaku.github.io/home-row-mods.html#porting-to-zmk\n // - https://github.com/urob/zmk-config#timeless-homerow-mods\n //\n //////////////////////////////////////////////////////////////////\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 // HOMEY_HOLDING_TIME 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_HOLDING_TIME 270 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n // HOMEY_STREAK_DECAY 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 HOMEY_STREAK_DECAY 170 // global-quick-tap-ms\n //\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 // INDEX_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // INDEX_STREAK_DECAY 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 INDEX_STREAK_DECAY 70 // global-quick-tap-ms\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 // THUMB_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // THUMB_REPEAT_DECAY 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 THUMB_REPEAT_DECAY 200 // \"tap then hold\" for key auto-repeat\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 = ;\n global-quick-tap; // with 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 = ;\n global-quick-tap; // with 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 retro-tap; // allow slow (hold-like) taps\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 //\n // Approximation of Pascal Getreuer's Select Word macro from QMK\n // - https://getreuer.info/posts/keyboards/select-word/index.html\n //\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 1\n //\n // select a word (jumps to next word upon each successive invocation)\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 ZMK_MACRO(select_word_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(RIGHT) &kp LC(LEFT) &kp LC(LS(RIGHT))>;\n )\n ZMK_MACRO(select_word_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(LEFT) &kp LC(RIGHT) &kp LC(LS(LEFT))>;\n )\n //\n // extend current selection by one word\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 ZMK_MACRO(extend_word_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(LS(RIGHT))>;\n )\n ZMK_MACRO(extend_word_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(LS(LEFT))>;\n )\n //\n // select current line\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 ZMK_MACRO(select_line_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp HOME &kp LS(END)>;\n )\n ZMK_MACRO(select_line_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp END &kp LS(HOME)>;\n )\n //\n // extend current selection by one line\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 ZMK_MACRO(extend_line_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LS(DOWN) &kp LS(END)>;\n )\n ZMK_MACRO(extend_line_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LS(UP) &kp LS(HOME)>;\n )\n\n};\n", "config_parameters": [] } \ No newline at end of file diff --git a/engrammer.dtsi b/engrammer.dtsi index 2213ae3..6d0a175 100644 --- a/engrammer.dtsi +++ b/engrammer.dtsi @@ -9,11 +9,8 @@ // https://discord.com/channels/877392805654306816/1137025078979203142 ////////////////////////////////////////////////////////////////////// // -// Sunaku's Keymap v23 featuring Engrammer layout and legendary Miryoku +// Sunaku's Keymap v24 featuring the Engrammer layout with Miryoku // - https://github.com/sunaku/glove80-keymaps -// - https://sunaku.github.io/moergo-glove80-keyboard.html -// - https://sunaku.github.io/engrammer-keyboard-layout.html -// - https://discord.com/channels/877392805654306816/1111469812850380831 // behaviors { diff --git a/engrammer.json b/engrammer.json index 852a5c7..c248d50 100644 --- a/engrammer.json +++ b/engrammer.json @@ -1,13 +1,13 @@ { "keyboard": "glove80", "uuid": "", - "date": 1695752076, + "date": 1696232447, "creator": "", - "parent_uuid": "d2c58310-f226-4542-97d5-ebce0ffe61a7", + "parent_uuid": "2ca35aae-67bf-4d9a-a5ee-38a2dc6520c4", "firmware_api_version": "1", "locale": "en-US", - "title": "Sunaku's Layout v23 (Engrammer)", - "notes": "Sunaku's Keymap v23 featuring the Engrammer layout and legendary Miryoku\n- for setup instructions: https://github.com/sunaku/glove80-keymaps#readme\n- for release notes: https://github.com/sunaku/glove80-keymaps/releases/tag/v23\n- for upgrade diffs: https://github.com/sunaku/glove80-keymaps/compare/v22...v23\n\nSummary:\nHey everyone, I'm pleased to announce a new version 23 of my Glove80 keymaps featuring ultra responsive ⚑️ and satisfyingly *crisp* home row mods. πŸ‘Œ This is it! ❀️‍πŸ”₯\n\nChanges:\n- Split `TYPING_STREAK_TERM` into separate `HOMEY_STREAK_DECAY` and `INDEX_STREAK_DECAY` settings.\n- Renamed settings: `*_TAPPING_TERM` to `*_HOLDING_TIME`, and `KEY_REPEATING_TERM` to `THUMB_REPEAT_DECAY`.\n- Reduced `THUMB_REPEAT_DECAY` from 300ms to 200ms to allow faster access to characters in symbol layer separated by spaces, such as the equal sign in \"x = y\" assignments.\n- Reduced `THUMB_HOLDING_TIME` from 200ms to 170ms for faster layer activation and responsive typing (spaces after words).\n- Enabled retro-tap for thumb keys for lingering taps (e.g. when I type \"after \", the space after R wasn't being emitted).\n- Enabled typing streaks for index fingers and reduced `INDEX_STREAK_DECAY` from 160ms to 70ms for faster CamelCase typing.\n- Reduced `INDEX_HOLDING_TIME` from 180ms to 170ms for CamelCase: 160ms \"av\" -> \"v\", 170ms \"av\" -> \"V\", 180ms \"av\" -> \"av\".\n- Aligned all timing thresholds to 70ms which is the magic number for me. πŸͺ„ I determined this using my typing layer on the QMK Configurator's testing tool at https://config.qmk.fm/#/test whereby I would pretend to use home row mods and observe the timing & duration of keystrokes as reported by the testing tool. πŸ₯Ό", + "title": "Sunaku's Layout v24 (Engrammer)", + "notes": "Sunaku's Keymap v24 featuring the Engrammer layout and legendary Miryoku\n- for setup instructions: https://github.com/sunaku/glove80-keymaps#readme\n- for release notes: https://github.com/sunaku/glove80-keymaps/releases/tag/v24\n- for upgrade diffs: https://github.com/sunaku/glove80-keymaps/compare/v23...v24\n\nSummary:\nHey everyone, I'm pleased to announce a new version 24 of my Glove80 keymaps featuring a completed symbol layer. πŸ’―\n\nChanges:\n- Symbol layer: put apostrophe, comma, dot (like the Dvorak layout) on bottom row. The comma and dot align with the angle brackets above them. The apostrophe is just there for completeness; and `'<,'>` ranges in Vim.\n- Text selection macros: reduce delay from 30ms to 1ms because the latency is visibly noticeable with 30ms and thus it feels a lot slower... I'm having to wait for it to finish selecting. 😩 This ignores ZMK docs: \"a wait and tap time of at least 30ms is recommended to avoid having HID notifications grouped at the BLE protocol level and then processed out of order\", because 1ms worked fine for me all along.\n- Use `ZMK_MACRO()` convenience C macro to simplify implementation and also document & reorganize definitions for better readability.", "tags": [ "sunaku", "engrammer", @@ -4082,8 +4082,13 @@ "params": [] }, { - "value": "&none", - "params": [] + "value": "&kp", + "params": [ + { + "value": "SQT", + "params": [] + } + ] }, { "value": "&kp", @@ -4116,7 +4121,7 @@ "value": "&kp", "params": [ { - "value": "SEMI", + "value": "DOT", "params": [] } ] @@ -6005,6 +6010,6 @@ } ] ], - "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 Keymap v23 featuring Engrammer layout and legendary Miryoku\n// - https://github.com/sunaku/glove80-keymaps\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 and home row mods (ported from my QMK endgame)\n // - https://sunaku.github.io/home-row-mods.html#porting-to-zmk\n // - https://github.com/urob/zmk-config#timeless-homerow-mods\n //\n //----------------------------------------------------------------\n // homey fingers (pinky, ring, middle)\n //----------------------------------------------------------------\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 // HOMEY_HOLDING_TIME 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_HOLDING_TIME 270 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n //\n // HOMEY_STREAK_DECAY 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 HOMEY_STREAK_DECAY 170 // global-quick-tap-ms\n //\n //----------------------------------------------------------------\n // index fingers\n //----------------------------------------------------------------\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 // INDEX_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // INDEX_STREAK_DECAY 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 INDEX_STREAK_DECAY 70 // global-quick-tap-ms\n //\n //----------------------------------------------------------------\n // thumbs\n //----------------------------------------------------------------\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 // THUMB_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // THUMB_REPEAT_DECAY 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 THUMB_REPEAT_DECAY 200 // \"tap then hold\" for key auto-repeat\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 = ;\n global-quick-tap; // with 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 = ;\n global-quick-tap; // with 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 retro-tap; // allow slow (hold-like) taps\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};", + "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 Keymap v24 featuring the Engrammer layout with Miryoku\n// - https://github.com/sunaku/glove80-keymaps\n//\n\nbehaviors {\n\n //////////////////////////////////////////////////////////////////\n //\n // Miryoku layers and home row mods (ported from my QMK endgame)\n // - https://sunaku.github.io/home-row-mods.html#porting-to-zmk\n // - https://github.com/urob/zmk-config#timeless-homerow-mods\n //\n //////////////////////////////////////////////////////////////////\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 // HOMEY_HOLDING_TIME 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_HOLDING_TIME 270 // TAPPING_TERM + ALLOW_CROSSOVER_AFTER\n //\n // HOMEY_STREAK_DECAY 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 HOMEY_STREAK_DECAY 170 // global-quick-tap-ms\n //\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 // INDEX_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // INDEX_STREAK_DECAY 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 INDEX_STREAK_DECAY 70 // global-quick-tap-ms\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 // THUMB_HOLDING_TIME 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_HOLDING_TIME 170\n //\n // THUMB_REPEAT_DECAY 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 THUMB_REPEAT_DECAY 200 // \"tap then hold\" for key auto-repeat\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 = ;\n global-quick-tap; // with 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 = ;\n global-quick-tap; // with 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 retro-tap; // allow slow (hold-like) taps\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 //\n // Approximation of Pascal Getreuer's Select Word macro from QMK\n // - https://getreuer.info/posts/keyboards/select-word/index.html\n //\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 1\n //\n // select a word (jumps to next word upon each successive invocation)\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 ZMK_MACRO(select_word_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(RIGHT) &kp LC(LEFT) &kp LC(LS(RIGHT))>;\n )\n ZMK_MACRO(select_word_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(LEFT) &kp LC(RIGHT) &kp LC(LS(LEFT))>;\n )\n //\n // extend current selection by one word\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 ZMK_MACRO(extend_word_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(LS(RIGHT))>;\n )\n ZMK_MACRO(extend_word_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LC(LS(LEFT))>;\n )\n //\n // select current line\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 ZMK_MACRO(select_line_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp HOME &kp LS(END)>;\n )\n ZMK_MACRO(select_line_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp END &kp LS(HOME)>;\n )\n //\n // extend current selection by one line\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 ZMK_MACRO(extend_line_right,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LS(DOWN) &kp LS(END)>;\n )\n ZMK_MACRO(extend_line_left,\n wait-ms = ;\n tap-ms = ;\n bindings = <&kp LS(UP) &kp LS(HOME)>;\n )\n\n};\n", "config_parameters": [] } \ No newline at end of file