]> Sergey Matveev's repositories - vim-lsp.git/commitdiff
Propagate triggerCharacters to omni-completion
authorGirish Palya <girishji@gmail.com>
Wed, 29 Nov 2023 12:17:55 +0000 (13:17 +0100)
committerGirish Palya <girishji@gmail.com>
Wed, 29 Nov 2023 12:17:55 +0000 (13:17 +0100)
Fixed 2 bugs:
- add triggerCharacters to lsp list for omniComplete option
- process triggerCharacters based keywords in omnifunc()

M  autoload/lsp/completion.vim
M  autoload/lsp/lspserver.vim

autoload/lsp/completion.vim
autoload/lsp/lspserver.vim

index 1fa85e2cdb8c8a4fced876ceaba3ad8caf516fcf..6f2347f22b20c0fb3bd791c0880be4b581498c40 100644 (file)
@@ -433,19 +433,23 @@ def g:LspOmniFunc(findstart: number, base: string): any
   endif
 
   if findstart
-    # first send all the changes in the current buffer to the LSP server
-    listener_flush()
-
-    lspserver.omniCompletePending = true
-    lspserver.completeItems = []
-    # initiate a request to LSP server to get list of completions
-    lspserver.getCompletion(1, '')
-
-    # locate the start of the word
-    var line = getline('.')->strpart(0, col('.') - 1)
-    var keyword = line->matchstr('\k\+$')
-    lspserver.omniCompleteKeyword = keyword
-    return line->len() - keyword->len()
+    var triggerKind = LspGetCompletion(lspserver)
+    if triggerKind < 0
+      return triggerKind
+    else
+      lspserver.completeItems = []
+      lspserver.omniCompletePending = true
+      if triggerKind == 2 # completion caused by triggerChars
+        lspserver.omniCompleteKeyword = ''
+        return charcol('.') - 1
+      else
+        var line = getline('.')->strpart(0, col('.') - 1)
+        var keyword = line->matchstr('\k\+$')
+        lspserver.omniCompleteKeyword = keyword
+        return line->len() - keyword->len()
+      endif
+    endif
+
   else
     # Wait for the list of matches from the LSP server
     var count: number = 0
@@ -491,19 +495,12 @@ def g:LspOmniCompletePending(): bool
   return !lspserver->empty() && lspserver.omniCompletePending
 enddef
 
-# Insert mode completion handler. Used when 24x7 completion is enabled
-# (default).
-def LspComplete()
-  var lspserver: dict<any> = buf.CurbufGetServer('completion')
-  if lspserver->empty() || !lspserver.running || !lspserver.ready
-    return
-  endif
-
-  var cur_col: number = charcol('.')
+# Initiate request to server to get completion and return trigger kind
+def LspGetCompletion(lspserver: dict<any>): number
   var line: string = getline('.')
-
+  var cur_col: number = charcol('.')
   if cur_col == 0 || line->empty()
-    return
+    return -1
   endif
 
   # Trigger kind is 1 for 24x7 code complete or manual invocation
@@ -516,7 +513,7 @@ def LspComplete()
     var trigChars = lspserver.completionTriggerChars
     var trigidx = trigChars->index(line[cur_col - 2])
     if trigidx == -1
-      return
+      return -1
     endif
     # completion triggered by one of the trigger characters
     triggerKind = 2
@@ -528,6 +525,17 @@ def LspComplete()
 
   # initiate a request to LSP server to get list of completions
   lspserver.getCompletion(triggerKind, triggerChar)
+  return triggerKind
+enddef
+
+# Insert mode completion handler. Used when 24x7 completion is enabled
+# (default).
+def LspComplete()
+  var lspserver: dict<any> = buf.CurbufGetServer('completion')
+  if lspserver->empty() || !lspserver.running || !lspserver.ready
+    return
+  endif
+  LspGetCompletion(lspserver)
 enddef
 
 # Lazy complete documentation handler
index 315ba27b58f4b21d696f762661f3669c7f53fd82..53cc89524d837f3dd581ddb76faf9c1e918b27bd 100644 (file)
@@ -114,7 +114,7 @@ def ServerInitReply(lspserver: dict<any>, initResult: dict<any>): void
   capabilities.ProcessServerCaps(lspserver, caps)
 
   if caps->has_key('completionProvider')
-    if opt.lspOptions.autoComplete
+    if opt.lspOptions.autoComplete || opt.lspOptions.omniComplete
       lspserver.completionTriggerChars =
                        caps.completionProvider->get('triggerCharacters', [])
     endif