add quick-open fuzzy file finder (Ctrl/Cmd+P)

A file picker overlay over the whole workspace, distinct from the
command palette. QuickOpenController holds the file list + a
subsequence fuzzy filter; the overlay loads the list via files.walk on
open, shows RecentFilesService entries on an empty query, and opens the
selection through a shared openWorkspaceFile helper (.md → markdown
reader bus, else editor.open) that the files panel now also routes
through, so recents stay in sync from every open site.

Bound to ctrl+p / meta+p with `when: !palette.open` so it never
collides with the palette's ctrl+p navigation; in-overlay arrows/enter/
escape reuse the palette's keymap-driven model via quickOpen.* intents.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-31 20:19:21 +02:00
co-authored by Claude Opus 4.8
parent d7be5535d5
commit 0c7a6e86d5
16 changed files with 865 additions and 22 deletions
+27
View File
@@ -54,6 +54,29 @@ class PaletteAcceptIntent extends Intent {
const PaletteAcceptIntent();
}
// -- Quick open -------------------------------------------------------------
/// Open the quick-open file finder (fuzzy file picker), distinct from
/// the command palette.
class QuickOpenIntent extends Intent {
const QuickOpenIntent();
}
/// Highlight the next quick-open result.
class QuickOpenSelectNextIntent extends Intent {
const QuickOpenSelectNextIntent();
}
/// Highlight the previous quick-open result.
class QuickOpenSelectPreviousIntent extends Intent {
const QuickOpenSelectPreviousIntent();
}
/// Open the highlighted quick-open result.
class QuickOpenAcceptIntent extends Intent {
const QuickOpenAcceptIntent();
}
// -- Text scale -------------------------------------------------------------
class TextScaleIncreaseIntent extends Intent {
@@ -95,6 +118,10 @@ final Map<String, Intent Function()> builtinIntents = {
'palette.selectNext': () => const PaletteSelectNextIntent(),
'palette.selectPrevious': () => const PaletteSelectPreviousIntent(),
'palette.accept': () => const PaletteAcceptIntent(),
'quickOpen.open': () => const QuickOpenIntent(),
'quickOpen.selectNext': () => const QuickOpenSelectNextIntent(),
'quickOpen.selectPrevious': () => const QuickOpenSelectPreviousIntent(),
'quickOpen.accept': () => const QuickOpenAcceptIntent(),
'text.scaleIncrease': () => const TextScaleIncreaseIntent(),
'text.scaleDecrease': () => const TextScaleDecreaseIntent(),
'text.scaleReset': () => const TextScaleResetIntent(),