Files
Beyond-KLE/journal/2026-09-24-generator-c-override.md
T
ewdernaandClaude Opus 5.5 85f333cb24 chore: Markdownのインデント幅を4に固定し、リストの継続行をスペース4つに揃える
継続行がスペース2つだと、VS Codeがインデント幅を2と自動判定する。
.vscode/settings.json でMarkdownの自動判定を切って幅4に固定し、
既存の継続行もリストの記号から4つ下げた位置に揃える。
変更したファイルに markdownlint --fix をかけた分(journalのURL囲みと空行)も含む。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VbfgHT848s3JbuFw8MKFF8
2026-10-19 08:16:12 +09:00

2.4 KiB

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に書いてもよい。 シグネチャ違いはコンパイルエラーになるので検出にも使える。