(keymap-duplicates)= # 削除したはずのPMEキーマップが残り続ける(重複・ゴーストキーマップ) ```{important} - 「削除したはずのPMEキーマップが、Blender再起動後に戻ってくる」 - 「PMEをアンインストールしたのに、空のPMEエントリが残っている」 - 「Keymap設定に `Call Menu (PME)` が何重にも並んでいる」 これらの症状は**PME単独の不具合ではなく、BlenderのKeymap Export/Importが層構造を 潰すという上流の仕様**が原因で起きます。キーマップを多く登録する性質上、PMEで 表面化しやすくなっています。 掃除したいだけなら [復旧](#keymap-duplicates-recovery) を、再発を避けるには [予防](#keymap-duplicates-prevention) を参照してください。 ``` ## こんな症状はありませんか? 次のいずれかに当てはまる場合、このページが扱う現象です。 - **Preferences > Keymap** を開くと、同じホットキーの `Call Menu (PME)` が何行も並んでいる - 重複行を手で削除しても、**Blender再起動後または設定保存時に復活する** - **PMEアドオン自体を無効化・削除しても、空のPMEエントリが残り続ける** - キーマップを触った覚えがないのに、**他のアドオン・標準機能のホットキーがPMEに奪われたように動かなくなった** - Keymap Editorで、パイメニュー名などの情報が空欄になっている「空のPMEエントリ」がある コミュニティでは "ghost keymaps" と呼ばれ、長く議論されてきた現象です。 ## これはPME固有の不具合ではありません 同じ仕組みでキーマップを登録するアドオンなら同様に起きうる、**Blender側の キーマップシステムの設計に由来する問題**です。PMEはパイメニュー・ポップアップなど 多数のキーマップを扱うため、他のアドオンより症状が目立ちやすくなっています。 ## なぜ起きるのか ### BlenderのKeymapは4層構造 BlenderはKeymapを4つの層で管理しています。 :::{list-table} :header-rows: 1 :widths: 18 52 15 * - 層 - 役割 - 保存される? * - **default** - 工場出荷時の設定(リセット時の復元先) - — * - **active** - 現在のプリセット(`userpref.blend` に保存) - ✅ * - **addon** - アドオンが登録するキーマップ。Blender起動ごとに再構築される - — * - **user** - UIに見えるもの = active + addon を合成した結果。
ユーザー編集は**差分**として保存され、起動時に再合成される - (差分のみ) ::: この層構造があるからこそ、「アドオンのキーマップ」「ユーザーのカスタマイズ」 「工場出荷状態へのリセット」を共存させられます。 ### Export/Importがこの層構造を潰す `Preferences > Keymap` の **Export Key Configuration** / **Import Key Configuration**、 および **Save as Preset**(プリセット保存)を実行すると、Blender は内部的に次の処理を行います。 1. **user**層で **どれか1つでも編集されているKeyMap**(`km.is_user_modified = True`)を ピックアップする 2. そのKeyMapに含まれる**すべての項目をコピー**する(アドオン由来の項目も区別なく) 3. コピーを **active**層に焼き付ける 問題は **2** です。フラグはKeyMap単位で立つので、**たった1つのキーを編集しただけで、 そのKeyMap内のアドオン登録項目もまとめて「ユーザー設定」として保存**されてしまいます。 ### 再起動のたびに重複が積み上がる アドオン(PMEを含む)は、Blender起動時に自分のキーマップを **addon**層に登録し直します。 しかし上の手順で焼き付けられたコピーは、すでに **active**層に残っています。 結果として同じキーマップ項目が `active` と `addon` の**両方に存在**し、 `user` 層の見た目で**重複**として現れます。Export/Import やプリセット切り替えを繰り返すと、 この重複がさらに積み重なります。 ### ゴースト(空の項目)はなぜ消せないのか PMEは自分で登録したキーマップを削除するとき、`idname` とプロパティ値の組み合わせで 対象を識別しています。ところがExport/Importを経由すると、**プロパティ情報が欠落して `is_property_set()` が機能しない項目**が生まれることがあります。 この状態になると、PMEはその項目を「自分が登録したもの」と認識できず、自動削除の対象に なりません。これが「PMEアドオンを外してもゴーストだけが残る」理由です。 (keymap-duplicates-recovery)= ## 復旧 ### ステップ1: Keymap Doctor でスキャンする **Preferences > Settings > Hotkeys** の **Keymap Doctor** では、空のPMEキーマップ項目、 `active` keyconfig に混入した PME 項目、PME Hotkey と現在有効な Blender キーマップとの 競合を観測できます。 まずは **Scan Keymaps** を実行してください。 検出結果は次のように表示されます。 - 空のPME項目の総数 - 影響を受けているキーマップ数 - どの layer に存在するか - 件数が多いキーマップ名 - `active` keyconfig に PME 項目が存在するか - 同じキーマップ内で競合する Hotkey と相手の operator - PME dispatcher が Hotkey Mode・CHORD・mouse modifier で振り分ける重複の件数 - 判定を完了できなかった Hotkey の件数 必要なら **Copy Summary** で匿名化済みの概要をクリップボードへコピーし、 **Open Report Folder** でローカル詳細レポートの保存場所を開けます。詳細レポートには メニュー名や内部識別情報が含まれるため、外部へ共有する前に内容を確認してください。 スキャンは観測専用です。検出した Hotkey の割り当てや競合相手を自動的に変更・削除しません。 ```{important} 問題の切り分けに役立つので、可能なら **Clean Up Empty Items** を押す前に **Copy Summary** の内容を support / forum へ提出してください。詳細レポートが必要な場合は、 内容を確認したうえで共有してください。 ``` ### ステップ2: `Clean Up Empty Items` で削除する スキャン結果で空のPME項目が見つかったら、**Clean Up Empty Items** を実行します。 この操作は、**プロパティが空だと断言できる `wm.pme_user_pie_menu_call` 項目だけ**を 保守的に削除します。通常のPMEホットキーや、意味の読み取れる項目までは触れません。 過去の事例では、1回の cleanup で**279件**の空PME項目が削除された報告があります。 症状が軽いうちは数件、放置した環境では数百件になることがあります。 ### ステップ3: 変更を定着させる cleanup で削除した結果は、**保存しないと再起動時に戻ってくる**ことがあります。 まずは次を試してください。 - **Preferences** > 左下のハンバーガーメニュー > **Save Preferences** これで定着すれば完了です。 ```{caution} もし Save Preferences では再起動時に元に戻ってしまう場合、ユーザー報告では **一度だけ Export → Import を行う**ことで定着したケースがあります。 ただし Export/Import はこの問題の**原因でもある**ので、掃除直後のワンショットに 限定し、以降は使わないでください。 ``` ### ステップ4: それでも解決しないとき 重複が深く絡み合っている場合、設定フォルダをクリーンにする方が早いことがあります。 1. PMEの設定をPME側のエクスポート機能でバックアップする 2. Blenderを終了する 3. Blenderの **config** フォルダを別名に退避(またはバックアップしてから削除) 4. Blenderを起動してクリーン状態から再セットアップ 5. 必要な設定をインポートし直す 設定フォルダの場所は、`File > Defaults > Show Preferences Location` などで確認できます。 ### 古いPMEを使っている場合: legacy script を使う PME にまだ Maintenance セクションが無い版では、以前の救済スクリプト `pme_keymap_cleaner.py` を使う方法があります。 - このスクリプトは PME 内部ユーティリティを使うため、**PMEがインストール・有効化されている 状態で実行**してください。PMEを先にアンインストールしてしまった場合は、一度再インストール してから実行する必要があります。 (keymap-duplicates-prevention)= ## 予防 一度掃除したら、再発させないための運用に切り替えるのが重要です。 ### 1. BlenderのKeymap Export/Importを原則使わない 最大の予防策は、**Blender標準の Keymap Export / Import を使わない**ことです。 **Save as Preset**(プリセット保存)も同じ仕組みで動作するため、同様に避けてください。 一度実行すると、以降の起動ごとに重複が発生し続ける可能性があります。 ### 2. どうしてもエクスポートしたいとき: アドオンを一時的に無効化する 環境の引っ越しなどで本当にKeymapをエクスポートしたい場合は、**PMEと、キーマップを 登録する他のアドオンを一時的に無効化してから**エクスポートしてください。 こうすることで、アドオン由来のキーマップが `active` 層に焼き付くのを防げます。 インポート先でも同様に、アドオンを有効化する前にインポートしてください。 ### 3. PMEのマクロを「ショートカット管理の窓口」にする 作者が推奨する運用として、**PMEのマクロ機能を代理キーマップ(Proxy Keymap)として 使う**方法があります。 - Blender標準のKeymapを直接編集するのではなく、**PMEのマクロとしてショートカットを定義**する - そのマクロに PME 側でホットキーを割り当てる - Blenderの Keymap 設定はほとんど触らないまま運用する この運用にすると、環境を移行するときも **PMEの設定だけをエクスポート**すれば 済むため、Blender側のKeymap Export/Importを回避できます。 ```{note} 代理キーマップは PME の処理が挟まるので、呼び出しごとに微小なオーバーヘッドが 発生します。パフォーマンスが厳しい操作には、カスタムアドオンとして実装するなど 別の手段を検討してください。 ``` ### 4. アドオンのホットキーをUIから削除しない これは別の落とし穴ですが、同じ文脈でよく踏まれるので記載します。 Keymap Editorからアドオン登録のホットキーを削除すると、Blenderは**「削除した」 という差分を永続保存**します。 このため、次のような不思議な現象が起きます。 1. アドオンが同じホットキーを3つ登録 2. UIから3つとも削除する 3. Blender再起動 4. アドオンが同じホットキーを3つ登録 — **どれもKeymap Editorに現れない**(削除差分が残っているため) 5. 同じホットキーを4つ目として登録 — ようやく現れる 不要なアドオンホットキーは**削除せず、チェックを外して無効化**するのが安全です。 ## 関連 - [キーマップの選び方](keymap_guide.md) — Keymapの選び方と探索順の基本 - [`pme_keymap_cleaner.py` (Gist)](https://gist.github.com/Pluglug/d4246140ab5689373becc11d5353221a)