Telescope PickA standalone desktop VS Code extension with a native popup for fuzzy filenames and fast text search. Selecting a result previews the file where your code is already open, in the original editor group. There is no bottom preview panel or picker webview. Try itRequires desktop VS Code 1.108 or newer for native file-icon theme support.
Current-file mode searches literal text without case sensitivity using the live document, including unsaved edits, untitled files, and files outside a workspace. It shows all matching lines with native file icons and source locations. Selection previews the exact line; Enter, split, and Escape behave like workspace content search. The target remains fixed while navigating, and Resume Picker restores the target URI, query and selection (unsaved contents must still exist in the editor). Workspace include/exclude/ignore settings do not restrict this explicitly chosen file. Editing the target refreshes results; chat and other documents do not. An open text editor is required. Current-file matches follow ascending source line order, not relevance ranking. Each row uses the same file label with its line number and code excerpt alongside it, preventing native Quick Pick label ranking from reordering the matches. Search File Contents uses the same ascending line order when all results belong to a single file. Multi-file searches retain their existing native ranking. Browse Git changesRun Telescope Picker: Browse Git Changes, use its Git compare button in the
picker, or click the Git changes icon in Git's Source Control title bar.
Assign your preferred shortcut through Telescope Picker: Configure Keyboard
Shortcuts; this command does not claim another default key combination.
The command ID remains All diff hunks appear immediately; no query is required. Use Up/Down to navigate changed sections, grouped by repository, change type, and file. Each row shows the Git hunk range, added/removed line counts, and a short code excerpt. Nearby edits share a hunk using Git's normal three context lines. Untracked text files appear as one whole-file addition. Pure renames, binary changes, empty files, and other metadata-only changes still have a navigation row even without text hunks. There is no 200-hunk limit. Optionally type to filter by filename/path or literal, case-insensitive text in changed lines. Clearing the input restores the full list. Invoking Browse Git Changes afresh clears a prior filter; Resume Picker retains it and the selected hunk.
Selection immediately previews VS Code's native diff editor at the changed section while keyboard focus stays in the picker. Moving between hunks in one file reuses its diff tab. Enter keeps the diff open as a normal pinned tab; Ctrl/Cmd+Enter opens it beside. Staged diffs show HEAD versus index, never the unstaged working tree. Additions and deletions use an empty side where needed. A deletion opens near its hunk on the modified side. Escape restores the previous editor, including an existing native diff tab. VS Code's existing Git and merge tools handle staging, discarding, and conflict resolution; the picker never changes Git state. This uses the built-in vscode.git API v1 for repositories, status updates, Git executable location, and historical document URIs. Git must be installed and the built-in extension enabled. Every repository registered with Source Control is listed, including multiple roots; repository/status changes refresh the active list. Folder filters for filename/workspace-content search do not filter Git results. Git's tracked/untracked status determines eligibility. Tracked-file patches use saved Git changes. Save edits first to include them; a dirty editor that no longer matches a result is explicitly rejected rather than opening a wrong line. Untracked live documents include unsaved edits. Binary changes are listed without text hunks and left to VS Code's native viewer. Git textconv and external diff programs are disabled. Git output and newly loaded untracked file text are bounded to 64 MiB per file; exceeding this is an explicit error, not silent truncation. Obsolete requests stop their child Git process and cannot publish stale results. Read/Git failures appear in the popup and Output; no-repository and clean-tree states are explicit. The native popup keeps input focus while the selected file appears in the current code editor behind it. Native VS Code syntax highlighting, language support, encoding, and unsaved document contents apply.
Configure your shortcutsRun Telescope Picker: Configure Keyboard Shortcuts to open VS Code's shortcut editor filtered to this extension. Change Find Files, Search File Contents, or Search Current File to your preferred keys; use Change Keybinding or Remove Keybinding to replace or disable a default. These are overridable defaults, not runtime-hardcoded keys. Changes take effect immediately without rebuilding or reloading. For text configuration, run Preferences: Open Keyboard Shortcuts (JSON).
Add entries to the existing array in your user
The example keys may override other VS Code commands; choose unused keys or
inspect conflicts in the shortcut editor. On macOS, remove the Include and exclude foldersConfigure Telescope Picker: Include and Telescope Picker: Exclude in VS Code Settings, or add this to your workspace settings:
Both settings apply to Find Files and Search File Contents, including dirty
open documents, and refresh an open picker when changed. An empty include list
means all eligible files; exclusions always win. Paths are relative to each
workspace root. A folder includes/excludes its descendants; glob examples include
Multi-root workspaces can override these resource-scoped settings per folder.
These filters narrow existing discovery rules; they do not re-include files
hidden by The original document is never edited, saved, or reverted by the extension. Dirty documents, existing tabs, and displaced background previews are preserved. An original unpinned preview is reopened as a preview on cancel, even if VS Code closed its document while replacing the tab. Preview uses normal editor tabs temporarily, unlike the earlier webview implementation. Temporary tabs created by the picker are cleaned on cancel; files you modify or pin are kept. If native preview tabs are disabled in your settings, extension-created clean tabs are still tracked and cleaned rather than accumulating. Files over 1 MiB that are not already open skip automatic preview and show the compact title Large file · Enter to open. Enter can still open them. Other preview/open failures use short status titles; full details are logged to Telescope Picker in Output rather than expanding the popup. Previews are normal VS Code editors, not artificially read-only documents. The popup keeps keyboard focus, but you can deliberately click the editor to edit. Such edits are preserved. Enter commits the file choice, not document changes. If no text editor was open, cancel closes the picker-created preview tabs and returns focus to the editor group. Other existing editor tabs are not closed. Telescope Picker: Resume Picker restores the last mode, query, and selected file/line. State is saved per workspace on close or acceptance. Opening an already-open picker reuses it. Native Quick Pick supplies accessibility, matching highlights, themes, fonts, and final result ordering. Fuzzysort pre-ranks filename results; text results include all matching lines; the native popup applies its query ranking. Remap shortcuts if another extension conflicts. File icons and grouped resultsFilename results use your currently active file-icon theme, resolved by
VS Code itself through the stable Content matches are grouped by file URI under non-selectable file headings
showing the relative path, workspace root, and visible match count.
Matching rows show the active theme's file icon and code excerpt, with
Non-selectable separators cannot display resource icons, so themed icons appear on matching rows, not the headings. Missing icons and resources use VS Code's own theme resolution and fallback behavior; there is no bundled replacement icon set. Native resource icon support became stable in VS Code 1.108, which is why 0.8.0 raises the minimum supported version. No custom DOM or private services are used. Fast text search inside filesStarting in 0.5.0, content search uses literal, case-insensitive text
instead of fuzzy subsequences. For example,
Discovery and preview behavior
Restricted workspaces and desktop URI-based remote workspaces are supported by design. Content search requires the packaged binary to match the extension host's OS/architecture. Separate native VSIX builds cover these targets:
For SSH, WSL, and containers, choose the remote extension host's OS and architecture, not the local desktop's, and install in that remote environment. Alpine/musl Linux, 32-bit hosts, and browser-hosted VS Code are not supported package targets. Non-filesystem content-search limitations apply above. SSH, WSL, containers, and real screen-reader workflows still need manual qualification. Windows has been tested locally; macOS/Linux qualification depends on successful native CI runs, not just producing a VSIX. Develop and validateUse Node.js 22.16 or newer. Open this directory as its own VS Code workspace.
Press F5 for an Extension Development Host. The original extension logo lives in Cross-platform packagesThe Test and package desktop platforms GitHub Actions workflow builds all six targets on matching native runners. Each job runs type checking, unit tests (including the real ripgrep backend), VS Code extension-host tests, and packaging. Linux extension-host tests use Xvfb. Download the separate VSIX artifacts from a successful workflow run; no Marketplace publication or GitHub release is automatic. Hosted ARM runners require a repository/account eligible for those GitHub runners. Locally, Run Unit tests cover relevance, discovery/cache, request generations, the native
popup, editor-preview cancellation/races, dirty documents, pinned/existing tabs,
preview-disabled settings, restoration, acceptance, and splitting. Content tests
exercise the actual packaged backend, cancellation, literal/Unicode matching,
uncapped searches beyond 32 MiB and 100,000 lines, binary/encoding handling,
ignore/exclude/sibling rules, overlapping roots, live text, progress,
invalidation, mode switching, resume, match highlights, and exact-line opening.
Icon/group tests verify native resource URIs and theme-icon references in both
modes, heading isolation, multi-root groups, keyboard navigation, escaped labels,
and complete result rendering beyond 200 matches independently of headings.
Extension-host tests run on VS Code 1.108.0 against an isolated two-root
workspace and exercise actual preview switching, dirty contents, original
selections/scroll restoration, temporary-tab cleanup, Enter pinning, resume,
opening beside, literal on-disk/unsaved text search, grouped navigation/resume,
switching between image- and font-based icon themes, and exact matching-line
acceptance. Set If npm 10.9.2 crashes resolving Vitest optional peers with an Performance baselineThe ranking benchmark uses 50,000 synthetic C++ paths over 250 directories and 100 warm queries. On Windows x64, AMD Ryzen 7 7700X, 63 GiB reported RAM, Node 22.16.0, the v0.2 baseline was approximately 18 ms p50 / 29 ms p95. It verifies that every filename match is returned and fails above the 50 ms ranking p95 target. The historical v0.2 figures above used a 200-result limit and are not an unlimited-result performance measurement. With unlimited filename results on the same machine, a 100-query run over 50,000 paths measured approximately 59 ms p50 / 178 ms p95 (Node 22.16.0). This exceeds the 50 ms target, so the benchmark currently exits unsuccessfully for unlimited results. Popup rendering and IPC add further cost; all results are returned rather than silently restoring a cap. Immutable fuzzysort snapshots avoid per-candidate custom scoring costs. The literal-content regression test uses a 34 MiB UTF-8 file, over 100,000 nonmatching lines and 205 matching lines. On the same Windows x64 machine, five complete provider searches took 76, 47, 47, 51, and 47 ms, including process startup and result processing. The test enforces a 500 ms ceiling per run on this fixture. These are sparse-query measurements, not a guarantee for every workspace, and exclude input debounce, popup rendering and preview loading. These figures exclude native popup rendering, IPC, discovery, document loading, and editor activation. Opening within 150 ms and end-to-end visible updates within 50 ms remain acceptance targets, not verified promises. Boundaries and next work
Regex/replace, open-editor/recent-file providers, symbols, Git operations, and plugins are not implemented. Literal text search keeps the popup/preview workflow; it is not a full replacement for VS Code's Find in Files. |