> [!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 の非公開内部に依存するため、将来的な仕様変更で壊れるリスクあり。