Skip to content

feat(explorer): search loaded folders with / - #1470

Merged
eugenioenko merged 1 commit into
mainfrom
feat/explorer-search-folders
Nov 10, 2026
Merged

eugenioenko merged 1 commit into
mainfrom
feat/explorer-search-folders

Conversation

@eugenioenko

@eugenioenko eugenioenko commented Nov 9, 2026 •

Copy link
Copy Markdown
Owner

Adds Search in Folders to the Explorer More menu and explorer.find to the palette. Pressing / in the Explorer opens and focuses a Search-style input with a chevron, divider, and clear/close action.

Case-insensitive substring filtering searches materialized file and folder names across all roots, keeps ancestors visible, and preserves expansion state. It never walks unopened directories. asynctask debounces rebuilding the tree on the UI thread using search.debounce; clearing cancels pending work immediately. Up/Down skip context-only ancestors, Enter applies any pending query before opening the selection, and Esc or ✕ clears and hides the input.

Closes #1460.

Validation

  • make test and make lint pass.
  • go test -race ./internal/ui ./internal/widgets ./tests/e2e -run 'TestExplorerSearch|TestTreeFilter' passes.
  • Explorer search, navigation, reveal, and rename functional suites: 16 tests passed.
  • Added deterministic coverage for lazy/multi-root trees, compact folders, expansion preservation, refreshes, Unicode and case-insensitive matching, ancestor-skipping navigation, empty results, stale debounce delivery, immediate clearing, pending-query Enter, More-menu and slash focus, and click coordinates below the input.
  • A real-binary functional test verifies debounced results delivered through the live event loop.
  • Benchmark: filtering 100,000 loaded entries takes approximately 12 ms on a Ryzen 7 6800H, excluding rendering and the debounce delay.

Before / after

Explorer excerpts from bin/ttt --size 100x28 --exec '…; screenshot …; quit'.

Before:

╭──────────────────────────────╮
│ Explore  Find  Changes  »  ⋮ │
│──────────────────────────────│
│⌄ workspace                   │
│  alpha.txt                   │
│  beta.txt                    │
│  gamma.txt                   │

After pressing / and entering beta:

╭──────────────────────────────╮
│ Explore  Find  Changes  »  ⋮ │
│──────────────────────────────│
│ ❯ beta                     ✕ │
│──────────────────────────────│
│⌄ workspace                   │
│  beta.txt                    │

Summary by CodeRabbit

  • New Features
    • Search loaded file and folder names across workspace roots from the Explorer using / or Search in Folders.
    • Matching items and their parent folders remain visible without expanding folders. Navigate matches with Up/Down and open the selection with Enter.
    • Clear and hide search with Esc or the close button. Use quick open to search the entire workspace.
  • Documentation
    • Clarified Explorer search behavior and the search debounce setting, which applies to both Explorer filtering and global search.

@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Binaries

Built from 564a54734717. Links expire on Nov 23, 2026.

Platform Download
Linux x64 ttt-pr-1470-linux-amd64
macOS Apple Silicon ttt-pr-1470-darwin-arm64
macOS Intel ttt-pr-1470-darwin-amd64
Windows x64 ttt-pr-1470-windows-amd64

Downloads need a GitHub sign-in and arrive as zips. On Linux and macOS, run chmod +x ttt after unzipping. These binaries run this pull request's code, so only run them if you trust it.

@coderabbitai

coderabbitai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

The Explorer now filters loaded file and folder names across workspace roots. The search UI supports match navigation and opening, and integrates with Explorer commands and the configured search debounce setting.

Changes: Explorer search

Layer / File(s) Summary
Tree filtering
internal/widgets/tree.go, internal/widgets/tree_filter_test.go
Tree filtering shows matching loaded nodes and their parent folders without changing expansion state or triggering lazy loading. Tests cover filtering, appending nodes, model refresh, and clearing the filter.
Search input and navigation
internal/ui/explorer_search_widget.go, internal/ui/explorer_search_widget_test.go, internal/ui/explorer_search_bench_test.go
The search widget adds debounced, case-insensitive filtering, match navigation, and Enter activation. Tests cover debounce behavior, stale results, Unicode matches, and empty results; a benchmark measures search input updates across tree sizes.
Explorer integration and documentation
internal/app/..., internal/i18n/en.json, tests/e2e/explorer_search_test.go, tests/functional/explorer-search.test.js, README.md, docs-web/src/content/docs/...
Explorer commands, the More menu, keyboard help, and settings now expose or configure search. App and end-to-end tests cover search entry, filtering, opening matches, and clearing the filter. Documentation describes the workflow and debounce setting.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature · Severity of issue fixed: Low

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ExplorerSearchWidget
  participant TreeWidget
  User->>ExplorerSearchWidget: Enter a search query
  ExplorerSearchWidget->>TreeWidget: Apply a node filter
  TreeWidget-->>ExplorerSearchWidget: Return filtered rows
  ExplorerSearchWidget-->>User: Render matching rows
