idx: 全バリアントを1つのorderに並べ、出力時に取捨して番号を詰める
排他キーも別々の要素として並べる。出力はバリアントを選択した構成を単位とし、
対象外のキーを除いた並びの位置をそのままキー番号にする。同じ配線の排他キーは
選択後に同時には残らないため、番号を共有させる必要がない。
保存したorderは選択で書き換えず、番号の互換性は出力レイアウトごとに扱う。
6d0eba9 で「IDXは番号を共有できる」と書いたが、共有をやめる形に変える。
コミュニティレイアウトの並びを取捨で得られるかは、この方式では未検証のため
IDXのP-1として残す。
Journal: journal/2026-09-22-idx-variant-output.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DKW58HEg8zAQoLrkWByPfD
This commit is contained in:
+55
-38
@@ -2,20 +2,24 @@
|
||||
|
||||
## 概要
|
||||
|
||||
IDXレイヤーは、PHYのキーに「キー番号」を与える。キー番号は、キーマップがキーを指すための識別子である。
|
||||
IDXレイヤーは、全バリアントにわたるPHYのキーの並び順を持つ。
|
||||
番号を使う形式への出力時に、選択したバリアントで使うキーだけを残し、0から連続するキー番号を与える。
|
||||
保存した並びの位置と、選択後の出力でのキー番号は区別する。
|
||||
|
||||
キー番号は他のどの情報からも導出できない。設計者が決める並び順そのものであり、
|
||||
そのためIDXが正本として持つ。ELCのrow/colが「配線から決まるので出力時に導出する」のと、
|
||||
理由が裏返しの関係にある。
|
||||
並び順は他のどの情報からも導出できない。設計者が決める情報なので、IDXが正本として持つ。
|
||||
ELCのrow/colが「配線から決まるので出力時に導出する」のと、理由が裏返しの関係にある。
|
||||
|
||||
IDXが持つのは、番号を振る対象のキーと、その並び順だけとする。
|
||||
IDXが持つのは、番号を振る対象のキーと、その並び順だけとする。バリアントの選択は保存しない。
|
||||
|
||||
## キー番号は公開インターフェース
|
||||
|
||||
基板を公開すると、他人が書いたキーマップがそのキー番号に依存する。
|
||||
番号を振り直すと、既存のキーマップが別のキーを指す。
|
||||
基板を公開すると、他人が書いたキーマップが、出力したレイアウトのキー番号に依存する。
|
||||
同じレイアウトで番号を振り直すと、既存のキーマップが別のキーを指す。
|
||||
|
||||
そのためキー番号は、出力のたびに生成し直す派生情報として扱わず、固定した正本として保存する。
|
||||
そのため並び順は正本として保存し、出力のたびに幾何や配線から生成し直さない。
|
||||
同じ並びと同じバリアント選択からは、同じ出力番号を得る。
|
||||
番号の互換性は出力レイアウトごとに扱い、異なるバリアントの同じ番号が同じキーを指すとは限らない。
|
||||
並びへの挿入・削除・並べ替えでは、影響する出力レイアウトの番号が変わることを考慮する。
|
||||
|
||||
## 幾何から導出しない
|
||||
|
||||
@@ -51,35 +55,47 @@ row / col 自体がELCの正本ではなく出力時の派生情報である。
|
||||
|
||||
## レイアウトバリアント
|
||||
|
||||
PHYがレイアウトバリアントを持つ場合も、キー番号の空間は1つとする。バリアントごとにIDXを分けない。
|
||||
キー番号は公開インターフェースであり、どの空間のものかを断らずに解釈できなければならない。
|
||||
特定のレイアウト向けの並びは、選んだバリアントに属さないキーを落として得る。
|
||||
ただしこれだけでは足りない場合がある。QMKのコミュニティレイアウトでは、同じマトリクス位置が
|
||||
レイアウトによって別の物理キーになり(ANSIのバックスラッシュとISOの `#~`)、残ったキーの読み順が変わる。
|
||||
ISO系で引数順が一致しない。
|
||||
IDXは、番号を振る対象のキーを全バリアントにわたって1つの `order` に持つ。
|
||||
各PHYキーIDを別々の要素として並べ、同じIDは重複させない。同じ接続先に配線された排他キーも
|
||||
別々の要素にする。物理キーごとに、出力先が要求する並びの中の位置を与えられるようにするため。
|
||||
|
||||
排他なキー同士は、同じキー番号を共有できる。`order` の要素にキーIDの配列を書くと、
|
||||
その位置の番号を配列内のキーで共有する。
|
||||
出力時は、PHYのVariantGroupごとにバリアントを選び、次の手順で出力用の並びを得る。
|
||||
|
||||
番号を共有できるのは、ELCで同じ接続先の組に配線されたキーに限る。
|
||||
3つの処理系が要求するのはいずれも「番号の位置 → マトリクス位置」の1対1の対応表であり、
|
||||
1つの番号に対応するマトリクス位置は1つしかないため。
|
||||
逆に、同じ接続先の組に配線された排他キーは番号を共有しなければならない。
|
||||
別々の番号を与えると、その対応表に同じマトリクス位置が2回現れ、1回のキー押下で両方の番号が反応する。
|
||||
1. 選択したバリアントの配下と、バリアントに属さない共通のキーを対象にする。
|
||||
入れ子の場合は、祖先のバリアントも選択されているキーだけを対象にする
|
||||
2. `order` から対象外のキーを除く。残ったキー同士の順序は変えない
|
||||
3. 残った並びの位置を、0から連続する出力用のキー番号とする
|
||||
|
||||
選択によって番号が詰まることはない。あるバリアントでしか実装されないキーの番号は、
|
||||
別のバリアントを選んだときには使われない番号として残る。
|
||||
保存した `order` は書き換えない。レイアウトごとに独立したIDXや並び順も保存しない。
|
||||
同じ接続先の排他キーは選択後に同時には残らないため、別々の要素でも出力の対応表に重複しない。
|
||||
番号を使う形式への出力は、バリアントを選択した構成を単位とする。
|
||||
|
||||
例えば、ANSIのバックスラッシュとISOの `#` が同じ接続先を使う場合も、次のように並べられる。
|
||||
QとAは共通キー、バックスラッシュと `#` は排他キーとする。
|
||||
|
||||
| キー | 保存したorderでの位置 | ANSI出力の番号 | ISO出力の番号 |
|
||||
| --- | --- | --- | --- |
|
||||
| Q | 0 | 0 | 0 |
|
||||
| バックスラッシュ | 1 | 1 | — |
|
||||
| A | 2 | 2 | 1 |
|
||||
| # | 3 | — | 2 |
|
||||
|
||||
全体の並びは `Q → バックスラッシュ → A → #`、ANSI出力は `Q → バックスラッシュ → A`、
|
||||
ISO出力は `Q → A → #` になる。
|
||||
|
||||
## 他レイヤーとの関係
|
||||
|
||||
IDXはPHYのキーIDだけを参照する。ELCを参照しない。
|
||||
|
||||
MAPはIDXを参照しない。MAPもキーの参照にPHYのキーIDを使う。
|
||||
キーマップを配列として出力するとき、IDXの並び順で並べ替える。
|
||||
これにより、IDXにキーを挿入して番号がずれても、MAPは書き換えずに済む。
|
||||
キーマップを配列として出力するとき、バリアント選択後のIDXの並び順で並べ替える。
|
||||
ELCから作るキー番号と接続先の対応表にも、同じ選択後の並びを使う。
|
||||
これにより、IDXの編集やバリアント選択で出力番号が変わっても、MAP内のキーIDへの割り当ては書き換えずに済む。
|
||||
PHYのIDで参照するELC・MAPの保存データ自体には、番号を詰める処理はない。
|
||||
|
||||
MAPが番号を持たないキーにキーコードを割り当てていた場合、そのキーは出力に現れない。
|
||||
IDXの `order` と突き合わせて検出できる。
|
||||
IDXの `order` と突き合わせて検出できる。`order` に含まれていても、選ばれなかったバリアントの
|
||||
キーへの割り当ては、その出力には含めない。
|
||||
|
||||
## 持たないもの
|
||||
|
||||
@@ -92,30 +108,31 @@ IDXの `order` と突き合わせて検出できる。
|
||||
|
||||
```ts
|
||||
type IDX = {
|
||||
order: (string | string[])[] // PHYのキーID。並びの位置がキー番号。
|
||||
// 配列は、その位置の番号を共有する排他バリアントのキー
|
||||
order: string[] // 全バリアントの対象キーのPHY ID。各IDは1回だけ現れる。
|
||||
// 出力時に対象外のキーを除き、残った並びの位置をキー番号とする
|
||||
}
|
||||
```
|
||||
|
||||
並びの位置を番号とする形は、ELCの `LEDChain.order` と同じ形である。
|
||||
欠番・重複・番号の飛びが構造として起こらない。
|
||||
番号は個別のフィールドとして持たず、出力時の並びの位置で表すため、出力番号に欠番や飛びは生じない。
|
||||
キーIDの重複は許さない。
|
||||
|
||||
`order` に挙げたキーだけが番号を持つ。PHYの部品ノードと `decal` のキーは対象にならない。
|
||||
出力番号の対象は `order` に挙げたキーに限る。PHYの部品ノードと `decal` のキーは対象にならない。
|
||||
|
||||
## 検討済み・非採用
|
||||
|
||||
- PHYのツリー順をキー番号とする (journal/2026-09-21-idx-necessity.md)
|
||||
- ELCのマトリクス順からキー番号を導出する (journal/2026-09-21-idx-necessity.md)
|
||||
- `keyId` と `index` の対を並べる形 (journal/2026-09-21-idx-necessity.md)
|
||||
- 排他キーで番号を共有し、選択後も番号を詰めない (journal/2026-09-22-idx-variant-output.md)
|
||||
- MAPがキー番号を参照する (journal/2026-09-21-idx-necessity.md)
|
||||
- レイアウトごとに別のIDXを持つ (journal/2026-09-21-multi-layout.md)
|
||||
|
||||
## 未確認事項
|
||||
|
||||
### P-1 一致しないコミュニティレイアウトの並びをどう与えるか
|
||||
### P-1 単一のorderから既存コミュニティレイアウトの並びを得られる範囲
|
||||
|
||||
- 位置づけ: 本文「レイアウトバリアント」の残余。一致しない場合があることは確認済み
|
||||
- 現状の認識: QMKの実データで、コミュニティレイアウトとの173組のうち30組(すべてISO系)が
|
||||
`order` からの取捨では得られない。並べ替えの規則を与えるか、レイアウトごとの並びを持つかが未定。
|
||||
後者は「レイアウトごとに別のIDXを持つ」として一度落としている
|
||||
- 格上げ条件: 埋め方をユーザーが決める
|
||||
- 位置づけ: 本文「レイアウトバリアント」の方式を、既存レイアウトとの互換出力に使う際の未検証部分
|
||||
- 現状の認識: 同じ配線を使う別のPHYキーを別々の位置に置けるため、本文のANSI/ISO例は取捨で表せる。
|
||||
既存のコミュニティレイアウト全般で同じように表せるかは未検証。同じPHYキーIDを使う共通キー同士の
|
||||
要求順がレイアウト間で逆転する場合は、単一のorderからの取捨では表せないが、その実例の有無は未確認
|
||||
- 格上げ条件: 実データのキーを共通キーとバリアント別のPHYキーに対応づけ、全体のorderから各レイアウトの
|
||||
要求順を取捨で再現できるか確認する。再現できないものが残る場合は、対応範囲と扱いを決める
|
||||
|
||||
Reference in New Issue
Block a user