Fix completion labels becoming overly large due to LSP completion items with newlines (#23407)
Reworks https://github.com/zed-industries/zed/pull/23030 and https://github.com/zed-industries/zed/pull/15087 Closes https://github.com/zed-industries/zed/issues/23352 Closes https://github.com/zed-industries/zed/issues/23310 Zed's completion items use `label` from LSP completion items as a base to show in the list:d290da7dac/crates/project/src/lsp_store.rs (L4371-L4374)
Besides that, certain language plugins append `detail` or `label_details.description` as a suffix:d290da7dac/crates/languages/src/vtsls.rs (L178-L188)
Either of these 3 properties may return `\n` (or multiple) in it, spoiling Zed's completion menu, which uses `UniformList` to render those items: a uniform list uses common, minimum possible height for each element, and `\n` bloats that overly. Good approach would be to use something else: https://github.com/zed-industries/zed/issues/21403 but that has its own drawbacks and relatively hard to use instead (?). We could follow VSCode's approach and move away all but `label` from `CodeLabel.text` to the side, where the documentation is, but that does not solve the issue with `details` having newlines. So, for now, sanitize all labels and remove any newlines from them. If newlines are found, also replace whitespace sequences if there's more than 1 in a row. Later, this approach can be improved similarly to how Helix and Zed's inline completions do: rendering a "ghost" text, showing the completion's edit applied to the editor. Release Notes: - Fixed completion labels becoming overly large due to LSP completion items with newlines
This commit is contained in:
parent
94189e1784
commit
75c5344754
5 changed files with 338 additions and 15 deletions
|
@ -763,6 +763,14 @@ pub struct FakeLspAdapter {
|
|||
|
||||
pub capabilities: lsp::ServerCapabilities,
|
||||
pub initializer: Option<Box<dyn 'static + Send + Sync + Fn(&mut lsp::FakeLanguageServer)>>,
|
||||
pub label_for_completion: Option<
|
||||
Box<
|
||||
dyn 'static
|
||||
+ Send
|
||||
+ Sync
|
||||
+ Fn(&lsp::CompletionItem, &Arc<Language>) -> Option<CodeLabel>,
|
||||
>,
|
||||
>,
|
||||
}
|
||||
|
||||
/// Configuration of handling bracket pairs for a given language.
|
||||
|
@ -1778,6 +1786,7 @@ impl Default for FakeLspAdapter {
|
|||
arguments: vec![],
|
||||
env: Default::default(),
|
||||
},
|
||||
label_for_completion: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1849,6 +1858,15 @@ impl LspAdapter for FakeLspAdapter {
|
|||
) -> Result<Option<Value>> {
|
||||
Ok(self.initialization_options.clone())
|
||||
}
|
||||
|
||||
async fn label_for_completion(
|
||||
&self,
|
||||
item: &lsp::CompletionItem,
|
||||
language: &Arc<Language>,
|
||||
) -> Option<CodeLabel> {
|
||||
let label_for_completion = self.label_for_completion.as_ref()?;
|
||||
label_for_completion(item, language)
|
||||
}
|
||||
}
|
||||
|
||||
fn get_capture_indices(query: &Query, captures: &mut [(&str, &mut Option<u32>)]) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue