[PR #19519] Implement search in Settings UI #31861

Open
opened 2026-01-31 09:49:59 +00:00 by claunia · 0 comments
Owner

Original Pull Request: https://github.com/microsoft/terminal/pull/19519

State: open
Merged: No


Summary of the Pull Request

Adds search functionality to the settings UI. This is added to an AutoSuggestBox in the main NavigationView. Invoking a result navigates to the proper location in the settings UI and focuses the setting, when possible.

References and Relevant Issues

Based on https://github.com/microsoft/PowerToys/pull/41285

Detailed Description of the Pull Request / Additional comments

  • tools/GenerateSettingsIndex.ps1: parses all the XAML files in the settings UI for SettingsContainers and builds a search index from them
  • XAML changes: ensures all SettingContainer objects have an x:Name so that we can navigate to them and bring them into view.
  • TerminalSettingsEditor/Utils.h: implements BringIntoViewWhenLoaded() which navigates to the relevant part of the UI. This is called in OnNavigatedTo() for each page.
  • fzf was moved out of TerminalApp so that TerminalSettingsEditor can access it
  • There's a few main components to searching, all of it is in MainPage:
    • MainPage::_UpdateSearchIndex()|SearchIndex::Reset(): loads the search index generated by GenerateSettingsIndex.ps1; provides additional localization, if needed
    • MainPage::SettingsSearchBox_TextChanged:
      • detect that text changed in the search box
      • perform the actual search in SearchIndex::SearchAsync(). This is a HEFTY async function that can be cancelled. It needs a lot of context passed in to expand the search index appropriately (i.e. build awareness of "PowerShell" profile and generate results appropriately). This is also where fzf is used to perform weighted matching.
      • the weighted matching itself is pretty complicated, but all the associated bonus weights are at the top of SearchIndex.cpp.
    • SettingsSearchBox_QuerySubmitted: extract the search index metadata and call the correct _Navigate() function

Validation Steps Performed

Search for...

  • settings that don't change at runtime:
    • global settings
    • settings in profile.defaults
    • "add new profile" page
  • settings that may change at runtime:
    • settings in a profile
    • individual color schemes
    • actions (main actions page + edit action subpage)
    • new tab menu folders
    • extensions
  • misc. corner cases:
    • terminal chat (blocked in indexing script; requires minor changes in feature branch)
    • settings in appearance objects

To test fzf matching and weighted results, I specifically tested these scenarios:

  • "PowerShell" --> prioritize the PowerShell profile page(s)
  • "font size" --> prioritize profile defaults entry
  • "font size powershell" --> prioritize PowerShell > font size

PR Checklist

Closes #12949

Follow-ups

  • search by JSON key: need a way to add JSON keys to index entries. GetSearchableFields() should make the rest pretty easy.
  • search by keywords: need to define keywords. GetSearchableFields() should make the rest pretty easy.
**Original Pull Request:** https://github.com/microsoft/terminal/pull/19519 **State:** open **Merged:** No --- ## Summary of the Pull Request Adds search functionality to the settings UI. This is added to an `AutoSuggestBox` in the main `NavigationView`. Invoking a result navigates to the proper location in the settings UI and focuses the setting, when possible. ## References and Relevant Issues Based on https://github.com/microsoft/PowerToys/pull/41285 ## Detailed Description of the Pull Request / Additional comments - tools/GenerateSettingsIndex.ps1: parses all the XAML files in the settings UI for SettingsContainers and builds a search index from them - XAML changes: ensures all SettingContainer objects have an `x:Name` so that we can navigate to them and bring them into view. - TerminalSettingsEditor/Utils.h: implements `BringIntoViewWhenLoaded()` which navigates to the relevant part of the UI. This is called in `OnNavigatedTo()` for each page. - fzf was moved out of TerminalApp so that TerminalSettingsEditor can access it - There's a few main components to searching, all of it is in `MainPage`: - `MainPage::_UpdateSearchIndex()`|`SearchIndex::Reset()`: loads the search index generated by `GenerateSettingsIndex.ps1`; provides additional localization, if needed - `MainPage::SettingsSearchBox_TextChanged`: - detect that text changed in the search box - perform the actual search in `SearchIndex::SearchAsync()`. This is a HEFTY async function that can be cancelled. It needs a lot of context passed in to expand the search index appropriately (i.e. build awareness of "PowerShell" profile and generate results appropriately). This is also where fzf is used to perform weighted matching. - the weighted matching itself is pretty complicated, but all the associated bonus weights are at the top of SearchIndex.cpp. - `SettingsSearchBox_QuerySubmitted`: extract the search index metadata and call the correct `_Navigate()` function ## Validation Steps Performed Search for... - settings that don't change at runtime: - [x] global settings - [x] settings in profile.defaults - [x] "add new profile" page - settings that may change at runtime: - [x] settings in a profile - [x] individual color schemes - [x] actions (main actions page + edit action subpage) - [x] new tab menu folders - [x] extensions - misc. corner cases: - [x] terminal chat (blocked in indexing script; requires minor changes in feature branch) - [x] settings in appearance objects To test fzf matching and weighted results, I specifically tested these scenarios: - "PowerShell" --> prioritize the PowerShell profile page(s) - "font size" --> prioritize profile defaults entry - "font size powershell" --> prioritize PowerShell > font size ## PR Checklist Closes #12949 ## Follow-ups - search by JSON key: need a way to add JSON keys to index entries. `GetSearchableFields()` should make the rest pretty easy. - search by keywords: need to define keywords. `GetSearchableFields()` should make the rest pretty easy.
claunia added the pull-request label 2026-01-31 09:49:59 +00:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#31861