From 6f6f7beb5eb57187e8df0a6f27b41029287d111e Mon Sep 17 00:00:00 2001 From: Felix Endres Date: Thu, 12 Sep 2024 10:33:07 +0200 Subject: [PATCH 1/2] Add option to limit triggering of auto completion I find it distracting to have auto completion for everything I type. I'd rather have it only triggered on trigger characters, e.g. when typing a dot to access a class member, or a colon, when using a namespaced symbol. This change allows to flexibly limit auto completion to any trigger kinds. --- autoload/lsp/completion.vim | 4 ++-- autoload/lsp/lspserver.vim | 7 +++++-- autoload/lsp/options.vim | 9 +++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/autoload/lsp/completion.vim b/autoload/lsp/completion.vim index 8ce5899c..22efb1e7 100644 --- a/autoload/lsp/completion.vim +++ b/autoload/lsp/completion.vim @@ -146,7 +146,7 @@ enddef # process the 'textDocument/completion' reply from the LSP server # Result: CompletionItem[] | CompletionList | null -export def CompletionReply(lspserver: dict, cItems: any) +export def CompletionReply(lspserver: dict, cItems: any, trigger_type: number) lspserver.completeItemsIsIncomplete = false if cItems->empty() if lspserver.omniCompletePending @@ -549,7 +549,7 @@ def LspComplete() endif var [triggerKind, triggerChar] = GetTriggerAttributes(lspserver) - if triggerKind < 0 + if count(opt.lspOptions.autoCompleteTriggers, triggerKind) == 0 return endif diff --git a/autoload/lsp/lspserver.vim b/autoload/lsp/lspserver.vim index bfbdd77d..36c05a4c 100644 --- a/autoload/lsp/lspserver.vim +++ b/autoload/lsp/lspserver.vim @@ -727,8 +727,11 @@ def GetCompletion(lspserver: dict, triggerKind_arg: number, triggerChar: st # interface CompletionContext params.context = {triggerKind: triggerKind_arg, triggerCharacter: triggerChar} - lspserver.rpc_a('textDocument/completion', params, - completion.CompletionReply) + # Wrap CompletionReply, so it gets the trigger kind + var CompletionReplyWithTriggerKind = (lspserverarg: dict, cItems: any) => + completion.CompletionReply(lspserverarg, cItems, triggerKind_arg) + echom lspserver.completionTriggerChars + lspserver.rpc_a('textDocument/completion', params, CompletionReplyWithTriggerKind) enddef # Get lazy properties for a completion item. diff --git a/autoload/lsp/options.vim b/autoload/lsp/options.vim index 50697a3b..7570e0f3 100644 --- a/autoload/lsp/options.vim +++ b/autoload/lsp/options.vim @@ -16,6 +16,15 @@ export var lspOptions: dict = { # Otherwise, use omni-completion autoComplete: true, + # If autoComplete is set to true, limit auto completion to the specified cases: + # 1: typing keyword characters (see :help iskeyword) + # 2: typing a trigger character (language specific, provided by the lsp server. + # E.g., for C++ this might be any of '.', '<', '>', ':', '"', '/', '*' + # Default is to execute autocompletion in both cases. If you want autocompletion only when typing + # a trigger character, set this option to [ 2 ]. You can still use omni-completion to trigger + # completion manually in other situations. + autoCompleteTriggers: [ 1, 2 ], + # In normal mode, highlight the current symbol automatically autoHighlight: false, From 538818d88fcd1df9c309888138121a2f468fafb9 Mon Sep 17 00:00:00 2001 From: Felix Endres Date: Thu, 12 Sep 2024 10:51:58 +0200 Subject: [PATCH 2/2] Add option to limit usage of buffer completion When completing a file name or a class method, buffer completion makes the list longer and provides little value. This option allows to turn buffer completion off for completions triggered by trigger characters. --- autoload/lsp/completion.vim | 2 +- autoload/lsp/options.vim | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/autoload/lsp/completion.vim b/autoload/lsp/completion.vim index 22efb1e7..0400a491 100644 --- a/autoload/lsp/completion.vim +++ b/autoload/lsp/completion.vim @@ -182,7 +182,7 @@ export def CompletionReply(lspserver: dict, cItems: any, trigger_type: numb snippet.CompletionVsnip(items) endif - if lspOpts.useBufferCompletion + if lspOpts.useBufferCompletion && count(lspOpts.bufferCompletionTriggers, trigger_type) > 0 CompletionFromBuffer(items) endif diff --git a/autoload/lsp/options.vim b/autoload/lsp/options.vim index 7570e0f3..2bc3ac8b 100644 --- a/autoload/lsp/options.vim +++ b/autoload/lsp/options.vim @@ -34,6 +34,14 @@ export var lspOptions: dict = { # Automatically populate the location list with new diagnostics autoPopulateDiags: false, + # If useBufferCompletion is set to true, limit completion to the specified cases: + # 1: typing keyword characters (see :help iskeyword) + # 2: typing a trigger character (language specific, provided by the lsp server. + # E.g., for C++ this might be any of '.', '<', '>', ':', '"', '/', '*' + # Default is to execute buffer completion in both cases. If you do not want buffer completions + # to come up with more specific completions (e.g., class members, file names), set it to [ 1 ]. + bufferCompletionTriggers: [ 1, 2 ], + # icase | fuzzy | case match for language servers that replies with a full # list of completion items completionMatcher: 'case',