{"id":24162686,"url":"https://github.com/alex-tdrn/zmk-config","last_synced_at":"2025-09-20T07:31:42.410Z","repository":{"id":177864943,"uuid":"656879936","full_name":"alex-tdrn/zmk-config","owner":"alex-tdrn","description":"A 36 key layout with few layers and many combos","archived":false,"fork":false,"pushed_at":"2024-10-05T10:55:53.000Z","size":1173,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-11T20:42:16.558Z","etag":null,"topics":["chocofi","keyboard-layout","keymap-drawer","zmk"],"latest_commit_sha":null,"homepage":"","language":"Nushell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alex-tdrn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-21T20:50:33.000Z","updated_at":"2025-03-19T17:26:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"d07a67d6-476a-4505-a1bf-a2391375f328","html_url":"https://github.com/alex-tdrn/zmk-config","commit_stats":null,"previous_names":["alex-tdrn/zmk-config"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/alex-tdrn/zmk-config","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-tdrn%2Fzmk-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-tdrn%2Fzmk-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-tdrn%2Fzmk-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-tdrn%2Fzmk-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alex-tdrn","download_url":"https://codeload.github.com/alex-tdrn/zmk-config/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alex-tdrn%2Fzmk-config/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276064222,"owners_count":25578997,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chocofi","keyboard-layout","keymap-drawer","zmk"],"created_at":"2025-01-12T18:01:26.570Z","updated_at":"2025-09-20T07:31:41.920Z","avatar_url":"https://github.com/alex-tdrn.png","language":"Nushell","funding_links":[],"categories":["Nushell"],"sub_categories":[],"readme":"My personal ZMK config for the [chocofi](https://github.com/pashutk/chocofi)\n\n# Base Layer\n![Base layer](./diagrams/BASE.svg)\n\n## Alphas\nAlpha layout is [hands-down gold](https://sites.google.com/alanreiser.com/handsdown/home/hands-down-neu#h.8i2msuo3butx), with slight tweaks\nto the locations of the letter and bigram combos:\n - All bigrams are on the left side of the keyboard since they are all either surrounded by, or preceded by vowels, and typing a combo in\n   rapid succession with a vowel is hard for me.\n   This also makes room for all symbol combos on the right side\n - The `Qu` combo was initially a hold-tap with `Qu` on tap and `Q` on hold.\n   This is perfect when typing prose, I found that I only needed `Q` for initialisms, and the hold-delay was not a problem for me.\n   However, `Q` is a common key in vim/nvim and it quickly became annoying having to hold the combo every time I needed to exit a dialog or\n   close a window.\n   `Qt` codebases are also painful to work in when having `Q` on hold.\n   So `Q` and `Qu` have been split into adjacent combos, maintaining the best of both worlds.\n\nTapping bigrams uses different casing depending on the modifier held:\n - no modifier -\u003e lowercase (e.g. `th`)\n - `shift` -\u003e uppercase (`Th`)\n - `control` -\u003e all caps (`TH`)\n\n## Symbols\nSymbols are changed form the original `hands-down gold`, mostly to group and arrange them by easy to memorize rules, while still thinking\nabout ergonomics:\n - most math symbols are on the inner index column of keys, with the equal sign being on the home row middle + ring finger combo.\n   this makes common `*=`, `-=`, `/=` etc bigrams more comfortable to type when programming, by avoiding using the same finger for both\n   symbols.\n   the only symbols from this category that are not on the inner column are the logical operators `~`, and `^`\n - sentence/statement ending punctuation symbols are all on the top row\n - quotation symbols that normally appear in pairs are all (except for `'` in prose) on the ring + pinky column of combos\n - the 4 bracket types are arranged in a rectangle, typed with the 3 strongest fingers:\n   index, middle, and ring.\n   The angle brackets and the square brackets are placed on the two stronger combos of the four (index + middle finger), since the square\n   brackets are regularly used in vim for 'prev/next' jumps, and the angle brackets double as mathematical operators as well.\n   Also, the `-\u003e` bigram is extremely common in C++ .\n - `_` and `\\` receive the most comfortable combo position, since they are among the most common symbols across all the programming\n   languages I use.\n   The need to manually type `_` may be reduced in the future by implementing something like [x-case with `_` replacing\n   `space`](https://github.com/andrewjrae/kyria-keymap/tree/e3ad77dc4d48b8e6a842c9136c76c1021ab5976b#x-case).\n   If that proves viable I'll reconsider this symbol arrangement\n\n### Auto Pair\nBracket and quotation symbols have `autopair` functionality on hold with the following behaviors:\n - hold without any modifier -\u003e `opening symbol`, `closing symbol`\n - hold + `shift` -\u003e `opening symbol`, `closing symbol`, `left arrow`\n - hold + `control` -\u003e `opening symbol`, `return`, `closing symbol`, `up arrow`, `end`, `return`\n\nThis kind of functionality is normally available through text editor plugins but I never used it personally because I find that I often run\ninto cases where I **don't** want this functionality to kick in.\nSo having it optional, and activated manually is more convenient to me.\nAlso, this makes this feature available anywhere arrow key navigation works.\n\n### Sentence Case\nThe sentence ending symbols (`.`, `!`, and `?`) can be held to trigger sentence case:\nthe symbol itself will be emitted, then a space, and finally sticky shift will be activated, automatically turning the next letter\nuppercase.\nThe sticky shift is set to only deactivate after 10s if no input is received, to allow for a slight pause before the next sentence, if\nneeded.\n\n## Numbers \u0026 Navigation\nI hate switching layers, so I am currently experimenting with numbers and navigation keys on vertical (same finger) base layer combos.\nThe stronger fingers get smaller digits, since, according to [Benford's Law](https://en.m.wikipedia.org/wiki/Benford%27s_law) they tend to\nappear more often in real-life numerical data (also in vim relative line jumps).\nIdea taken from the [T34 layout](https://www.jonashietala.se/blog/2021/06/03/the-t-34-keyboard-layout/#where-are-the-digits).\nThe navigation keys are arranged on the lower combo rows, in the same order as vim navigation, but offset to include the pinky.\nThis loses the vim muscle memory and makes more use of the pinky, but might be worth it to be able to press all arrow combinations\nsimultaneously, which can be useful when scrolling in certain programs.\n\n## Newline\nInspired by vim's `o`/`O`, hitting `enter` and `space` at the same time inserts a new line below the current one.\nHolding down `shift` additionally, inserts the new line above the current one instead.\n\n## Join Line\nTapping `space` and `tab` at the same time joins the current line with the one below.\nHolding down `shift` while tapping, joins it up with the line above, instead.\n\n## Delete Word/Line\nTapping `t` and `backspace` together deletes the entire line by executing `home, shift+end, backspace`.\nHolding `shift` while tapping deletes the word under the cursor by executing `ctrl+left, ctrl+shift+right, backspace`.\nLine deletion works pretty consistently across editors.\nWord deletion varies, however, since some editors interpret `ctrl+left/right` to mean \"jump to the beginning/end of the current word\", while\nothers interpret it as \"jump to the beginning/end of the next word\".\nThe difference is that the former will only delete the word under the cursor, while the latter will also delete whitespace/symbol until the\nnext word.\nAdditionally, because of the keys executed, the macro does not work if the cursor lies on the first letter of a word (it will jump back and\ndelete the previous word instead).\n\n# Function Layer (WIP)\n![Function Layer](./diagrams/FN.svg)\n\n# Lock Layer\nThe `LOCK` layer is used when travelling to prevent accidental key taps, since ZMK does not have a power on/off behavior.\nSince it's (de)activated using 8 fingers, it should be very unlikely to go back to the base layer and send random key taps, while in a bag.\n\n# ZMK tricks\nIf you have a custom hold-tap behavior that does not need any arguments and you don't want to have to pass `0 0` in your keymap to bind it,\nyou can wrap it in a macro that uses [`macro_pause_for_release`](https://zmk.dev/docs/behaviors/macros#processing-continuation-on-release):\n\n```c\n#define BIND_HOLD_TAP_ARGUMENTS(NAME, HOLD_TAP_BEHAVIOR, ARGUMENT_1, ARGUMENT_2) \\\n/ { \\\n    macros { \\\n        NAME##: NAME { \\\n            label = #NAME; \\\n            compatible = \"zmk,behavior-macro\"; \\\n            #binding-cells = \u003c0\u003e; \\\n            wait-ms = \u003c0\u003e; \\\n            tap-ms = \u003c0\u003e; \\\n            bindings = \u003c\u0026macro_press \u0026 ## HOLD_TAP_BEHAVIOR ARGUMENT_1 ARGUMENT_2\u003e, \u003c\u0026macro_pause_for_release\u003e, \u003c\u0026macro_release \u0026 ## HOLD_TAP_BEHAVIOR ARGUMENT_1 ARGUMENT_2\u003e; \\\n        }; \\\n    }; \\\n}\n```\n\n# Acknowledgements\n\nSVG keymaps are auto-generated using [keymap-drawer](https://github.com/caksoylar/keymap-drawer)\n\n`chocofi` board definition taken from [`infused-kim`](https://github.com/infused-kim/zmk-config)\n\nUses `urob`'s parameters for [timer-less home row mods](https://github.com/urob/zmk-config#timeless-homerow-mods)\n\nThe keymap diagrams contain SVGs using `nerdfont` icons.\nThey embed the nerd font symbols and the `JetBrainsMono` font.\nSee `config/diagrams/update.nu` and `config/diagrams/font_embed.css` for more details.\n\nColor palette used in the keymap SVGs is [Kanagawa](https://github.com/rebelot/kanagawa.nvim/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falex-tdrn%2Fzmk-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falex-tdrn%2Fzmk-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falex-tdrn%2Fzmk-config/lists"}