Compare commits

...
6 Commits
Author SHA1 Message Date
ewdernaandClaude Opus 5.5 7c927f5e12 map: 固有コード非対応の項目を対応範囲の一覧へ戻す
1414a7dでVIA移行の段落を一覧の途中に挿入し、固有コードの項目が一覧から離れていたのを直す。内容の変更なし。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td
2026-09-24 08:35:10 +09:00
ewdernaandClaude Opus 5.5 a37fdd4abd map: VIAで読み書きする項目と、機能はビルド設定を正とする確認方法を定める
- バージョン、レイヤー数、キーコード割り当て、マクロに対応。エンコーダはMAP-P-4、layout optionはP-3
- リセット系、デバイスの識別表示、キーテスター、custom channelは当面非対応
- 有効な機能は新規キーボードではGeneratorのビルド設定、既存キーボードでは利用者の申告を正とし、容量は実機から読んで照合する
- P-2を実機で未検証という推測に置き換える

Journal: journal/2026-09-24-via-read-write-scope.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td
2026-09-24 08:32:03 +09:00
ewdernaandClaude Opus 5.5 333c651491 map: 最初の対応環境をQMK 0.34.4とする
- QMK 0.34.4(08c662f)、キーコード体系0.0.9、VIAプロトコル0x000D。VIAは同梱の従来実装
- P-2の未決事項から対応コミットとキーコード体系を外す

Journal: journal/2026-09-24-qmk-feature-inventory.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td
2026-09-24 08:25:08 +09:00
ewdernaandClaude Opus 5.5 0dc7933077 backlog: Cコードの生成とユーザーのCの組み込みをMAP-P-9として追加する
keymap.jsonではタップダンス・コンボ・キーごとの設定等を表現できず、Cの生成が必要になる。
JSONを正本にしつつ、ユーザーのC/hで一部を上書きする方法を保留する。フック方式が有力。

Journal: journal/2026-09-24-generator-c-override.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td
2026-09-24 08:22:20 +09:00
ewdernaandClaude Opus 5.5 dccc5f095f map: 対応環境をQMKのコミットと使うモジュールの一覧で固定する
- 各モジュールは出所とコミットで指定し、QMK同梱のものはQMKのコミットで決まる
- VIAもモジュールの1つとして扱い、QMKリポジトリ外へ移っても同じ形で指定できるようにする
- MAP-P-6の未決事項からモジュールの指定方法を外す

Journal: journal/2026-09-24-via-module-migration.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td
2026-09-24 08:21:59 +09:00
ewdernaandClaude Opus 5.5 1414a7d725 map: VIAがCommunity Modulesへ移ってもVIAモジュールで追従する
- QMKはVIAをモジュールへ移し、旧実装を将来削除すると告知している(0.34.4 ChangeLog)
- QMKとVIAの両方に追従する方針は変えず、Community Modules非対応の例外としてVIAモジュールに対応する
- 移行がmasterに入る前に対応するため、MAP-P-6の再開条件に#26315のdevelop取り込みを加える

