> [!left-bubble] ![[chappy.webp]] **[[チャッピー]]** > やりとりした内容を簡潔にまとめてみたよ。 ## 目的と背景 - プレビュー中のチラつき(ダイアログを閉じた直後に別ファイルが一瞬見える)を解消したい。 - プレビューで開いたファイルを「最近開いたファイル」に載せたくない。 - ただし履歴(戻る/進む)や recent の自然さは維持したい。 ## 対象範囲 - AnotherQuickSwitcherModal - BacklinkModal - GrepModal - 共通処理は AbstractSuggestionModal に寄せた。 ## 議論と試行の経緯 ### 1) チラつきの原因と履歴スタック問題 - 事象: プレビュー後に決定すると「ダイアログを開く直前のファイル」が一瞬表示される。 - 初期案: `onClose` の restore をスキップするとチラつきが減る。 - 問題: restore をスキップすると履歴が消え、戻る挙動が壊れる(Aが消える)。 - 対応: 非公開 API の `leaf.history` を直接パッチして、pre-dialog の履歴を保持。 - `backHistory` の末尾に pre-dialog の entry を入れ直す。 - `skipRestoreOnClose` と組み合わせてチラつきを抑えつつ back を維持。 ### 2) "show links/backlinks" での履歴上書き - 事象: AQS 内で show links/backlinks に遷移すると、プレビューで変化した履歴が新モーダルにキャプチャされてしまう。 - 対応: `AnotherQuickSwitcherModal` に `historySnapshot` を引き継げる optional 引数を追加。 - 新しいモーダルが「プレビュー済みの履歴」をキャプチャしないようにした。 ### 3) recent(getLastOpenFiles)汚染の対応 - 事象: プレビューしただけのファイルが recent に入る。 - ESC で閉じたときに「最後のプレビュー」が recent に残る。 - 試行A: recent からプレビュー項目を削除。 - 問題: 以前に開いたことがあるファイルまで recent から消えてしまう。 - 試行B: `recentFileTracker.onFileOpen` をフックして抑制。 - 問題: Obsidian 側のハンドラと噛み合わず、AQS以外の recent 更新まで壊れた。 - 最終方針: recent の **スナップショット復元**。 - `recentFileTracker.lastOpenFiles` を開く前にコピーし、プレビュー後に復元。 - Obsidian 側の更新が後から走るため、復元は rAF + setTimeout で遅延。 - 決定時は「決定ファイル → ダイアログ前のファイル → その他」の順に再構成。 - ESC ではスナップショットを復元して、最後のプレビューが残らないようにする。 ## 現在の挙動(意図) - プレビュー(keepOpen=true): - recent は pre-dialog のスナップショットに戻る。 - ESC で閉じる: - recent は pre-dialog のスナップショットに戻る。 - プレビュー後に決定: - recent は「決定ファイル → ダイアログ前のファイル → 残り」になる。 ## 実装メモ - 非公開 API を使用: - `leaf.history`(backHistory/forwardHistory) - `workspace.recentFileTracker.lastOpenFiles` - AbstractSuggestionModal の共通ヘルパー: - `scheduleRecentHistoryRestore(snapshot)` - `buildRecentHistoryForFinalOpen(snapshot, basePath, finalPath)` - 各モーダルが持つ状態: - `historySnapshot`(leaf.history 用) - `recentHistorySnapshot`(recent 用) - `recentHistoryBaseFilePath`(ダイアログ開始時のアクティブファイル) - `skipRestoreOnClose` / `skipRecentHistoryRestoreOnClose`(復元タイミング制御) ## 触ったファイル - `src/app-helper.ts` - `createLeafHistorySnapshot` / `restoreLeafHistorySnapshot` - `captureLastOpenFilesSnapshot` / `restoreLastOpenFilesSnapshot` - `src/ui/AbstractSuggestionModal.ts` - recent 復元の共通ユーティリティ - `src/ui/AnotherQuickSwitcherModal.ts` - `src/ui/BacklinkModal.ts` - `src/ui/GrepModal.ts` ## 注意点/リスク - recent のスナップショット復元は、ダイアログ中に他プラグインが recent を更新した場合に上書きする可能性がある。 - いずれも Obsidian の非公開内部に依存するため、将来的な仕様変更で壊れるリスクあり。