PHY: レイアウトバリアントを木のノードとして導入し、ELC/IDXの扱いを決める

交換可能なキークラスタ(ISO Enter、スペース周りのキー数など)を、
VariantGroup / Variant の2ノードでPHYの木に表す。全バリアントのキーを
同時に持ち、単一の配置を要求する出力のときだけ1つ選んで畳む。

ELCは選択に関係なくsupersetを配線する。排他キー同士は同じ接続先を共有してよい。
IDXはキー番号の空間を1つに保ち、同じ接続先に配線された排他キーは
`order` の配列要素として同じ番号を共有する。

Journal: journal/2026-09-21-multi-layout.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JPCpuPv6hDN76RgNe2PsRR
This commit is contained in:
2026-09-21 09:34:51 +09:00
co-authored by Claude Opus 5
parent 2eb2867c13
commit a175ee3c53
6 changed files with 296 additions and 23 deletions
+27 -6
View File
@@ -49,6 +49,24 @@ row / col 自体がELCの正本ではなく出力時の派生情報である。
| ZMK | matrix transform の `map` の並び順 |
| KMK | `coord_mapping` の並び順 |
## レイアウトバリアント
PHYがレイアウトバリアントを持つ場合も、キー番号の空間は1つとする。バリアントごとにIDXを分けない。
キー番号は公開インターフェースであり、どの空間のものかを断らずに解釈できなければならない。
特定のレイアウト向けの並びは、選んだバリアントに属さないキーを落として得られる派生情報として扱う [推測:P-1]。
排他なキー同士は、同じキー番号を共有できる。`order` の要素にキーIDの配列を書くと、
その位置の番号を配列内のキーで共有する。
番号を共有できるのは、ELCで同じ接続先の組に配線されたキーに限る。
3つの処理系が要求するのはいずれも「番号の位置 → マトリクス位置」の1対1の対応表であり、
1つの番号に対応するマトリクス位置は1つしかないため。
逆に、同じ接続先の組に配線された排他キーは番号を共有しなければならない。
別々の番号を与えると、その対応表に同じマトリクス位置が2回現れ、1回のキー押下で両方の番号が反応する。
選択によって番号が詰まることはない。あるバリアントでしか実装されないキーの番号は、
別のバリアントを選んだときには使われない番号として残る。
## 他レイヤーとの関係
IDXはPHYのキーIDだけを参照する。ELCを参照しない。
@@ -71,7 +89,8 @@ IDXの `order` と突き合わせて検出できる。
```ts
type IDX = {
order: string[] // PHYのキーID。並びの位置がキー番号
order: (string | string[])[] // PHYのキーID。並びの位置がキー番号。
// 配列は、その位置の番号を共有する排他バリアントのキー
}
```
@@ -86,12 +105,14 @@ type IDX = {
- ELCのマトリクス順からキー番号を導出する (journal/2026-09-21-idx-necessity.md)
- `keyId` と `index` の対を並べる形 (journal/2026-09-21-idx-necessity.md)
- MAPがキー番号を参照する (journal/2026-09-21-idx-necessity.md)
- レイアウトごとに別のIDXを持つ (journal/2026-09-21-multi-layout.md)
## 未確認事項
### P-1 レイアウトバリアントの扱い
### P-1 特定レイアウト向けの並びが既存の慣習と一致するか
- 位置づけ: 未解決の問い。本文は単一レイアウトだけを前提にしている
- 現状の認識: QMKの `LAYOUT_60_ansi` / `LAYOUT_60_iso` のように、1つの基板が複数のキー番号空間を持つ場合がある。
1つのPHY+ELCに複数のIDXがぶら下がる形になりそうだが、PHYが代替キーをどう持つかが今のPHY仕様にない
- 格上げ条件: PHYの代替キーの表現とあわせて、マルチレイアウトの扱いをユーザーと決める
- 位置づけ: 本文「レイアウトバリアント」が前提にしている
- 現状の認識: `order` からキーを落として得た並びが、QMKのコミュニティレイアウト(`LAYOUT_60_ansi` など)が
要求する引数順と一致するかを確認していない。一致しないなら、レイアウトごとの並びを別に持つ必要が出る
- 格上げ条件: 実在のキーボードの `LAYOUT_all` とコミュニティレイアウトのマクロを読み、
前者から後者がキーの取捨だけで得られるかを確認する