-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Picker
s "v2"
#9647
Picker
s "v2"
#9647
Commits on Jul 15, 2024
-
Use an AsyncHook for picker preview highlighting
The picker previously used the IdleTimeout event as a trigger for syntax-highlighting the currently selected document in the preview pane. This is a bit ad-hoc now that the event system has landed and we can refactor towards an AsyncHook (like those used for LSP completion and signature-help). This should resolve some odd scenarios where the preview did not highlight because of a race between the idle timeout and items appearing in the picker.
Configuration menu - View commit details
-
Copy full SHA for dae3841 - Browse repository at this point
Copy the full SHA dae3841View commit details -
Refactor Picker in terms of columns
`menu::Item` is replaced with column configurations for each picker which control how a column is displayed and whether it is passed to nucleo for filtering. (This is used for dynamic pickers so that we can filter those items with the dynamic picker callback rather than nucleo.) The picker has a new lucene-like syntax that can be used to filter the picker only on certain criteria. If a filter is not specified, the text in the prompt applies to the picker's configured "primary" column. Adding column configurations for each picker is left for the child commit.
Configuration menu - View commit details
-
Copy full SHA for f40fca8 - Browse repository at this point
Copy the full SHA f40fca8View commit details -
Add a special query syntax for Pickers to select columns
Now that the picker is defined as a table, we need a way to provide input for each field in the picker. We introduce a small query syntax that supports multiple columns without being too verbose. Fields are specified as `%field pattern`. The default column for a picker doesn't need the `%field` prefix. The field name may be selected by a prefix of the field, for example `%p foo.rs` rather than `%path foo.rs`. Co-authored-by: ItsEthra <[email protected]>
Configuration menu - View commit details
-
Copy full SHA for c4c17c6 - Browse repository at this point
Copy the full SHA c4c17c6View commit details -
Add column configurations for existing pickers
This removes the menu::Item implementations for picker item types and adds `Vec<Column<T, D>>` configurations.
Configuration menu - View commit details
-
Copy full SHA for 385b398 - Browse repository at this point
Copy the full SHA 385b398View commit details -
Replace picker shutdown bool with version number
This works nicely for dynamic pickers: we stop any running jobs like global search that are pushing to the injector by incrementing the version number when we start a new request. The boolean only allowed us to shut the picker down once, but with a usize a picker can have multiple "sessions" / "life-cycles" where it receives new options from an injector.
Configuration menu - View commit details
-
Copy full SHA for 53ac833 - Browse repository at this point
Copy the full SHA 53ac833View commit details -
Configuration menu - View commit details
-
Copy full SHA for 2c9f5b3 - Browse repository at this point
Copy the full SHA 2c9f5b3View commit details -
We will use this in the child commit to improve the picker's running indicator. Nucleo 0.4.0 includes an `active_injectors` member that we can use to detect if anything can push to the picker. When that count drops to zero we can remove the running indicator. Nucleo 0.4.1 contains a fix for crashes with interactive global search on a large directory.
Configuration menu - View commit details
-
Copy full SHA for 11f809c - Browse repository at this point
Copy the full SHA 11f809cView commit details -
Consolidate DynamicPicker into Picker
DynamicPicker is a thin wrapper over Picker that holds some additional state, similar to the old FilePicker type. Like with FilePicker, we want to fold the two types together, having Picker optionally hold that extra state. The DynamicPicker is a little more complicated than FilePicker was though - it holds a query callback and current query string in state and provides some debounce for queries using the IdleTimeout event. We can move all of that state and debounce logic into an AsyncHook implementation, introduced here as `DynamicQueryHandler`. The hook receives updates to the primary query and debounces those events so that once a query has been idle for a short time (275ms) we re-run the query. A standard Picker created through `new` for example can be promoted into a Dynamic picker by chaining the new `with_dynamic_query` function, very similar to FilePicker's replacement `with_preview`. The workspace symbol picker has been migrated to the new way of writing dynamic pickers as an example. The child commit will promote global search into a dynamic Picker as well.
Configuration menu - View commit details
-
Copy full SHA for 9e31ba5 - Browse repository at this point
Copy the full SHA 9e31ba5View commit details -
The parent commit split out the workspace symbol picker to an inline definition so the `workspace` parameter is never passed as `true`. We should consolidate this picker definition into the symbol_picker function.
Configuration menu - View commit details
-
Copy full SHA for 5622db6 - Browse repository at this point
Copy the full SHA 5622db6View commit details -
Configuration menu - View commit details
-
Copy full SHA for 1d023b0 - Browse repository at this point
Copy the full SHA 1d023b0View commit details -
Configuration menu - View commit details
-
Copy full SHA for 7b1131a - Browse repository at this point
Copy the full SHA 7b1131aView commit details -
Add a hidden column for the global search line contents
We could expand on this in the future to have different preview modes that you can toggle between with C-t. Currently that binding just hides the preview but it could switch between different preview modes and in one mode hide the path and just show the line contents.
Configuration menu - View commit details
-
Copy full SHA for 6492f17 - Browse repository at this point
Copy the full SHA 6492f17View commit details -
Request a UI redraw on Drop of an Injector
This fixes the changed files picker when used against a clean worktree for example. Without it the running indicator does not disappear. It also simplifies the dynamic query handler's implementation so that it doesn't need to request a redraw explicitly. Co-authored-by: Pascal Kuthe <[email protected]>
Configuration menu - View commit details
-
Copy full SHA for 6ccbfe9 - Browse repository at this point
Copy the full SHA 6ccbfe9View commit details -
Configuration menu - View commit details
-
Copy full SHA for 4082820 - Browse repository at this point
Copy the full SHA 4082820View commit details -
Convert LSP URIs into custom URIs
This introduces a custom URI type in core meant to be extended later if we want to support other schemes. For now it's just a wrapper over a PathBuf. We use this new URI type to firewall `lsp::Url`. This was previously done in 8141a4a but using a custom URI type is more flexible and will improve the way Pickers handle paths for previews in the child commit(s). Co-authored-by: soqb <[email protected]>
Configuration menu - View commit details
-
Copy full SHA for f4a433f - Browse repository at this point
Copy the full SHA f4a433fView commit details -
Avoid allocations in Picker file preview callback
The `FileLocation` and `PathOrId` types can borrow paths rather than requiring them to be owned. This takes a refactor of the preview functions and preview internals within `Picker`. With this change we avoid an unnecessary `PathBuf` clone per render for any picker with a file preview function (i.e. most pickers). This refactor is not fully complete. The `PathOrId` is _sometimes_ an owned `PathBuf`. This is for pragmatic reasons rather than technical ones. We need a further refactor to introduce more core types like `Location` in order to eliminate the Cow and only use `&Path`s within `PathOrId`. This is left for future work as it will be a larger refactor almost entirely fitting into the LSP commands module and helix-core - i.e. mostly unrelated to refactoring the `Picker` code itself. Co-authored-by: Pascal Kuthe <[email protected]>
Configuration menu - View commit details
-
Copy full SHA for 3906f66 - Browse repository at this point
Copy the full SHA 3906f66View commit details -
Accept 'IntoIterator<Item = T>' for Picker::new options
`Picker::new` loops through the input options to inject each of them, so there's no need to collect into an intermediary Vec. This removes some unnecessary collections. Also, pickers that start with no initial options can now pass an empty slice instead of an empty Vec. Co-authored-by: Luis Useche <[email protected]>
Configuration menu - View commit details
-
Copy full SHA for 8555248 - Browse repository at this point
Copy the full SHA 8555248View commit details -
Configuration menu - View commit details
-
Copy full SHA for 009bbda - Browse repository at this point
Copy the full SHA 009bbdaView commit details -
Accept 'IntoIterator<Item = Column<T, D>>' for picker columns
This allows us to replace any `vec![..]`s of columns where all columns are static with static slices `[..]`.
Configuration menu - View commit details
-
Copy full SHA for a7777b3 - Browse repository at this point
Copy the full SHA a7777b3View commit details -
Picker: Highlight the currently active column
We can track the ranges in the input text that correspond to each column and use this information during rendering to apply a new theme key that makes the "active column" stand out. This makes it easier to tell at a glance which column you're entering.
Configuration menu - View commit details
-
Copy full SHA for 9de5f5c - Browse repository at this point
Copy the full SHA 9de5f5cView commit details