Loading

Suggested reviewers: simonocampo1, huskyhao

Merge Risk: Minimal · up to 564a5

This change adds Explorer folder search with a debounce setting. No merge-blocking risk was identified in the supplied evidence.

Pre-merge checks: Passed 4

Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title "feat(explorer): search loaded folders with /" matches the main change. The PR adds a / shortcut and a Search in Folders command that filter already-loaded file and folder names in the Exp…
Linked Issues check Passed Directly linked issue #1460 has coding requirements only. The non-coding remark about testing on Windows and Linux does not apply. Requirement mapping, based on the PR summary and the listed changed f…
Out of Scope Changes check Passed Every changed file in the summary relates to the #1460 feature or to its tests and documentation:

- Feature code: internal/ui/explorer_search_widget.go, internal/widgets/tree.go (SetFilter, AppendIte…
Full details: Title check

Explanation

The title "feat(explorer): search loaded folders with /" matches the main change. The PR adds a / shortcut and a Search in Folders command that filter already-loaded file and folder names in the Explorer tree, keeping parent folders visible. The title is short, specific, and uses a conventional commit prefix. It omits the Esc, navigation, and debounce details, which the PR does not need to cover in a title.

Full details: Linked Issues check

Explanation

Directly linked issue #1460 has coding requirements only. The non-coding remark about testing on Windows and Linux does not apply. Requirement mapping, based on the PR summary and the listed changed files:

  1. [#1460] / opens a filter input at the top of the tree. The explorer.find command and the More-menu item "Search in Folders" open the same input (internal/app/commands_explorer.go, internal/app/callbacks.go, internal/ui/explorer_search_widget.go). Slash-focus and More-menu behavior are covered by tests/e2e/explorer_search_test.go.
  2. [#1460] Nonmatching rows are hidden and parent folders stay visible. TreeWidget.SetFilter in internal/widgets/tree.go retains matches and their ancestors. internal/widgets/tree_filter_test.go covers this.
  3. [#1460] Up/Down move through matches. ExplorerSearchWidget skips context-only ancestors. TestExplorerSearchNavigationSkipsAncestorsAndEmptyResults covers this.
  4. [#1460] Enter opens the selected file. Enter applies any pending debounced query first. TestExplorerSearchEnterAppliesPendingQueryBeforeOpening and the e2e opening test cover this.
  5. [#1460] Esc clears the filter and hides the input. The e2e Escape test restores the full tree. The clear action (✕) is covered by the e2e tests.
  6. [#1460] The filter covers only loaded folders. It reads materialized nodes and does not walk unopened directories. TestExplorerSearchUsesLoadedNodesAcrossRoots checks that an unloaded folder is neither loaded nor expanded by search.

The automated tests named above are present in the changed file list. The author reports that they pass. This assessment did not re-run them. No unmet coding requirement is identified.

Full details: Out of Scope Changes check

Explanation

Every changed file in the summary relates to the #1460 feature or to its tests and documentation:

  • Feature code: internal/ui/explorer_search_widget.go, internal/widgets/tree.go (SetFilter, AppendItem filter handling), internal/app/explorer.go (widget wiring), internal/app/commands_explorer.go (explorer.find and debounce task).
  • Wiring: internal/app/callbacks.go (More-menu item), internal/app/commands_help.go (shortcut help), internal/app/commands_settings.go and internal/app/widgets.go (search.debounce applied to the Explorer search widget), internal/i18n/en.json (new labels).
  • Documentation: README.md, docs-web workspaces guide, and the search.debounce reference. The settings reference now states that the debounce applies to Explorer filter input, which matches the implementation.
  • Tests and benchmark: internal/ui/explorer_search_widget_test.go, internal/widgets/tree_filter_test.go, internal/app/explorer_search_test.go, internal/ui/explorer_search_bench_test.go, tests/e2e/explorer_search_test.go, tests/functional/explorer-search.test.js.

The summary shows no unrelated refactoring or feature work. The changes to tree.go and the search.debounce setting extend existing behavior only for this feature. Limitation: this assessment relied on the PR summary and file list. It did not read each diff hunk.

Finishing Touches

Generate docstrings

  • Commit to this branch
  • Create a new PR
Generate unit tests (beta)

  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between b51ae98 and 564a547.

Files selected for processing: 18

  • README.md
  • docs-web/src/content/docs/guides/workspaces.md
  • docs-web/src/content/docs/reference/settings.md
  • internal/app/callbacks.go
  • internal/app/commands_explorer.go
  • internal/app/commands_help.go
  • internal/app/commands_settings.go
  • internal/app/explorer.go
  • internal/app/explorer_search_test.go
  • internal/app/widgets.go
  • internal/i18n/en.json
  • internal/ui/explorer_search_bench_test.go
  • internal/ui/explorer_search_widget.go
  • internal/ui/explorer_search_widget_test.go
  • internal/widgets/tree.go
  • internal/widgets/tree_filter_test.go
  • tests/e2e/explorer_search_test.go
  • tests/functional/explorer-search.test.js

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 0 remain after this review.

@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown
Contributor

Binary size

Comparing b51ae983e0f6 (base) with 564a54734717 (PR). Threshold: 256 KB.

Target Base PR Delta %
linux/amd64 18.15 MB 18.17 MB +20 KB 0.1%
darwin/amd64 18.55 MB 18.57 MB +21 KB 0.1%
darwin/arm64 17.36 MB 17.38 MB +17 KB 0.1%
windows/amd64 18.65 MB 18.68 MB +21 KB 0.1%

@github-actions

github-actions Bot commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Editor, diff, and log benchmarks

Comparing b51ae983e0f6 with 564a54734717 on the same runner: fastest of 3 alternating passes at 5x each, -short (2,000-line large file).

Allocated bytes measure total allocation per operation, not peak or retained RAM.

Logs are opened by each side's built ttt binary, 1x per pass, timed from launch until the first frame shows the log; _wrap rows start with word wrap on, and _edit opens a log committed to git, types a character, and moves down 20 lines. Time includes process startup, so the 1 MiB case is mostly startup; peak RSS is the process's maximum resident memory. The 1, 128, and 256 MiB fixtures are generated once outside timing and shared across both checkouts, so reads may use the OS file cache.

Code files open a 64 MiB Go file, this repository's sources repeated, with LSP and the git gutter off; _type also types 20 characters and _enter presses Enter 10 times before quitting.

Editor

Geometric-mean change: time -0.5%, allocated bytes +1.1%, allocations +0.9%.

Click here to see benchmark details
Benchmark Base PR Time change Base allocs PR allocs Allocation change
go/redraw 343 µs 346 µs +1.0% 31 32 +3.2%
go/cursor_down 357 µs 356 µs -0.2% 32 33 +3.1%
go/page_down 1.8 ms 1.7 ms -5.4% 3010 3012 +0.1%
go/wheel_scroll 585 µs 581 µs -0.6% 1503 1504 +0.1%
go/type_and_delete 690 µs 688 µs -0.3% 92 94 +2.2%
go/open_large_first 10.4 ms 10.3 ms -1.2% 48361 48362 0.0%
go/open_large 2.3 ms 2.3 ms +1.1% 2590 2593 +0.1%
go/jump_to_end_large 8.2 ms 8.1 ms -0.9% 11076 11078 0.0%
go/redraw_git_changes_large 399 µs 397 µs -0.4% 83 84 +1.2%
go/wheel_scroll_git_changes_large 655 µs 644 µs -1.6% 1566 1568 +0.1%
go/type_and_delete_git_changes_large 819 µs 813 µs -0.7% 207 209 +1.0%
go/edit_top_view_end_large 1.3 ms 1.3 ms +4.2% 2801 2804 +0.1%
ts/redraw 348 µs 345 µs -0.9% 33 34 +3.0%
ts/cursor_down 358 µs 355 µs -1.0% 33 34 +3.0%
ts/page_down 4.5 ms 4.5 ms -0.3% 13513 13514 0.0%
ts/wheel_scroll 2.3 ms 2.3 ms +0.2% 12033 12033 0.0%
ts/type_and_delete 712 µs 716 µs +0.5% 104 106 +1.9%
ts/open_large_first 34.4 ms 35.6 ms +3.4% 204592 204592 0.0%
ts/open_large 3.5 ms 3.2 ms -7.5% 3865 3863 -0.1%
ts/jump_to_end_large 24.0 ms 24.0 ms -0.3% 62311 62311 0.0%
ts/edit_top_view_end_large 1.4 ms 1.4 ms +1.0% 3399 3402 +0.1%
cpp/redraw 358 µs 362 µs +1.2% 32 33 +3.1%
cpp/cursor_down 364 µs 364 µs -0.1% 33 34 +3.0%
cpp/page_down 6.5 ms 6.6 ms +1.8% 7941 7942 0.0%
cpp/wheel_scroll 1.4 ms 1.4 ms +0.5% 1978 1980 +0.1%
cpp/type_and_delete 735 µs 737 µs +0.3% 104 106 +1.9%
cpp/open_large_first 228.8 ms 231.5 ms +1.2% 1386858 1386864 0.0%
cpp/open_large 7.0 ms 7.0 ms +0.2% 5292 5292 0.0%
cpp/jump_to_end_large 47.2 ms 45.8 ms -3.1% 63499 63505 0.0%
cpp/type_while_catching_up_large 959 µs 955 µs -0.4% 129 131 +1.6%
cpp/edit_top_view_end_large 1.5 ms 1.6 ms +1.3% 4334 4337 +0.1%
python/redraw 350 µs 347 µs -0.7% 33 34 +3.0%
python/cursor_down 359 µs 361 µs +0.6% 33 34 +3.0%
python/page_down 2.5 ms 2.2 ms -12.7% 3426 3426 0.0%
python/wheel_scroll 673 µs 674 µs +0.1% 1827 1828 +0.1%
python/type_and_delete 737 µs 737 µs 0.0% 103 106 +2.9%
python/open_large_first 10.2 ms 10.2 ms +0.5% 45989 45989 0.0%
python/open_large 2.8 ms 2.8 ms +1.9% 3616 3617 0.0%
python/jump_to_end_large 13.0 ms 13.1 ms +0.6% 12854 12854 0.0%
python/edit_top_view_end_large 1.4 ms 1.4 ms -0.5% 4248 4251 +0.1%
Benchmark Base allocated bytes PR allocated bytes Change
go/redraw 1497 B 1561 B +4.3%
go/cursor_down 1561 B 1625 B +4.1%
go/page_down 340683 B 340820 B 0.0%
go/wheel_scroll 111840 B 111904 B +0.1%
go/type_and_delete 4601 B 4729 B +2.8%
go/open_large_first 5.8 MiB 5.8 MiB 0.0%
go/open_large 455321 B 455526 B 0.0%
go/jump_to_end_large 1.5 MiB 1.5 MiB 0.0%
go/redraw_git_changes_large 12585 B 12649 B +0.5%
go/wheel_scroll_git_changes_large 123310 B 123507 B +0.2%
go/type_and_delete_git_changes_large 28596 B 28724 B +0.4%
go/edit_top_view_end_large 134587 B 134779 B +0.1%
ts/redraw 1769 B 1833 B +3.6%
ts/cursor_down 1696 B 1760 B +3.8%
ts/page_down 1.3 MiB 1.3 MiB 0.0%
ts/wheel_scroll 1.0 MiB 1.0 MiB 0.0%
ts/type_and_delete 6385 B 6513 B +2.0%
ts/open_large_first 19.7 MiB 19.6 MiB -0.1%
ts/open_large 518108 B 517988 B 0.0%
ts/jump_to_end_large 6.0 MiB 6.0 MiB 0.0%
ts/edit_top_view_end_large 166708 B 166884 B +0.1%
cpp/redraw 1520 B 1584 B +4.2%
cpp/cursor_down 1584 B 1648 B +4.0%
cpp/page_down 875913 B 876054 B 0.0%
cpp/wheel_scroll 155225 B 155760 B +0.3%
cpp/type_and_delete 5360 B 5488 B +2.4%
cpp/open_large_first 149.4 MiB 149.4 MiB 0.0%
cpp/open_large 711030 B 710358 B -0.1%
cpp/jump_to_end_large 8.5 MiB 8.5 MiB +0.1%
cpp/type_while_catching_up_large 9448 B 9576 B +1.4%
cpp/edit_top_view_end_large 253849 B 254041 B +0.1%
python/redraw 1760 B 1824 B +3.6%
python/cursor_down 1628 B 1692 B +3.9%
python/page_down 282352 B 282244 B 0.0%
python/wheel_scroll 100044 B 100108 B +0.1%
python/type_and_delete 6739 B 6883 B +2.1%
python/open_large_first 5.2 MiB 5.2 MiB +0.1%
python/open_large 516576 B 516640 B 0.0%
python/jump_to_end_large 1.3 MiB 1.3 MiB -0.1%
python/edit_top_view_end_large 210118 B 210310 B +0.1%

Diff views

Geometric-mean change: time +0.2%, allocated bytes +0.5%, allocations +0.4%.

Click here to see benchmark details
Benchmark Base PR Time change Base allocs PR allocs Allocation change
go/split/redraw 373 µs 374 µs +0.3% 38 39 +2.6%
go/split/wheel_scroll 783 µs 730 µs -6.7% 2790 2792 +0.1%
go/split/type_and_delete 745 µs 762 µs +2.3% 123 125 +1.6%
go/split/enter_and_backspace 1.1 ms 1.3 ms +20.0% 2085 2087 +0.1%
go/split/page_down 2.0 ms 1.8 ms -8.9% 4245 4244 0.0%
go/split/open_large 4.4 ms 4.4 ms -1.2% 14234 14233 0.0%
go/split/open_large_full_file 5.0 ms 4.9 ms -1.1% 13951 13953 0.0%
go/split/jump_to_end_large 2.6 ms 2.6 ms +0.3% 5003 5003 0.0%
go/split/expand_gap 885 µs 881 µs -0.5% 3237 3238 0.0%
go/unified/redraw 353 µs 356 µs +0.7% 33 34 +3.0%
go/unified/wheel_scroll 610 µs 603 µs -1.3% 1524 1525 +0.1%
go/unified/type_and_delete 687 µs 699 µs +1.8% 113 115 +1.8%
go/unified/page_down 1.8 ms 1.7 ms -1.1% 3027 3028 0.0%
go/unified/open_large 4.0 ms 4.0 ms -0.5% 12737 12737 0.0%
go/unified/open_large_full_file 4.6 ms 4.6 ms +0.7% 12599 12601 0.0%
go/unified/jump_to_end_large 2.3 ms 2.3 ms +0.9% 3279 3280 0.0%
go/unified/expand_gap 723 µs 707 µs -2.1% 1865 1866 +0.1%
go/split_wrap/redraw 377 µs 379 µs +0.6% 130 131 +0.8%
go/split_wrap/wheel_scroll 758 µs 762 µs +0.5% 2881 2882 0.0%
go/split_wrap/type_and_delete 1.0 ms 1.0 ms +0.8% 299 301 +0.7%
go/split_wrap/resize 2.1 ms 2.2 ms +3.3% 3874 3875 0.0%
go/unified_wrap/redraw 354 µs 355 µs +0.4% 79 80 +1.3%
go/unified_wrap/wheel_scroll 613 µs 604 µs -1.4% 1570 1571 +0.1%
go/unified_wrap/resize 1.3 ms 1.4 ms +7.9% 1790 1791 +0.1%
go/toggle_split_unified 491 µs 487 µs -0.8% 1603 1604 +0.1%
go/switch_diff_and_file_tab 460 µs 463 µs +0.6% 1071 1072 +0.1%
go/open_changes_large 5.0 ms 5.0 ms -0.9% 13895 13896 0.0%
commit_detail/open_many_files 52.2 ms 52.2 ms +0.1% 19171 19174 0.0%
commit_detail/wheel_scroll 1.1 ms 1.0 ms -5.2% 3069 3070 0.0%
Benchmark Base allocated bytes PR allocated bytes Change
go/split/redraw 1928 B 1992 B +3.3%
go/split/wheel_scroll 178030 B 178272 B +0.1%
go/split/type_and_delete 18889 B 19017 B +0.7%
go/split/enter_and_backspace 162144 B 162272 B +0.1%
go/split/page_down 384550 B 384385 B 0.0%
go/split/open_large 2.2 MiB 2.2 MiB 0.0%
go/split/open_large_full_file 2.8 MiB 2.8 MiB 0.0%
go/split/jump_to_end_large 390155 B 390100 B 0.0%
go/split/expand_gap 562366 B 562337 B 0.0%
go/unified/redraw 1787 B 1851 B +3.6%
go/unified/wheel_scroll 112452 B 112516 B +0.1%
go/unified/type_and_delete 18617 B 18745 B +0.7%
go/unified/page_down 339548 B 339651 B 0.0%
go/unified/open_large 2.0 MiB 2.0 MiB 0.0%
go/unified/open_large_full_file 2.7 MiB 2.7 MiB +0.3%
go/unified/jump_to_end_large 305622 B 305673 B 0.0%
go/unified/expand_gap 411048 B 411060 B 0.0%
go/split_wrap/redraw 2667 B 2731 B +2.4%
go/split_wrap/wheel_scroll 178785 B 178843 B 0.0%
go/split_wrap/type_and_delete 263046 B 263174 B 0.0%
go/split_wrap/resize 2.1 MiB 2.1 MiB 0.0%
go/unified_wrap/redraw 2155 B 2219 B +3.0%
go/unified_wrap/wheel_scroll 112820 B 112884 B +0.1%
go/unified_wrap/resize 1.4 MiB 1.4 MiB 0.0%
go/toggle_split_unified 75569 B 75633 B +0.1%
go/switch_diff_and_file_tab 48558 B 48622 B +0.1%
go/open_changes_large 2.6 MiB 2.6 MiB -0.3%
commit_detail/open_many_files 4.2 MiB 4.2 MiB +1.0%
commit_detail/wheel_scroll 331824 B 331939 B 0.0%

Log files

Geometric-mean change: time +0.7%, peak RSS -0.2%.

Click here to see benchmark details
Benchmark Base PR Time change Base peak RSS PR peak RSS Peak RSS change
1MiB 66.0 ms 65.3 ms -1.0% 26.0 MiB 25.5 MiB -1.9%
128MiB 172.8 ms 170.7 ms -1.2% 170.3 MiB 170.5 MiB +0.1%
256MiB 265.1 ms 273.6 ms +3.2% 314.5 MiB 314.6 MiB 0.0%
1MiB_wrap 75.3 ms 79.8 ms +5.9% 27.2 MiB 27.3 MiB +0.3%
128MiB_wrap 171.8 ms 170.1 ms -1.0% 170.4 MiB 170.4 MiB 0.0%
256MiB_wrap 268.1 ms 266.2 ms -0.7% 314.8 MiB 314.5 MiB -0.1%
128MiB_edit 1866.6 ms 1864.2 ms -0.1% 438.5 MiB 438.4 MiB 0.0%

Code files

Geometric-mean change: time +1.5%, peak RSS +2.9%.

Click here to see benchmark details
Benchmark Base PR Time change Base peak RSS PR peak RSS Peak RSS change
64MiB 430.4 ms 448.8 ms +4.3% 231.2 MiB 252.5 MiB +9.3%
64MiB_type 1653.2 ms 1679.2 ms +1.6% 253.0 MiB 252.5 MiB -0.2%
64MiB_enter 1340.7 ms 1324.7 ms -1.2% 290.3 MiB 290.5 MiB +0.1%

Timing changes are informational because shared CI runners are noisy; a benchmark error still fails the job.

@BrettKinny

Copy link
Copy Markdown
Contributor

Tested on Windows 11, works well. Esc ×2 (clear → editor) and Enter respecting focusOnOpen both feel right.

One thing it surfaces (pre-existing on main): Ctrl+B hiding the sidebar leaves focus on the hidden explorer, so keys go nowhere visible. HideBottomPanel calls FocusEditor(); hideSidebar doesn't. More noticeable now since / → Enter keeps focus in the explorer. Issue #1489, fix in #1490.

@eugenioenko eugenioenko left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@BrettKinny Thank you so much for testing it out, really appreciate your effort and for following up on the sidebar focus bug. Thank you :)

@eugenioenko
eugenioenko merged commit 6a0f0ce into main Nov 10, 2026
34 checks passed
@eugenioenko
eugenioenko deleted the feat/explorer-search-folders branch November 10, 2026 07:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(explorer): filter the explorer tree with /

2 participants