キーバインドのしくみ¶

この節の要旨 全 100 アクションを
KeyBindingService(App.KeyBindings)で一元管理。割り当ての保存先はWindowSettings.CustomKeyBindings(List<KeyBindingDto>?)。割り当てはショートカットキータブで入力します(クリック → キー押下で記録。2 打鍵にも対応)。変更時にBindingsChangedイベントが発火し、RebuildInputBindings()とUpdateShortcutTooltips()が全ウィンドウで再適用されます。マクロのショートカットもMacro.<id>として同じ表に載るため、重複や「2 打鍵の起点に割り当ててしまった」といった問題が検出されます。
- キー判定の一元化: アプリ内のキー処理は
KeyBindings.Matches(actionId, key, modifiers)を通して判定するので、割り当てを変えたキーはどこでも効きます。ダイアログのEsc/Enterや標準的な移動など「固定でよいもの」だけは直接判定しており、割り当ては変えられません。 - エクスポート / インポート: Control Deck → ショートカットキー → エクスポートボタンで現在のバインドを JSON 化。JSON 構造は
[{ "ActionId": "Rename", "Key": "F2", "Modifiers": "None" }, ...]。インポートボタンで同形式を読み込み、既存バインドに上書き適用。 - 個別リセット: 各アクション行の「リセット」で既定値に戻す(該当行のみ
CustomKeyBindingsから除外)。 - ツールチップ併記: 各コマンドボタンのツールチップは自動的に現在のキー(例:
名前の変更 (F2))に更新されます。バインドが変更されるとUpdateShortcutTooltips()で全ツールチップが再描画。 - アクション定義:
KeyBindingService.RegisterDefaults()の登録が正。新アクション追加時は同メソッドにRegister(...)を足し、lang/*.jsonのキーを 10 言語分追加する。 - キーの体系(プリセット):
data/keymaps/*.jsonを 1 ファイル置くとプリセットが 1 つ増える。{ "actionId", "key", "modifiers", "key2", "modifiers2" }の形で、key2を省けば単打鍵、書けば 2 打鍵になる。 - キーが届かない操作を作らない: 画面から実行できるのにキーで届かない操作は、キーを割り当てないアクションとして登録し、コマンドパレット(
Ctrl+Shift+P)から名前で呼べるようにする。