|
| 1 | +# Mod-Morph Guide |
| 2 | + |
| 3 | +## What is Mod-Morph? |
| 4 | + |
| 5 | +**Mod-Morph** is a ZMK feature that lets one key produce **two different symbols** depending on whether you're holding Shift when you press it. |
| 6 | + |
| 7 | +Think of it as: "Press this key normally → get first symbol. Hold Shift + press this key → get second symbol." |
| 8 | + |
| 9 | +## How It Works |
| 10 | + |
| 11 | +### Traditional Way (Without Mod-Morph) |
| 12 | + |
| 13 | +``` |
| 14 | +To type "?" you press: ? |
| 15 | +To type "!" you press: Shift + ! |
| 16 | +``` |
| 17 | + |
| 18 | +Two separate keys, two separate mental mappings. |
| 19 | + |
| 20 | +### With Mod-Morph |
| 21 | + |
| 22 | +``` |
| 23 | +To type "?" you press: [mod-morph key] |
| 24 | +To type "!" you press: Shift + [same mod-morph key] |
| 25 | +``` |
| 26 | + |
| 27 | +**One key, intuitive behavior.** |
| 28 | + |
| 29 | +## Your Mod-Morph Keys |
| 30 | + |
| 31 | +Your firmware now has **3 mod-morph keys** on the BASE layer: |
| 32 | + |
| 33 | +| Key Position | Name | Press Normally | Press with Shift | |
| 34 | +|--------------|------|----------------|------------------| |
| 35 | +| Right hand, bottom row (H key) | `mm_cm_sc` | `,` (comma) | `;` (semicolon) | |
| 36 | +| Right hand, bottom row (, key) | `mm_pr_col` | `.` (period) | `:` (colon) | |
| 37 | +| Add anywhere | `mm_qm_ex` | `?` (question) | `!` (exclamation) | |
| 38 | + |
| 39 | +## Real-World Examples |
| 40 | + |
| 41 | +### Example 1: Punctuation in Sentences |
| 42 | + |
| 43 | +**Typing:** "Hello, world!" |
| 44 | + |
| 45 | +``` |
| 46 | +H e l l o [comma+space] w o r l d [shift+period] |
| 47 | +``` |
| 48 | + |
| 49 | +**Without mod-morph:** You'd need to remember comma is on symbol layer or use pinky stretch |
| 50 | +**With mod-morph:** Just press the key, it's comma! |
| 51 | + |
| 52 | +**Typing:** "What? Really!" |
| 53 | + |
| 54 | +``` |
| 55 | +W h a t [?] [space] R e a l l y [shift+?] |
| 56 | +``` |
| 57 | + |
| 58 | +**With mod-morph:** Press `?` key normally for `?`, hold Shift for `!` |
| 59 | + |
| 60 | +### Example 2: Coding |
| 61 | + |
| 62 | +**Typing:** `array.length;` |
| 63 | + |
| 64 | +``` |
| 65 | +a r r a y [period] l e n g t h [shift+comma] |
| 66 | +``` |
| 67 | + |
| 68 | +**With mod-morph:** Same key does `.` and `;` automatically! |
| 69 | + |
| 70 | +## Why Use Mod-Morph? |
| 71 | + |
| 72 | +| Benefit | Explanation | |
| 73 | +|---------|-------------| |
| 74 | +| **No waiting** | Instant output, no 200ms delay like tap-dance | |
| 75 | +| **Intuitive** | You already know Shift = alternate symbol | |
| 76 | +| **Saves keys** | One key instead of two | |
| 77 | +| **No layers** | Don't need symbol layer for common punctuation | |
| 78 | +| **Fast typing** | Works at full typing speed | |
| 79 | + |
| 80 | +## Comparison to Other Methods |
| 81 | + |
| 82 | +### vs Tap-Dance |
| 83 | + |
| 84 | +| Method | Speed | Mental Model | |
| 85 | +|--------|-------|--------------| |
| 86 | +| Tap-dance `?` / `!` | Must wait 200ms | "Tap once or twice?" | |
| 87 | +| Mod-morph `?` / `!` | Instant (0ms) | "Press or Shift+press" | |
| 88 | + |
| 89 | +**Winner:** Mod-morph for shift-paired symbols |
| 90 | + |
| 91 | +### vs Hold-Tap Layers |
| 92 | + |
| 93 | +| Method | Steps for `!` | |
| 94 | +|--------|---------------| |
| 95 | +| Layer hold + key press | Hold layer, press key, release (3 actions) | |
| 96 | +| Mod-morph | Hold Shift, press key (2 actions) | |
| 97 | + |
| 98 | +**Winner:** Mod-morph for common symbols |
| 99 | + |
| 100 | +### vs Standard Keyboard |
| 101 | + |
| 102 | +| Method | `?` location | `!` location | |
| 103 | +|--------|--------------|--------------| |
| 104 | +| Standard QWERTY | Shift + `/` | Shift + `1` | |
| 105 | +| Your mod-morph | One key | Shift + same key | |
| 106 | + |
| 107 | +**Winner:** Your muscle memory already knows Shift! |
| 108 | + |
| 109 | +## Troubleshooting |
| 110 | + |
| 111 | +### Q: I press the key but don't get the symbol I expect! |
| 112 | +**A:** Make sure you're not accidentally holding Shift. Mod-morph checks if **either** left or right Shift is held. |
| 113 | + |
| 114 | +### Q: Can I use this with other modifiers? |
| 115 | +**A:** The current config only works with Shift. You can add `MOD_LCTRL`, `MOD_LALT`, etc. if needed. |
| 116 | + |
| 117 | +### Q: What if I want to add more mod-morph keys? |
| 118 | +**A:** Edit `config/charybdis.keymap` and add: |
| 119 | +```dev |
| 120 | +mm_your_name: your_name { |
| 121 | + compatible = "zmk,behavior-mod-morph"; |
| 122 | + #binding-cells = <0>; |
| 123 | + bindings = <&kp FIRST_SYMBOL>, <&kp SECOND_SYMBOL>; |
| 124 | + mods = <(MOD_LSFT | MOD_RSFT)>; |
| 125 | +}; |
| 126 | +``` |
| 127 | + |
| 128 | +## Common Mod-Morph Pairs |
| 129 | + |
| 130 | +These work great because they're conceptually related: |
| 131 | + |
| 132 | +| Pair | Why | |
| 133 | +|------|-----| |
| 134 | +| `?` / `!` | Both are sentence endings | |
| 135 | +| `.` / `:` | Both are punctuation stops | |
| 136 | +| `,` / `;` | Both are separators | |
| 137 | +| `<` / `>` | Comparison operators | |
| 138 | +| `(` / `)` | Parens (same key on std keyboard) | |
| 139 | +| `[` / `]` | Brackets (same key on std keyboard) | |
| 140 | +| `{` / `}` | Braces (same key on std keyboard) | |
| 141 | + |
| 142 | +## Summary |
| 143 | + |
| 144 | +- **Mod-morph** = one key, two outputs based on Shift |
| 145 | +- **Instant** = no waiting, no delays |
| 146 | +- **Intuitive** = works the way you already think |
| 147 | +- **Your keys** = `,`/`;` and `.`/`:` are already set up |
| 148 | + |
| 149 | +**Just type naturally and let mod-morph handle the symbols!** |
| 150 | + |
| 151 | +--- |
| 152 | + |
| 153 | +**Want to learn more?** Check out: |
| 154 | +- [ZMK Mod-Morph Documentation](https://zmk.dev/docs/behaviors/mod-morph) |
| 155 | +- Your keymap: `config/charybdis.keymap` (search for `mm_`) |
0 commit comments