Journal: journal/2026-09-24-via-module-migration.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011zrYqwC8nXQX5Kg9Fur6Td
2026-09-24 08:21:45 +09:00
7 changed files with 320 additions and 11 deletions
+31 -8
View File
@@ -61,9 +61,12 @@ MAPエディタはDynamicの読み書きを提供する。Dynamicで変更でき
- 次のものには当面対応しない。 - 次のものには当面対応しない。
- Vial等のフォーク - Vial等のフォーク
- XAP、developブランチ等、master以外にある機能 - XAP、developブランチ等、master以外にある機能
- Community Modules - Community Modules(VIAモジュールを除く)
- キーボード・キーマップ固有のコード(VIAのキーボード独自メニューを含む)には、原則として対応しない。 - キーボード・キーマップ固有のコード(VIAのキーボード独自メニューを含む)には、原則として対応しない。
QMKはVIAをCommunity Modulesの形式へ移し、従来の実装を将来のリリースで削除すると告知している(QMK 0.34.4のChangeLog「VIA Feature Migration」)。
VIAがモジュールへ移っても、QMKとVIAの両方に追従する。そのため、移行がmasterに入る前に、VIAモジュールを有効にした出力と読み書きに対応する。
Staticで定義する動作(タップダンス等)をキーへ割り当てるときは、定義を名前で参照し、出力時に番号へ変換する。 Staticで定義する動作(タップダンス等)をキーへ割り当てるときは、定義を名前で参照し、出力時に番号へ変換する。
割り当て自体はVIAで読み書きできても、参照先の定義はStaticにしかないため、 割り当て自体はVIAで読み書きできても、参照先の定義はStaticにしかないため、
[レイヤーの参照](#キーマップレイヤーの識別)と同じく並び順に依存させない。 [レイヤーの参照](#キーマップレイヤーの識別)と同じく並び順に依存させない。
@@ -85,13 +88,34 @@ QMK本家のVIAには、VIAの管理外にある実機の保存設定(Magic設
- VIAへの対応は、Remapというアプリ全体の機能を再現することを意味しない。 - VIAへの対応は、Remapというアプリ全体の機能を再現することを意味しない。
- 初期の実装対象はVIAに限る。 - 初期の実装対象はVIAに限る。
対応するQMKは特定のコミットに固定し、更新するタイミングはユーザーが個別に判断する。 対応環境は、QMKのコミットと、使うモジュールの一覧(各モジュールの出所とコミット)で固定し、
更新するタイミングはユーザーが個別に判断する。QMKに同梱されたモジュールは、QMKのコミットで決まる。
VIAもモジュールの1つとして扱い、QMKリポジトリの外へ移った場合にも同じ形で指定できるようにするため。
MAPエディタのUIには、対応しているVIAプロトコルとキーコード体系のバージョンを明示する。 MAPエディタのUIには、対応しているVIAプロトコルとキーコード体系のバージョンを明示する。
接続した実機とはこの2つのバージョンで照合し、一致しない実機には対応しない。 接続した実機とはこの2つのバージョンで照合し、一致しない実機には対応しない。
実機から取得できるバージョン情報がこの2つに限られるため。 実機から取得できるバージョン情報がこの2つに限られるため。
最初に対応するQMKのコミット、キーコード体系、編集項目の範囲は、 最初に対応する環境は、QMK 0.34.4(commit `08c662f`)とする。このときキーコード体系は0.0.9、VIAプロトコルは0x000D。
[P-2](#p-2-viaの初期対応範囲)で扱う。 VIAは同梱の従来実装(`quantum/via.c`)で、追加のモジュールは使わない。
## VIAで読み書きする項目
VIAプロトコル0x000Dのコマンドのうち、MAPエディタが扱うものを次のように分ける[推測:P-2]。
- 対応する:
- VIAプロトコルとキーコード体系のバージョンの読み出し(実機との照合に使う)
- レイヤー数の読み出し
- レイヤー別のキーコード割り当ての読み書き
- マクロの読み書き(個数・容量の読み出しとリセットを含む)
- 別の課題で扱う:
- エンコーダの割り当て([MAP-P-4](backlog/README.md#map-p-4-onoff以外の入力への割り当て))
- layout option([P-3](#p-3-プロジェクトと実機の対応状態管理))
- 当面対応しない: キーマップ・EEPROMのリセット、ブートローダへの移行、デバイスの識別表示、
マトリクス状態の読み出し(キーテスター)、custom channel(照明・オーディオ・キーボード独自メニュー)
実機のファームウェアでどの機能が有効かは、VIAでは読み出せない。
新規キーボードではFirmware Generatorのビルド設定を正とする。既存キーボードでは、利用者が同じ形式で申告した内容を信用する。
レイヤー数、マクロの個数と容量は実機から読み出し、書き込む前にMAPの内容が収まるかを確認する。
## 持たないもの ## 持たないもの
@@ -121,11 +145,10 @@ MAPエディタは、キーコードを当面US配列の文字で表示する。
- キーごとに上書きする設定を、PHYのキー、キーとレイヤーの組、キーコードのどれに付けるか。 - キーごとに上書きする設定を、PHYのキー、キーとレイヤーの組、キーコードのどれに付けるか。
- 完了条件: 動作定義とキーごとの設定の保存形式をユーザーが決める。 - 完了条件: 動作定義とキーごとの設定の保存形式をユーザーが決める。
### P-2 VIAの初期対応範囲 ### P-2 VIAのコマンドはQMK 0.34.4のソースどおりに動作する
- 位置づけ: VIA通信と編集UIの実装に必要な対応範囲の判断。 - 位置づけ: 本文「VIAで読み書きする項目」が前提にしている。コマンドの内容はソース(`quantum/via.c`)と公式文書から確認したもので、実機では検証していない。
- 未決事項: 最初に対応するQMKのコミット、キーコード体系、レイヤー別割り当て以外に読み書きする項目、対象ファームウェアの機能・容量制約の確認方法。 - 格上げ条件: QMK 0.34.4でビルドした新規キーボードの構成で、対応するコマンドの読み書きと、レイヤー数・マクロの個数と容量の読み出しを実機で確認する。
- 完了条件: 対象バージョンと読み書きする項目を定め、対応する新規キーボードの構成で必要なコマンドと制約を確認する。
### P-3 プロジェクトと実機の対応・状態管理 ### P-3 プロジェクトと実機の対応・状態管理
+18 -2
View File
@@ -124,10 +124,12 @@
### MAP-P-6 QMKのdevelopブランチ・Community Modulesへの対応 ### MAP-P-6 QMKのdevelopブランチ・Community Modulesへの対応
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「DynamicとStatic」 - 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「DynamicとStatic」
- 未決事項: 当面非対応としたdevelopブランチの機能とCommunity Modulesを、DynamicとStaticの対象に含めるか。 - 未決事項: 当面非対応としたdevelopブランチの機能とCommunity Modules(VIAモジュール以外)を、DynamicとStaticの対象に含めるか。
含める場合、対応するコミットやモジュールの指定方法と、UIでの対応バージョンの示し方。 含める場合、developブランチのコミットの指定方法と、UIでの対応バージョンの示し方。
- 保留できる理由: QMK本家masterの公式機能だけで、Dynamicの読み書きとStaticの生成を実装できる。 - 保留できる理由: QMK本家masterの公式機能だけで、Dynamicの読み書きとStaticの生成を実装できる。
- 再開条件: masterの機能だけでは足りない動作や設定が必要になったとき。 - 再開条件: masterの機能だけでは足りない動作や設定が必要になったとき。
または、VIAのモジュール移行([qmk_firmware#26315](https://github.com/qmk/qmk_firmware/pull/26315))がdevelopに入ったとき。
VIAモジュールへの対応はmasterに入る前に済ませる([MAPレイヤー「DynamicとStatic」](../MAPレイヤー.md#dynamicとstatic))。
- 完了条件: 対象に含める範囲と、対応バージョンの管理方法をユーザーが決める。 - 完了条件: 対象に含める範囲と、対応バージョンの管理方法をユーザーが決める。
### MAP-P-7 再ビルド時に実機の調整を失わないワークフロー ### MAP-P-7 再ビルド時に実機の調整を失わないワークフロー
@@ -146,3 +148,17 @@
- 保留できる理由: 当面の対象ファームウェアはQMKだけで、QMK表記のまま保存・読み書き・出力できる。 - 保留できる理由: 当面の対象ファームウェアはQMKだけで、QMK表記のまま保存・読み書き・出力できる。
- 再開条件: QMK以外のファームウェアへの出力や、実機との通信に着手するとき。 - 再開条件: QMK以外のファームウェアへの出力や、実機との通信に着手するとき。
- 完了条件: QMK以外のファームウェアで使うキーコードの表現と、QMK表記との対応方法をユーザーが決める。 - 完了条件: QMK以外のファームウェアで使うキーコードの表現と、QMK表記との対応方法をユーザーが決める。
### MAP-P-9 Cコードの生成とユーザーのCの組み込み
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「MAPデータと他レイヤーの関係」「DynamicとStatic」、[全体方針のFirmware Generator](../keyboard-design-layers.md#firmware-generator)
- 未決事項: QMKのkeymap.jsonでは、タップダンス・コンボ・キーオーバーライドや、キーごとの設定(`get_tapping_term` 等のコールバック)を表現できない。
JSONを正本にしたままこれらをCとして生成する方法と、ユーザーが用意したC/hで一部を上書きする方法。
QMKのコールバックは1つの関数として定義するため、生成したCとユーザーのCが同じ関数を定義するとビルドできない。候補:
- 生成した関数の先頭でユーザー用のフックを呼び、フックが処理しなかった場合はJSONの値を使う(有力)
- ユーザーが引き受ける関数をJSONまたはhのプロトタイプで宣言し、Generatorはその関数を出力しない
`ACTION_TAP_DANCE_FN*` やリーダーキーのように、本質的にCで書く動作をJSONから参照する方法も含む。
MAPの「キーマップ固有のコードには原則として対応しない」との関係も整理する。
- 保留できる理由: レイヤー別の割り当てとVIAでの読み書きは、keymap.jsonで表現できる範囲だけで実装できる。
- 再開条件: Firmware Generatorでタップダンス・コンボ・キーごとの設定等を出力するとき、またはP-1で動作定義とキーごとの設定の保存形式を決めるとき。
- 完了条件: 生成するCの構成と、ユーザーのC/hを組み込む方法をユーザーが決め、両方を含む構成でQMKのビルドが通ることを確認する。
@@ -0,0 +1,29 @@
# GeneratorのC出力とユーザーのCによる上書き
## 結論
未決。backlog MAP-P-9 として保留(ユーザー指定)。フック方式が有力(ユーザー「フック方式いいかも」)。
JSONを第一級にしてCを自動生成し、ユーザーのC/hで一部を上書きできるようにしたい、というのがユーザーの意向。
## 案の比較
| 案 | 内容 | 所見 |
| --- | --- | --- |
| (b) フック | 生成関数の先頭でユーザーのフックを呼び、未処理ならJSONの値 | キー単位の例外だけ書ける。JSONが正本のまま |
| (a) 関数ごと置き換え(JSONで宣言) | 宣言された関数はGeneratorが出力しない | 単純。その関数の範囲ではJSONの値が無効になる |
| (a') 関数ごと置き換え(hのプロトタイプで宣言) | ユーザーのhにあるプロトタイプの関数を出力しない(ユーザー案) | (a)と同じ性質。Generatorがhを解析する必要 |
| weak属性で上書き | 生成側をweakにしてユーザーの定義で上書き | 使えない(下記) |
| ユーザーのCを解析して自動判定 | — | 壊れやすい |
## 根拠(QMK 0.34.4)
- keymap.jsonで書けるもの: keyboard, keymap, layout, layers, encoders, dip_switches, macros, keycodes(名前宣言), config, modules,
host_language 等(data/schemas/keymap.jsonschema)。タップダンス・コンボ・キーオーバーライド・キーごとの設定はない。
- キーごとの設定は `*_PER_KEY` を定義した上での `get_tapping_term(keycode, record)` 等のコールバック。keyrecordを受けるので
キーコード単位でも位置単位でも書ける。
- keymap.jsonとkeymap.cを並べると、json2cで生成したkeymap.cがユーザーのkeymap.cを取り込む
(builddefs/build_keyboard.mk:148-157、OTHER_KEYMAP_C)。QMK自体がJSON + ユーザーCの共存に対応している。
- 取り込みは同一翻訳単位なので、生成側weak + ユーザー側strongは再定義エラーになる。QMK本体のweak既定実装もあるため、
別ファイルにしても生成側をweakにする方式は選ばれる定義が不定。
- プロトタイプの再宣言はCでは合法(同一シグネチャなら何度でも)。QMKが宣言済みの関数をユーザーのhに書いてもよい。
シグネチャ違いはコンパイルエラーになるので検出にも使える。
+162
View File
@@ -0,0 +1,162 @@
# QMK 0.34.4 の機能棚卸し(MAP P-2 の下調べ)
## 結論
- 対象: QMK `0.34.4`(tag, commit `08c662f286ddfd12a985f57b584b02eca5af0ae6`, 2026-09-05)。masterの最新リリース。
ユーザーが最初の対応環境として0.34.4を採用(2026-09-24)。
- キーコード体系 `QMK_KEYCODES_VERSION` = `0.0.9`(quantum/keycodes.h)
- `VIA_PROTOCOL_VERSION` = `0x000D`(quantum/via.h。9/23時点の調査と同じ)
- MAPから見たQMKの機能は次の6種類に分かれる(下の表)。スキーマ・編集機能への落とし込みは未着手。
- 既存ドキュメントに影響しうる事実が2つある:
1. **VIAのモジュール化**(20260830 ChangeLog「VIA Feature Migration」#26315)。VIA統合の保守をVIAチームへ移し、
旧来のfeature実装は将来のリリースで削除予定と告知済み。PR本体はdevelop向けのDraftで、0.34.4時点のVIAは従来の
`quantum/via.c`。MAPレイヤー.md は「Dynamic = QMK本家のVIA」「Community Modules は当面非対応」としているため、
VIAがモジュール側へ移った時点でこの2つが衝突する。
2. **VIAのマトリクス状態取得の無効化**(20250831 ChangeLog #25414)。`id_switch_matrix_state` は既定で全0を返す。
`VIA_INSECURE` 定義時、または `SECURE_ENABLE` でアンロック中のみ実値。Remap等のキーテスターは既定では動かない。
- QMKのキーごとの設定(tapping term等)はデータテーブルではなく、keycode/keyrecordを受けるCのコールバック関数で表現される。
keymap.json(data-driven)で書けるのはレイヤー・エンコーダ・DIPスイッチ・マクロ・カスタムキーコード・config・modules まで。
タップダンス・コンボ・キーオーバーライド・キーごとの設定はCでしか書けない。
## 分類の概要
| 区分 | 主なもの | 実機への保存 | VIAで読み書き |
| --- | --- | --- | --- |
| A. キーコード(単体で完結) | 基本キー、修飾付き、MT/LT/OSM等、レイヤー操作、Magic、メディア、マウス等 | キーマップ | ○(16bit値として) |
| B. 定義を参照するキーコード | TD(n)、QK_MACRO_n、UM/UP、QK_KB_n/QK_USER_n | 参照はキーマップ、定義はファームウェア | 参照のみ○。定義はマクロのみ○ |
| C. キー以外の起動条件を持つ動作 | コンボ、キーオーバーライド、リーダー、オートコレクト、Tri Layer | ファームウェア | × |
| D. タップ・ホールド等の挙動設定 | TAPPING_TERM等 + キーごとのコールバック | ファームウェア(DTTの変更は揮発) | × |
| E. キー以外の入力への割り当て | エンコーダ、DIPスイッチ、ポインティング、ジョイスティック等 | エンコーダはキーマップ | エンコーダのみ○ |
| F. 実機の永続状態 | Magic設定、保存されたデフォルトレイヤー、Unicodeモード等 | EEPROM | × |
MAPの所有外(照明・オーディオ・ディスプレイ・ハードウェア構成)は末尾にまとめた。
---
## A. キーコード体系 0.0.9
data/constants/keycodes/*.hjson を 0.0.1〜0.0.9 の順にマージして得た範囲。
| 範囲 | 名前 | 内容 |
| --- | --- | --- |
| 0x0000–0x00FF | QK_BASIC | KC_NO/KC_TRNS、HID基本キー(basic 161件)、system 3、media 27、mouse 19(QK_MOUSE_*)、修飾8 |
| 0x0100–0x1FFF | QK_MODS | `LCTL(kc)` 等。kcは基本キーのみ、修飾は5bit(左右混在不可) |
| 0x2000–0x3FFF | QK_MOD_TAP | `MT(mod, kc)`。kcは基本キーのみ |
| 0x4000–0x4FFF | QK_LAYER_TAP | `LT(layer, kc)`。layer 0–15、kcは基本キーのみ |
| 0x5000–0x51FF | QK_LAYER_MOD | `LM(layer, mod)`。layer 0–15 |
| 0x5200– | QK_TO / MOMENTARY / DEF_LAYER / TOGGLE_LAYER / ONE_SHOT_LAYER / ONE_SHOT_MOD / LAYER_TAP_TOGGLE / PERSISTENT_DEF_LAYER | TO/MO/DF/TG/OSL/OSM/TT/PDF。各32(layer 0–31) |
| 0x5600–0x56FF | QK_SWAP_HANDS | SH_T(kc)、SH_TOGG等7件 |
| 0x5700–0x57FF | QK_TAP_DANCE | TD(0–255) |
| 0x7000–0x70FF | QK_MAGIC | Ctrl/Caps、Alt/GUI、Ctl/GUI、Grave/Esc、BSpc/BSlash、Esc/Caps入替、GUI無効、NKRO、EE_HANDS 等35件 |
| 0x7100–0x71FF | QK_MIDI | ノート・オクターブ・移調・ベロシティ・チャンネル等 |
| 0x7200–0x73FF | QK_SEQUENCER | 9件 |
| 0x7400–0x743F | QK_JOYSTICK | ボタン0–31 |
| 0x7440–0x747F | QK_PROGRAMMABLE_BUTTON | 1–32 |
| 0x7480–0x74BF | QK_AUDIO | Audio/Clicky/Music 15件 |
| 0x74C0–0x751F | QK_STENO | 0.0.9で拡張・改名(STN_* → QK_STENO_* / ST_*、旧名はエイリアス) |
| 0x7700–0x777F | QK_MACRO | QK_MACRO_0–31(名前付き)。VIA/keymap.jsonのマクロ |
| 0x7780–0x77BF | QK_CONNECTION | 出力先切替(USB/2.4GHz/BT)、BTプロファイル1–5等15件 |
| 0x77C0–0x77FF | QK_COMMUNITY_MODULE | Community Modules用 |
| 0x7800–0x78FF | QK_LIGHTING | Backlight 7、LED Matrix 11、RGBLight(underglow)11 + RGB_MODE_* 10、RGB Matrix 15 |
| 0x7C00–0x7DFF | QK_QUANTUM | 下記 |
| 0x7E00–0x7E3F | QK_KB | QK_KB_0–31(キーボード固有) |
| 0x7E40–0x7FFF | QK_USER | QK_USER_0–31(キーマップ固有。SAFE_RANGE以降) |
| 0x8000–0xFFFF | QK_UNICODE / UNICODEMAP / UNICODEMAP_PAIR | UC(cp≤0x7FFF)、UM(i)、UP(i,j) |
QK_QUANTUM の内訳(73件): Bootloader/Reboot/Debug/EEPROMクリア/Make、Auto Shift操作6、Grave Escape、
Velocikey、Space Cadet 7、Unicodeモード切替8、Haptic 13、Combo on/off/toggle、Dynamic Macro 5、Leader、
Key Lock、One Shot on/off/toggle、Key Override on/off/toggle、Secure 4、Dynamic Tapping Term 3、Caps Word、
Autocorrect 3、Tri Layer Lower/Upper、Repeat/Alt Repeat、Layer Lock。
補足:
- 20250831で旧RGB・マウスの非推奨キーコードを削除(#25444)。
- VIAはキーマップを16bit値で読み書きするため、上のどの値もキーへ書ける。ファームウェアで無効な機能の値は何もしない。
## B. 定義を参照するキーコード
| 機能 | キーコード | 定義の中身 | 定義の置き場所 |
| --- | --- | --- | --- |
| Tap Dance | TD(n) | `ACTION_TAP_DANCE_DOUBLE(kc1,kc2)` / `_LAYER_MOVE(kc,layer)` / `_LAYER_TOGGLE(kc,layer)` / `_FN` / `_FN_ADVANCED` / `_FN_ADVANCED_WITH_RELEASE`。組み込みは前3つで、残りはC関数 | C(`tap_dance_actions[]`) |
| マクロ | QK_MACRO_n | tap/down/up/delay(+keymap.jsonではbeep)と文字列。VIAの保存形式は SS_TAP/DOWN/UP/DELAY_CODE を含むバイト列 | keymap.json `macros` またはVIA(EEPROM)。VIA既定16個 |
| Unicode Map | UM(i), UP(i,j) | コードポイント表 | C(`unicode_map[]`) |
| 固有キーコード | QK_KB_n, QK_USER_n | 任意のC処理 | C(`process_record_*`)。keymap.json `keycodes` で名前宣言のみ可 |
| Send String | (キーコードなし) | 文字列送信。マクロやC処理から呼ぶ | C |
## C. キー以外の起動条件を持つ動作
| 機能 | 定義 | 主な設定 |
| --- | --- | --- |
| Combos | キーコード列(最大8、EXTRA_LONGで16)→出力キーコード | COMBO_TERM、per-combo: term/must_hold/must_tap/must_press_in_order、COMBO_STRICT_TIMER、COMBO_ONLY_FROM_LAYER / COMBO_REF_DEFAULT(参照レイヤー)、Modifier Combos、キー解放・再押下の扱い |
| Key Overrides | trigger, trigger_mods, layers(ビットマスク), negative_mod_mask, suppressed_mods, replacement, options(ko_option_t), custom_action, enabled | MODS_TO_NEUTRALIZE |
| Leader Key | QK_LEADER の後のキー列(1〜5キー)→C処理 | LEADER_TIMEOUT、LEADER_PER_KEY_TIMING、LEADER_NO_TIMEOUT、STRICT_KEY_PROCESSING |
| Autocorrect | 誤字→訂正の辞書(ビルド時にtrieへ変換) | 辞書ファイル、MIN/MAX_LENGTH |
| Tri Layer | lower+upper → adjust レイヤー | 3レイヤーの番号 |
| Caps Word / Repeat Key / Layer Lock / Key Lock / Swap Hands | 定義データはほぼなし。Swap Handsは `hand_swap_config`(マトリクス対応表)が必要 | Caps Wordの継続キー判定等はC |
## D. タップ・ホールド等の挙動設定(docs/tap_hold.md 他)
全体設定(config.h / keyboard.jsonのconfig)とキーごとのコールバックの組で提供される。
| 設定 | 全体 | キーごと |
| --- | --- | --- |
| Tapping Term | TAPPING_TERM | TAPPING_TERM_PER_KEY → get_tapping_term(keycode, record) |
| Dynamic Tapping Term | DYNAMIC_TAPPING_TERM_ENABLE(キーで増減、揮発) | — |
| Permissive Hold | PERMISSIVE_HOLD | get_permissive_hold |
| Hold On Other Key Press | HOLD_ON_OTHER_KEY_PRESS | get_hold_on_other_key_press |
| Quick Tap Term | QUICK_TAP_TERM | get_quick_tap_term |
| Flow Tap(2025-05追加) | FLOW_TAP_TERM | is_flow_tap_key、get_flow_tap_term(keycode, record, prev_keycode) |
| Chordal Hold(2025-02追加) | CHORDAL_HOLD + 左右手の割り当て(chordal_hold_layout) | get_chordal_hold(tap_hold_keycode, …, other_keycode, …) |
| Retro Tapping | RETRO_TAPPING | get_retro_tapping |
| Speculative Hold(2025-11追加) | SPECULATIVE_HOLD | get_speculative_hold |
| Tapping Force Hold | — | get_tapping_force_hold |
| Tapping Toggle | TAPPING_TOGGLE(TTのタップ回数) | — |
| Auto Shift | AUTO_SHIFT_TIMEOUT 等 | get_autoshift_timeout、get_auto_shifted_key、REPEAT/NO_AUTO_REPEAT_PER_KEY |
| One Shot | ONESHOT_TAP_TOGGLE、ONESHOT_TIMEOUT | — |
| Combo | COMBO_TERM | get_combo_term 等(コンボごと) |
| その他 | TAP_CODE_DELAY、TAP_HOLD_CAPS_DELAY、DEBOUNCE | — |
- キーごとのコールバックは keycode と keyrecord(押された位置・レイヤーを含む)を受ける。
つまり「キーコード単位」「物理位置単位」のどちらでも書ける(docs/tap_hold.md「Why do we include the key record」)。
- Chordal Holdの手の割り当ては物理位置(マトリクス)単位のデータ。
## E. キー以外の入力への割り当て
| 機能 | MAP相当のデータ | 備考 |
| --- | --- | --- |
| Encoders | ENCODER_MAP: レイヤーごと・エンコーダごとの ccw/cw キーコード | keymap.json `encoders`。VIAで読み書き可(0x14/0x15) |
| DIP Switch | DIP_SWITCH_MAP: スイッチごとの on/off キーコード | keymap.json `dip_switches`(2025-11追加)。VIA不可 |
| Pointing Device | Auto Mouse Layer(レイヤー番号・タイムアウト)、ドラッグスクロール等はC | センサー設定はハードウェア寄り |
| Joystick / Digitizer / MIDI / Steno / Programmable Button / Sequencer | キーコードでボタン・音等を割り当て。軸・プロトコル設定は全体 | Stenoは0.0.9でキーコード改名 |
## F. 実機の永続状態(quantum/eeconfig.h)
VIA管理外でEEPROMに保存されるもの: debug、keymap config(Magic: Ctrl/Caps入替、Caps→Ctrl、Alt/GUI入替、GUI無効、Grave/Esc、BSpc/BSlash、NKRO 他)、
default layer(PDF)、Unicode入力モード、audio、backlight、rgblight/rgb_matrix/led_matrix、haptic、steno mode、
handedness(EE_HANDS)、connection、kb/user固有データ、Community Modules の永続データ(1.1.3で追加)。
QMK本家VIAにはこれらを読み出すコマンドがない(9/23調査の再確認)。
## MAP所有外の機能(参考の一覧)
- 照明: Backlight、RGBLight、RGB Matrix、LED Matrix、LED Indicators
- 表示: OLED、Quantum Painter(LVGL含む)、ST7565、HD44780
- 音・触覚: Audio、Haptic Feedback
- ハードウェア構成: Split Keyboard、Custom Matrix、Debounce、Converters、PS/2 Mouse、Wireless、Battery、USBPD
- ホスト連携: Raw HID、OS Detection、Secure、Command、Bootmagic、WPM、Deferred Exec、Virtser、Plover HID
- 拡張: Community Modules(1.1.3。modules/qmk/ に hello_world, super_alt_tab, split_data_sync, nvm_test, flow_*_matrix_effect)
## VIA 0x000D の読み書き範囲(0.34.4で再確認)
9/23の journal(qmk-dynamic-scope)と同じコマンド構成。差分・補足:
- `id_switch_matrix_state` は既定で0を返す(上記)。
- `id_eeprom_reset` は `VIA_EEPROM_ALLOW_RESET` 定義時のみ有効。
- エンコーダは `ENCODER_MAP_ENABLE` 時のみ。
- 既定: DYNAMIC_KEYMAP_LAYER_COUNT 4、DYNAMIC_KEYMAP_MACRO_COUNT 16。上限はEEPROM容量に従う。
## 調査方法
- `git clone --depth 1 --branch 0.34.4 --filter=blob:none --sparse` で docs / quantum / data / builddefs を取得。
- 機能一覧: docs/_sidebar.json、builddefs/generic_features.mk の GENERIC_FEATURES。
- キーコード: data/constants/keycodes/keycodes_*.hjson をバージョン順にマージ。
- 変更点: docs/ChangeLog/20250223〜20260830。
- VIA移行PR: https://github.com/qmk/qmk_firmware/pull/26315(develop向けDraft。VIA_EEPROM_MAGIC_ADDR 以外は後方互換を維持する方針と記載)
- 実機での検証はしていない。
@@ -0,0 +1,46 @@
# VIAのモジュール化への追従
## 結論
- QMKはVIA統合をCommunity Modules形式へ移し、旧実装を将来削除すると告知(20260830 ChangeLog「VIA Feature Migration」#26315)。
- 方針「QMKとVIAの両方に追従する」は変えない(ユーザー判断)。
→ Community Modulesは当面非対応のままだが、VIAモジュールだけは例外として、移行がmasterに入る前に対応する。
最悪、Community Modulesへの対応はVIAだけでもよい(ユーザー発言)。
- キーテスター(switch_matrix_state)が既定で動かない件は気にしない(ユーザー判断)。
## 案の比較
| 案 | 扱い |
| --- | --- |
| VIAモジュールだけCommunity Modules非対応の例外にする | 採用 |
| Community Modules全般に対応を広げる | MAP-P-6のまま保留 |
| 旧VIA実装が残るQMKに固定し続ける | 追従方針に反するので採用しない |
## 根拠(2026-09-24時点)
- docs/ChangeLog/20260830.md(QMK 0.34.4):
"upkeep of the VIA integration will transition to the VIA team" /
"in a future release, the old VIA feature-based implementation is expected to be removed."
- PR https://github.com/qmk/qmk_firmware/pull/26315 : develop向けDraft。追加ファイルは
modules/qmk/via/{qmk_module.json, via.c, via.h, post_config.h, post_rules.mk}。
qmk_module.json にバージョン欄なし。VIA_EEPROM_MAGIC_ADDR 以外は後方互換を維持すると記載。
- 0.34.4時点のVIAは従来どおり quantum/via.c、VIA_PROTOCOL_VERSION 0x000D。
- 同梱モジュールの有効化は keymap.json の `"modules": ["qmk/via"]` の形(data/schemas/keymap.jsonschema の modules、
builddefs/build_keyboard.mk の generate-community-modules-*)。対応コストは小さい見込み。
- 保守がVIAチームへ移るため、将来QMKリポジトリ外へ出る可能性はあるが未確認。
## 追記: 対応環境の指定方法
結論: 対応環境 = QMKのコミット + 使うモジュールの一覧(出所とコミット)。VIAは一覧の1項目。
QMK同梱モジュールはQMKのコミットで決まる。実機との照合は従来どおりVIAプロトコル・キーコード体系のバージョン。
| 案 | 扱い |
| --- | --- |
| QMKのコミット + モジュール一覧 | 採用。VIAが外部へ出てもMAP-P-6の他モジュールでも同じ形 |
| QMKのコミット + VIAのバージョンだけ追加 | VIAの特別扱いになるため採用しない |
| QMKのコミットだけ(現状) | VIAがリポジトリ外へ出ると実装が決まらない |
- きっかけ: ユーザーが「QMKに加えてVIAのバージョンも明記したほうがよいか」と相談。
- #26315の案ではVIAは modules/qmk/via(QMK同梱)で、qmk_module.json にバージョン欄がない。
この案のままならQMKのコミットだけで決まるが、保守移管後に外へ出る可能性に備える。
- モジュールのバージョンは実機から取得できないため、照合には使わない。
@@ -0,0 +1,33 @@
# VIAで読み書きする項目と機能・容量の確認方法
## 結論
- 対応: バージョン読み出し、レイヤー数、キーコード割り当て(まとめ読み書き含む)、マクロ
- 別課題: エンコーダ(MAP-P-4)、layout option(P-3)
- 当面非対応: リセット系・ブートローダ移行、デバイスの識別表示、キーテスター、custom channel
- 有効な機能: 新規キーボードはGeneratorのビルド設定を正とする。既存キーボードは利用者の申告を信用する(ユーザー案)。
申告はGeneratorの設定と同じ形式にし、新規と既存を1つのモデルで扱う。
- 容量(レイヤー数・マクロ個数・容量)は実機から読んで照合する。
- P-2は判断が済んだので、実機で未検証という推測(P-2)に置き換えた。
## 案の比較(VIA 0x000D, QMK 0.34.4 quantum/via.c)
| 項目 | コマンド | 扱い | 理由 |
| --- | --- | --- | --- |
| プロトコル・キーコード体系バージョン | 0x01, 0x02 id 0x06 | 対応 | 実機照合に必須 |
| レイヤー数 | 0x11 | 対応 | 容量確認 |
| キーコード | 0x04/0x05, 0x12/0x13 | 対応 | MAPの本体 |
| マクロ | 0x0C–0x10 | 対応 | P-1で内容をMAPが持つとした |
| エンコーダ | 0x14/0x15 | 別課題 | MAP-P-4 |
| layout options | 0x02/0x03 id 0x02 | 別課題 | P-3の排他キーの読み戻しと一体 |
| リセット・ブートローダ | 0x06, 0x0A, 0x0B | 当面非対応 | 操作でありMAPのデータではない。0x0Aは VIA_EEPROM_ALLOW_RESET 時のみ |
| デバイスの識別表示 | 0x03 id 0x05 | 当面非対応 | 任意の補助機能 |
| キーテスター | 0x02 id 0x03 | 非対応 | 既定で全0(#25414)。ユーザーも不要と判断 |
| custom channel | 0x07–0x09 | 非対応 | 照明・オーディオはMAP所有外、channel 0は固有コード |
## 機能・容量の確認
- VIAから読めるのは容量(レイヤー数、マクロ個数、マクロバッファサイズ)とバージョンだけ。
どの機能を有効にしてビルドしたか(タップダンス、コンボ等)は読めない。キーボード固有のVIA定義JSONにも含まれない。
- 無効な機能のキーコードを書いてもエラーにならず、実機で何もしないだけ。申告の誤りは壊れる方向には働かない。
- 既存キーボードは初期対応の前提ではない(MAPレイヤー.md「概要」)が、申告方式ならモデルを増やさずに扱える。
+1 -1
View File
@@ -165,7 +165,7 @@ All → Firmware
## 既存ツールとの関係 ## 既存ツールとの関係
- **KLE**: PHYデータを表示できる既存のビュワー。KLE JSONの読み書きで連携する - **KLE**: PHYデータを表示できる既存のビュワー。KLE JSONの読み書きで連携する
- **VIA/Remap**: 同じVIA対応実機の割り当てを編集する外部クライアント。外部で調整した結果もMAPエディタで読み出してプロジェクトへ戻す。対応範囲は[MAPのP-2](MAPレイヤー.md#p-2-viaの初期対応範囲)、実機との対応・状態管理は[MAPのP-3](MAPレイヤー.md#p-3-プロジェクトと実機の対応状態管理)で扱う - **VIA/Remap**: 同じVIA対応実機の割り当てを編集する外部クライアント。外部で調整した結果もMAPエディタで読み出してプロジェクトへ戻す。読み書きする項目は[MAP「VIAで読み書きする項目」](MAPレイヤー.md#viaで読み書きする項目)、実機との対応・状態管理は[MAPのP-3](MAPレイヤー.md#p-3-プロジェクトと実機の対応状態管理)で扱う
- **QMK Configurator**: Firmware Generatorのターゲット - **QMK Configurator**: Firmware Generatorのターゲット
## 配慮事項 ## 配慮事項