From cb42e24e7c5692a14887061808c0bd78d68e28f2 Mon Sep 17 00:00:00 2001 From: "Suraj N. Kurapati" Date: Tue, 30 May 2023 09:09:00 -0700 Subject: [PATCH] Version 5 (2023-05-30) https://discord.com/channels/877392805654306816/1111469812850380831/1113243157069582336 --- README.md | 4 ++-- engram.dtsi | 14 ++++++++++++ engram.json | 58 +++++++++++++++----------------------------------- engrammer.dtsi | 14 ++++++++++++ engrammer.json | 58 +++++++++++++++----------------------------------- 5 files changed, 64 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index 37b5ff7..2e0cc33 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/e453017b-2315-4d2b-89c4-4c4921a59005 -- for Arno's Engram 2.0: https://my.glove80.com/#/layout/user/fc3636d0-efc8-40d9-9b91-b66386ba2b01 +- for Engrammer layout: https://my.glove80.com/#/layout/user/3981b394-786e-467b-9aa2-07c6c5fbb731 +- for Arno's Engram 2.0: https://my.glove80.com/#/layout/user/bada94d0-701c-43d5-818e-c1c532abeb98 ## Installing 🪄 diff --git a/engram.dtsi b/engram.dtsi index 5b46297..c9423e0 100644 --- a/engram.dtsi +++ b/engram.dtsi @@ -15,6 +15,20 @@ behaviors { bindings = <&kp>, <&kp>; }; + // enable key-repeat for layer-tap keys (Miryoku's thumb cluster keys) + // https://github.com/zmkfirmware/zmk/issues/288#issuecomment-770871538 + // https://github.com/zmkfirmware/zmk/blob/main/app/dts/behaviors/layer_tap.dtsi + // https://discord.com/channels/877392805654306816/937645688244826154/1113213032957489154 + qlt: behavior_layer_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LAYER_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <200>; // this is what's added! + bindings = <&mo>, <&kp>; + }; + // // Custom shifted pairs for the Engram layout // https://engram.dev/ diff --git a/engram.json b/engram.json index 2433ec8..48796c7 100644 --- a/engram.json +++ b/engram.json @@ -1,12 +1,12 @@ { "keyboard": "glove80", "uuid": "", - "date": 1685434078, + "date": 1685487957, "creator": "", - "parent_uuid": "fc3636d0-efc8-40d9-9b91-b66386ba2b01", + "parent_uuid": "bada94d0-701c-43d5-818e-c1c532abeb98", "firmware_api_version": "1", - "title": "Sunaku's Layout v4 (Engram)", - "notes": "ZMK port of https://sunaku.github.io/ergohaven-remnant-keyboard.html but featuring the official Engram layout https://engram.dev/\n\nNotes:\n- Mouse layer is empty since ZMK doesn't yet support mouse keys.\n- Sticky toggle for Miryoku layers isn't yet available due to ZMK limitation: https://github.com/zmkfirmware/zmk/issues/1299\n- Pascal Getreuer's famous \"Select Word\" macro for QMK isn't yet available for ZMK, so I've approximated it with separate select/extend word/line actions using ZMK macros. See also https://getreuer.info/posts/keyboards/select-word/index.html\n\nChanges (since v3):\n- Don't mirror lower thumb key on nearest upper one anymore.\n- Put arrow keys on nearest upper thumb keys for convenience.\n- Increase quick-tap-ms to 175ms to avoid same-hand misfires.\n- Symbol layer: prevent &trans for unused keys on left hand.\n- Symbol layer: put *.* on upper thumb keys for piano swipe.\n- Symbol layer: add easier ~/ on Glove80 (corners too hard).", + "title": "Sunaku's Layout v5 (Engram)", + "notes": "ZMK port of https://sunaku.github.io/ergohaven-remnant-keyboard.html but featuring the official Engram layout https://engram.dev/\n\nNotes:\n- Mouse layer is empty since ZMK doesn't yet support mouse keys.\n- Sticky toggle for Miryoku layers isn't yet available due to ZMK limitation: https://github.com/zmkfirmware/zmk/issues/1299\n- Pascal Getreuer's famous \"Select Word\" macro for QMK isn't yet available for ZMK, so I've approximated it with separate select/extend word/line actions using ZMK macros. See also https://getreuer.info/posts/keyboards/select-word/index.html\n\nChanges (since v4):\n- Enable key-repeat (via tap+hold) for < thumb keys that activate Miryoku layers. Thanks to @bravekarma for guidance on this solution https://discord.com/channels/877392805654306816/937645688244826154/1113213032957489154", "tags": [ "sunaku", "engram", @@ -626,79 +626,55 @@ ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 3, - "params": [] - }, - { - "value": "BSPC", + "value": "&qlt 3 BACKSPACE", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 4, - "params": [] - }, - { - "value": "DEL", + "value": "&qlt 4 DELETE", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 5, - "params": [] - }, - { - "value": "ESC", + "value": "&qlt 5 ESC", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 8, - "params": [] - }, - { - "value": "RET", + "value": "&qlt 8 ENTER", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 7, - "params": [] - }, - { - "value": "TAB", + "value": "&qlt 7 TAB", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 6, - "params": [] - }, - { - "value": "SPACE", + "value": "&qlt 6 SPACE", "params": [] } ] @@ -5118,6 +5094,6 @@ } ] ], - "custom_defined_behaviors": "behaviors {\n\n //\n // Home row mods support for natural typing\n // https://sunaku.github.io/home-row-mods.html\n //\n gqt: global-quick-tap {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"GLOBAL_QUICK_TAP\";\n #binding-cells = <2>;\n flavor = \"tap-preferred\";\n tapping-term-ms = <200>;\n quick-tap-ms = <175>;\n global-quick-tap;\n bindings = <&kp>, <&kp>;\n };\n\n //\n // Custom shifted pairs for the Engram layout\n // https://engram.dev/\n //\n one: one_and_pipe {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ONE_AND_PIPE\";\n #binding-cells = <0>;\n bindings = <&kp N1>, <&kp PIPE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n two: two_and_equal {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"TWO_AND_EQUAL\";\n #binding-cells = <0>;\n bindings = <&kp N2>, <&kp EQUAL>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n three: three_and_tilde {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"THREE_AND_TILDE\";\n #binding-cells = <0>;\n bindings = <&kp N3>, <&kp TILDE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n four: four_and_plus {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"FOUR_AND_PLUS\";\n #binding-cells = <0>;\n bindings = <&kp N4>, <&kp PLUS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n five: five_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"FIVE_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N5>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n six: six_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SIX_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N6>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n seven: seven_and_caret {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SEVEN_AND_CARET\";\n #binding-cells = <0>;\n bindings = <&kp N7>, <&kp CARET>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n eight: eight_and_ampersand {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EIGHT_AND_AMPERSAND\";\n #binding-cells = <0>;\n bindings = <&kp N8>, <&kp AMPERSAND>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n nine: nine_and_percent {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"NINE_AND_PERCENT\";\n #binding-cells = <0>;\n bindings = <&kp N9>, <&kp PERCENT>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n zero: zero_and_asterisk {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ZERO_AND_ASTERISK\";\n #binding-cells = <0>;\n bindings = <&kp N0>, <&kp ASTERISK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n apos: apostrophe_and_left_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"APOSTROPHE_AND_LEFT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp APOSTROPHE>, <&kp LEFT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n dquote: double_quotes_and_right_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"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: comma_and_semicolon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"COMMA_AND_SEMICOLON\";\n #binding-cells = <0>;\n bindings = <&kp COMMA>, <&kp SEMICOLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n period: period_and_colon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"PERIOD_AND_COLON\";\n #binding-cells = <0>;\n bindings = <&kp PERIOD>, <&kp COLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n question: question_and_exclamation {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"QUESTION_AND_EXCLAMATION\";\n #binding-cells = <0>;\n bindings = <&kp QUESTION>, <&kp EXCLAMATION>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n hash: hash_and_dollar {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"HASH_AND_DOLLAR\";\n #binding-cells = <0>;\n bindings = <&kp HASH>, <&kp DOLLAR>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n at: at_and_grave {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"AT_AND_GRAVE\";\n #binding-cells = <0>;\n bindings = <&kp AT>, <&kp GRAVE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n slash: slash_and_backslash {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"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 feature in QMK\n // https://getreuer.info/posts/keyboards/select-word/index.html\n //\n select_word: select_word {\n compatible = \"zmk,behavior-macro\";\n label = \"select_word\";\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: extend_word {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_word\";\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: select_line {\n compatible = \"zmk,behavior-macro\";\n label = \"select_line\";\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: extend_line {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_line\";\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\n};", + "custom_defined_behaviors": "behaviors {\n\n //\n // Home row mods support for natural typing\n // https://sunaku.github.io/home-row-mods.html\n //\n gqt: global-quick-tap {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"GLOBAL_QUICK_TAP\";\n #binding-cells = <2>;\n flavor = \"tap-preferred\";\n tapping-term-ms = <200>;\n quick-tap-ms = <175>;\n global-quick-tap;\n bindings = <&kp>, <&kp>;\n };\n\n // enable key-repeat for layer-tap keys (Miryoku's thumb cluster keys)\n // https://github.com/zmkfirmware/zmk/issues/288#issuecomment-770871538\n // https://github.com/zmkfirmware/zmk/blob/main/app/dts/behaviors/layer_tap.dtsi\n // https://discord.com/channels/877392805654306816/937645688244826154/1113213032957489154\n qlt: behavior_layer_tap {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"LAYER_TAP\";\n #binding-cells = <2>;\n flavor = \"tap-preferred\";\n tapping-term-ms = <200>;\n quick-tap-ms = <200>; // this is what's added!\n bindings = <&mo>, <&kp>;\n };\n\n //\n // Custom shifted pairs for the Engram layout\n // https://engram.dev/\n //\n one: one_and_pipe {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ONE_AND_PIPE\";\n #binding-cells = <0>;\n bindings = <&kp N1>, <&kp PIPE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n two: two_and_equal {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"TWO_AND_EQUAL\";\n #binding-cells = <0>;\n bindings = <&kp N2>, <&kp EQUAL>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n three: three_and_tilde {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"THREE_AND_TILDE\";\n #binding-cells = <0>;\n bindings = <&kp N3>, <&kp TILDE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n four: four_and_plus {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"FOUR_AND_PLUS\";\n #binding-cells = <0>;\n bindings = <&kp N4>, <&kp PLUS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n five: five_and_less_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"FIVE_AND_LESS_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N5>, <&kp LESS_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n six: six_and_greater_than {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SIX_AND_GREATER_THAN\";\n #binding-cells = <0>;\n bindings = <&kp N6>, <&kp GREATER_THAN>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n seven: seven_and_caret {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"SEVEN_AND_CARET\";\n #binding-cells = <0>;\n bindings = <&kp N7>, <&kp CARET>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n eight: eight_and_ampersand {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"EIGHT_AND_AMPERSAND\";\n #binding-cells = <0>;\n bindings = <&kp N8>, <&kp AMPERSAND>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n nine: nine_and_percent {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"NINE_AND_PERCENT\";\n #binding-cells = <0>;\n bindings = <&kp N9>, <&kp PERCENT>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n zero: zero_and_asterisk {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"ZERO_AND_ASTERISK\";\n #binding-cells = <0>;\n bindings = <&kp N0>, <&kp ASTERISK>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n apos: apostrophe_and_left_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"APOSTROPHE_AND_LEFT_PARENTHESIS\";\n #binding-cells = <0>;\n bindings = <&kp APOSTROPHE>, <&kp LEFT_PARENTHESIS>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n dquote: double_quotes_and_right_parenthesis {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"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: comma_and_semicolon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"COMMA_AND_SEMICOLON\";\n #binding-cells = <0>;\n bindings = <&kp COMMA>, <&kp SEMICOLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n period: period_and_colon {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"PERIOD_AND_COLON\";\n #binding-cells = <0>;\n bindings = <&kp PERIOD>, <&kp COLON>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n question: question_and_exclamation {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"QUESTION_AND_EXCLAMATION\";\n #binding-cells = <0>;\n bindings = <&kp QUESTION>, <&kp EXCLAMATION>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n hash: hash_and_dollar {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"HASH_AND_DOLLAR\";\n #binding-cells = <0>;\n bindings = <&kp HASH>, <&kp DOLLAR>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n at: at_and_grave {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"AT_AND_GRAVE\";\n #binding-cells = <0>;\n bindings = <&kp AT>, <&kp GRAVE>;\n mods = <(MOD_LSFT|MOD_RSFT)>;\n };\n slash: slash_and_backslash {\n compatible = \"zmk,behavior-mod-morph\";\n label = \"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 feature in QMK\n // https://getreuer.info/posts/keyboards/select-word/index.html\n //\n select_word: select_word {\n compatible = \"zmk,behavior-macro\";\n label = \"select_word\";\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: extend_word {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_word\";\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: select_line {\n compatible = \"zmk,behavior-macro\";\n label = \"select_line\";\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: extend_line {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_line\";\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\n};", "config_parameters": [] } \ No newline at end of file diff --git a/engrammer.dtsi b/engrammer.dtsi index 352fdc3..b6ba885 100644 --- a/engrammer.dtsi +++ b/engrammer.dtsi @@ -15,6 +15,20 @@ behaviors { bindings = <&kp>, <&kp>; }; + // enable key-repeat for layer-tap keys (Miryoku's thumb cluster keys) + // https://github.com/zmkfirmware/zmk/issues/288#issuecomment-770871538 + // https://github.com/zmkfirmware/zmk/blob/main/app/dts/behaviors/layer_tap.dtsi + // https://discord.com/channels/877392805654306816/937645688244826154/1113213032957489154 + qlt: behavior_layer_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LAYER_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <200>; // this is what's added! + bindings = <&mo>, <&kp>; + }; + }; macros { diff --git a/engrammer.json b/engrammer.json index 98749f5..39f7a45 100644 --- a/engrammer.json +++ b/engrammer.json @@ -1,12 +1,12 @@ { "keyboard": "glove80", "uuid": "", - "date": 1685434120, + "date": 1685487971, "creator": "", - "parent_uuid": "e453017b-2315-4d2b-89c4-4c4921a59005", + "parent_uuid": "3981b394-786e-467b-9aa2-07c6c5fbb731", "firmware_api_version": "1", - "title": "Sunaku's Layout v4 (Engrammer)", - "notes": "ZMK port of https://sunaku.github.io/ergohaven-remnant-keyboard.html featuring the Engrammer keyboard layout https://sunaku.github.io/engrammer-keyboard-layout.html\n\nNotes:\n- Mouse layer is empty since ZMK doesn't yet support mouse keys.\n- Sticky toggle for Miryoku layers isn't yet available due to ZMK limitation: https://github.com/zmkfirmware/zmk/issues/1299\n- Pascal Getreuer's famous \"Select Word\" macro for QMK isn't yet available for ZMK, so I've approximated it with separate select/extend word/line actions using ZMK macros. See also https://getreuer.info/posts/keyboards/select-word/index.html\n\nChanges (since v3):\n- Don't mirror lower thumb key on nearest upper one anymore.\n- Put arrow keys on nearest upper thumb keys for convenience.\n- Increase quick-tap-ms to 175ms to avoid same-hand misfires.\n- Symbol layer: prevent &trans for unused keys on left hand.\n- Symbol layer: put *.* on upper thumb keys for piano swipe.\n- Symbol layer: add easier ~/ on Glove80 (corners too hard).", + "title": "Sunaku's Layout v5 (Engrammer)", + "notes": "ZMK port of https://sunaku.github.io/ergohaven-remnant-keyboard.html featuring the Engrammer keyboard layout https://sunaku.github.io/engrammer-keyboard-layout.html\n\nNotes:\n- Mouse layer is empty since ZMK doesn't yet support mouse keys.\n- Sticky toggle for Miryoku layers isn't yet available due to ZMK limitation: https://github.com/zmkfirmware/zmk/issues/1299\n- Pascal Getreuer's famous \"Select Word\" macro for QMK isn't yet available for ZMK, so I've approximated it with separate select/extend word/line actions using ZMK macros. See also https://getreuer.info/posts/keyboards/select-word/index.html\n\nChanges (since v4):\n- Enable key-repeat (via tap+hold) for < thumb keys that activate Miryoku layers. Thanks to @bravekarma for guidance on this solution https://discord.com/channels/877392805654306816/937645688244826154/1113213032957489154", "tags": [ "sunaku", "engrammer", @@ -632,79 +632,55 @@ ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 3, - "params": [] - }, - { - "value": "BSPC", + "value": "&qlt 3 BACKSPACE", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 4, - "params": [] - }, - { - "value": "DEL", + "value": "&qlt 4 DELETE", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 5, - "params": [] - }, - { - "value": "ESC", + "value": "&qlt 5 ESC", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 8, - "params": [] - }, - { - "value": "RET", + "value": "&qlt 8 ENTER", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 7, - "params": [] - }, - { - "value": "TAB", + "value": "&qlt 7 TAB", "params": [] } ] }, { - "value": "<", + "value": "Custom", "params": [ { - "value": 6, - "params": [] - }, - { - "value": "SPACE", + "value": "&qlt 6 SPACE", "params": [] } ] @@ -5129,6 +5105,6 @@ } ] ], - "custom_defined_behaviors": "behaviors {\n\n //\n // Home row mods support for natural typing\n // https://sunaku.github.io/home-row-mods.html\n //\n gqt: global-quick-tap {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"GLOBAL_QUICK_TAP\";\n #binding-cells = <2>;\n flavor = \"tap-preferred\";\n tapping-term-ms = <200>;\n quick-tap-ms = <175>;\n global-quick-tap;\n bindings = <&kp>, <&kp>;\n };\n\n};\n\nmacros {\n\n //\n // Approximation of Pascal Getreuer's SelectWord feature in QMK\n // https://getreuer.info/posts/keyboards/select-word/index.html\n //\n select_word: select_word {\n compatible = \"zmk,behavior-macro\";\n label = \"select_word\";\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: extend_word {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_word\";\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: select_line {\n compatible = \"zmk,behavior-macro\";\n label = \"select_line\";\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: extend_line {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_line\";\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\n};", + "custom_defined_behaviors": "behaviors {\n\n //\n // Home row mods support for natural typing\n // https://sunaku.github.io/home-row-mods.html\n //\n gqt: global-quick-tap {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"GLOBAL_QUICK_TAP\";\n #binding-cells = <2>;\n flavor = \"tap-preferred\";\n tapping-term-ms = <200>;\n quick-tap-ms = <175>;\n global-quick-tap;\n bindings = <&kp>, <&kp>;\n };\n\n // enable key-repeat for layer-tap keys (Miryoku's thumb cluster keys)\n // https://github.com/zmkfirmware/zmk/issues/288#issuecomment-770871538\n // https://github.com/zmkfirmware/zmk/blob/main/app/dts/behaviors/layer_tap.dtsi\n // https://discord.com/channels/877392805654306816/937645688244826154/1113213032957489154\n qlt: behavior_layer_tap {\n compatible = \"zmk,behavior-hold-tap\";\n label = \"LAYER_TAP\";\n #binding-cells = <2>;\n flavor = \"tap-preferred\";\n tapping-term-ms = <200>;\n quick-tap-ms = <200>; // this is what's added!\n bindings = <&mo>, <&kp>;\n };\n\n};\n\nmacros {\n\n //\n // Approximation of Pascal Getreuer's SelectWord feature in QMK\n // https://getreuer.info/posts/keyboards/select-word/index.html\n //\n select_word: select_word {\n compatible = \"zmk,behavior-macro\";\n label = \"select_word\";\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: extend_word {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_word\";\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: select_line {\n compatible = \"zmk,behavior-macro\";\n label = \"select_line\";\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: extend_line {\n compatible = \"zmk,behavior-macro\";\n label = \"extend_line\";\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\n};", "config_parameters": [] } \ No newline at end of file