keymap: Colemak UML layer with arrows, BT combos, fix BLE/settings config
/ build (push) Has been cancelled

- UML layer: arrows on T(↑) C(←) D(↓) V(→), ALT on Enter
- BT profile switching via combos: CTRL+Q/W/F/P → profiles 1-4
- Explicit CONFIG_ZMK_BLE, CONFIG_FLASH, CONFIG_NVS, CONFIG_SETTINGS_NVS
- Board name: seeeduino_xiao_ble → xiao_ble
- Add .gitignore, AGENTS.md (build docs), BINDINGS.md (keymap ref)
This commit is contained in:
2026-08-03 00:54:44 +02:00
parent 6cfc5b0f75
commit 16c1dfe4a9
6 changed files with 170 additions and 29 deletions
+18
View File
@@ -0,0 +1,18 @@
# Build artifacts
build/
*.uf2
# West-managed submodules
modules/
optional/
zephyr/
zmk/
# West state
.west/
# macOS
.DS_Store
# Reasonix
.reasonix/
+37
View File
@@ -0,0 +1,37 @@
# AGENTS.md — TOTEM ZMK Config
## Build
Local Docker build (no GitHub Actions needed):
```bash
docker run --rm \
-v $(pwd):/workspace/zmk-config \
-w /workspace/zmk-config \
zmkfirmware/zmk-build-arm:stable \
bash -c "
git config --global --add safe.directory '*'
west zephyr-export
west build -s zmk/app -d build/left -b xiao_ble -- -DSHIELD=totem_left -DZMK_CONFIG=/workspace/zmk-config/config
west build -s zmk/app -d build/right -b xiao_ble -- -DSHIELD=totem_right -DZMK_CONFIG=/workspace/zmk-config/config
"
cp build/left/zephyr/zmk.uf2 totem_left.uf2
cp build/right/zephyr/zmk.uf2 totem_right.uf2
```
- Clean build dirs between config changes: `rm -rf build/left build/right`
- The Docker image `zmkfirmware/zmk-build-arm:stable` must be pulled first (~3 GB)
- Board name is `xiao_ble` (not `seeeduino_xiao_ble` — that was the old name)
- `west update` only needed when ZMK/Zephyr deps change (pulls submodules)
- `CONFIG_ZMK_BLE=y` is explicitly set in `config/totem.conf` (board defconfig alone proved unreliable)
## Keymap
The active keymap is `config/totem.keymap`. It overrides the shield default at `config/boards/shields/totem/totem.keymap`.
3 layers: `BASE` (0), `UML` (1), `BT` (2).
## BINDINGS.md
**After every binding change** in `config/totem.keymap`, update `BINDINGS.md` with an ASCII graphic of all three layers and the quick-reference table. The physical key labels in the ASCII art must match the BASE layer positions exactly.
+85
View File
@@ -0,0 +1,85 @@
# TOTEM Keymap Reference
> Auto-generated from `config/totem.keymap`. **Must be updated after every binding change.**
---
## Layer 0: BASE (Colemak)
```
┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐
│ Q │ W │ F │ P │ B │ │ J │ L │ U │ Z │ ? │
├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤
│ A │ R │ S │ T │ G │ │ M │ N │ E │ I │ O │
├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤
│ ⇧ │ Y │ X │ C │ D │ V │ │ K │ H │ / │ , │ . │ ⎋ │
└─────┴─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┴─────┴─────┘
│ ␣ │ UML │ ⏎ │ │CTRL │ SPR │ ⌫ │
└─────┴─────┴─────┘ └─────┴─────┴─────┘
```
---
## Layer 1: UML (hold left thumb)
```
┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐
│ 1 │ 2 │ 3 │ 4 │ 5 │ │ + │ @ │ Ü │ { │ ~ │
├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤
│ Ä │ · │ ß │ ↑ │ · │ │ / │ ` │ > │ } │ Ö │
├─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┼─────┤
│ · │ · │ · │ ← │ ↓ │ → │ │ 6 │ 7 │ 8 │ 9 │ 0 │ * │
└─────┴─────┼─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┴─────┴─────┘
│ ⇥ │ · │ ⌥ │ │CTRL │ ( │ ) │
└─────┴─────┴─────┘ └─────┴─────┴─────┘
· = transparent (falls through to BASE)
⌥ = LALT / Option
```
### Arrow cluster
```
T → ↑
C → ← D → ↓ V → →
```
| Physical key | Action |
|-------------|--------|
| T | ↑ |
| C | ← |
| D | ↓ |
| V | → |
---
## Bluetooth Profile Switching
CTRL is a normal modifier key. BT profiles are switched via **combos** (press both keys
within 50ms of each other):
| Combo | Action |
|-------|--------|
| **CTRL + Q** | BT profile 1 |
| **CTRL + W** | BT profile 2 |
| **CTRL + F** | BT profile 3 |
| **CTRL + P** | BT profile 4 |
CTRL works normally for all other shortcuts (CTRL+C, CTRL+V, etc. are unaffected).
On macOS these combos do not conflict with standard shortcuts (which use Cmd, not Ctrl).
---
## Quick Reference
| Shortcut | Action |
|----------|--------|
| **UML + T** | ↑ |
| **UML + C** | ← |
| **UML + D** | ↓ |
| **UML + V** | → |
| **UML + ENT** | ALT / Option |
| **CTRL + Q** | BT profile 1 |
| **CTRL + W** | BT profile 2 |
| **CTRL + F** | BT profile 3 |
| **CTRL + P** | BT profile 4 |
+1 -1
View File
@@ -3,7 +3,7 @@ id: totem
name: TOTEM name: TOTEM
type: shield type: shield
url: https://github.com/GEIGEIGEIST/TOTEM url: https://github.com/GEIGEIGEIST/TOTEM
requires: [seeeduino_xiao_ble] requires: [xiao_ble]
features: features:
- keys - keys
siblings: siblings:
+16 -1
View File
@@ -1 +1,16 @@
CONFIG_ZMK_USB_LOGGING=n CONFIG_ZMK_USB_LOGGING=n
# Explicitly enable BLE (needed for xiao_ble)
CONFIG_ZMK_BLE=y
# Settings storage (board defconfig not reliably applied)
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FLASH_MAP=y
CONFIG_NVS=y
CONFIG_SETTINGS_NVS=y
# Erst nach 10 Min Inaktivität schlafen
CONFIG_ZMK_IDLE_TIMEOUT=3600000
CONFIG_ZMK_SLEEP=y
CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=3600000
+13 -27
View File
@@ -10,9 +10,16 @@
#define BASE 0 #define BASE 0
#define UML 1 #define UML 1
#define BT 2
/ { / {
combos {
compatible = "zmk,combos";
combo_bt1 { timeout-ms = <50>; key-positions = <0 35>; bindings = <&bt BT_SEL 0>; };
combo_bt2 { timeout-ms = <50>; key-positions = <1 35>; bindings = <&bt BT_SEL 1>; };
combo_bt3 { timeout-ms = <50>; key-positions = <2 35>; bindings = <&bt BT_SEL 2>; };
combo_bt4 { timeout-ms = <50>; key-positions = <3 35>; bindings = <&bt BT_SEL 3>; };
};
macros { macros {
slash: slash { slash: slash {
label = "SLASH"; label = "SLASH";
@@ -91,7 +98,7 @@ label = "BASE";
&kp Q &kp W &kp F &kp P &kp B &kp J &kp L &kp U &kp Z &qmark &kp Q &kp W &kp F &kp P &kp B &kp J &kp L &kp U &kp Z &qmark
&kp A &kp R &kp S &kp T &kp G &kp M &kp N &kp E &kp I &kp O &kp A &kp R &kp S &kp T &kp G &kp M &kp N &kp E &kp I &kp O
&kp LSHFT &kp Y &kp X &kp C &kp D &kp V &kp K &kp H &slash &kp DOT &kp COMMA &kp ESC &kp LSHFT &kp Y &kp X &kp C &kp D &kp V &kp K &kp H &slash &kp DOT &kp COMMA &kp ESC
&kp SPACE &mo UML &kp RET &lt BT LCTRL &kp LGUI &kp BSPC &kp SPACE &mo UML &kp RET &kp LCTRL &kp LGUI &kp BSPC
>; >;
}; };
@@ -102,41 +109,20 @@ label = "UML";
// ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓ ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓ // ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓ ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓
// ┃ 1 ┃ 2 ┃ 3 ┃ 4 ┃ 5 ┃ ┃ + ┃ @ ┃ Ü ┃ ┃ ~ ┃ // ┃ 1 ┃ 2 ┃ 3 ┃ 4 ┃ 5 ┃ ┃ + ┃ @ ┃ Ü ┃ ┃ ~ ┃
// ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ // ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫
// ┃ Ä ┃ ┃ ß ┃ UP ┃ ┃ - ┃ < ┃ > ┃ ┃ Ö ┃ // ┃ Ä ┃ ┃ ß ┃ UP ┃ ┃ - ┃ < ┃ > ┃ ┃ Ö ┃
// ┏━━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━━┓ // ┏━━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━━┓
// ┃ ┃ ┃ LEFT ┃ DOWN ┃ RIGHT ┃ ┃ 6 ┃ 7 ┃ 8 ┃ 9 ┃ 0 ┃ ┃ // ┃ ┃ ┃ LEFT ┃ DOWN ┃ RIGHT ┃ ┃ 6 ┃ 7 ┃ 8 ┃ 9 ┃ 0 ┃ ┃
// ┗━━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━┛ // ┗━━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━┛
// ┃ TAB ┃ trans ┃ ALT ┃ ┃ CTRL ┃ ( ┃ ) ┃ // ┃ TAB ┃ trans ┃ ALT ┃ ┃ CTRL ┃ ( ┃ ) ┃
// ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛ ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛ // ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛ ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛
bindings = < bindings = <
// ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ // ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp KP_PLUS &at &kp LBKT &lbrace &tilde &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp KP_PLUS &at &kp LBKT &lbrace &tilde
&kp SQT &none &kp MINUS &none &kp UP &kp FSLH &kp GRAVE &gt_sign &rbrace &kp SEMI &kp SQT &none &kp MINUS &kp UP &none &kp FSLH &kp GRAVE &gt_sign &rbrace &kp SEMI
&trans &none &kp LEFT &none &kp DOWN &kp RIGHT &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp KP_MULTIPLY &trans &none &none &kp LEFT &kp DOWN &kp RIGHT &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp KP_MULTIPLY
&kp TAB &trans &kp LALT &kp LCTRL &lparen &rparen &kp TAB &trans &kp LALT &kp LCTRL &lparen &rparen
>; >;
}; };
bt_layer {
// ╔══════════════════════════════════════╗
label = "BT";
// ╚══════════════════════════════════════╝
// ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓ ┏━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓
// ┃ BT1 ┃ BT2 ┃ BT3 ┃ BT4 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
// ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫
// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
// ┏━━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━━┓
// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
// ┗━━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┫ ┣━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━╋━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━┛
// ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
// ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛ ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━┛
bindings = <
// ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷ ╷
&bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none &none &none &none &none &none
&none &none &none &none &none &none &none &none &none &none
&none &none &none &none &none &none &none &none &none &none &none &none
&none &none &none &trans &none &none
>;
};
}; };
}; };