Filter completion items from language server by starts_with word under cursor (#883)

* filter items by starts_with pre nth char of cursor

* add config for filter completion items by starts_with

* filter items by starts_with pre nth char of cursor

* add config for filter completion items by starts_with

* remove completion items pre filter configuratio
This commit is contained in:
CossonLeo 2021-10-24 15:55:29 +08:00 committed by GitHub
parent 0cb5e0b2ca
commit 971ba8929f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -4142,6 +4142,7 @@ pub fn completion(cx: &mut Context) {
iter.reverse(); iter.reverse();
let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count(); let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count();
let start_offset = cursor.saturating_sub(offset); let start_offset = cursor.saturating_sub(offset);
let prefix = text.slice(start_offset..cursor).to_string();
cx.callback( cx.callback(
future, future,
@ -4154,7 +4155,7 @@ pub fn completion(cx: &mut Context) {
return; return;
} }
let items = match response { let mut items = match response {
Some(lsp::CompletionResponse::Array(items)) => items, Some(lsp::CompletionResponse::Array(items)) => items,
// TODO: do something with is_incomplete // TODO: do something with is_incomplete
Some(lsp::CompletionResponse::List(lsp::CompletionList { Some(lsp::CompletionResponse::List(lsp::CompletionList {
@ -4164,6 +4165,18 @@ pub fn completion(cx: &mut Context) {
None => Vec::new(), None => Vec::new(),
}; };
if !prefix.is_empty() {
items = items
.into_iter()
.filter(|item| {
item.filter_text
.as_ref()
.unwrap_or(&item.label)
.starts_with(&prefix)
})
.collect();
}
if items.is_empty() { if items.is_empty() {
// editor.set_error("No completion available".to_string()); // editor.set_error("No completion available".to_string());
return; return;