ShowCompletionDocumentation(cItem)
enddef
+# Return trigger kind and trigger char. If completion trigger is not a keyword
+# and not one of the triggerCharacters, return -1.
+def GetTriggerAttributes(lspserver: dict<any>): list<any>
+ var triggerKind: number = 1
+ var triggerChar: string = ''
+
+ # Trigger kind is 1 for keyword and 2 for trigger char initiated completion.
+ var line: string = getline('.')
+ var cur_col = charcol('.')
+ if line[cur_col - 2] !~ '\k'
+ var trigChars = lspserver.completionTriggerChars
+ var trigidx = trigChars->index(line[cur_col - 2])
+ if trigidx == -1
+ triggerKind = -1
+ else
+ triggerKind = 2
+ triggerChar = trigChars[trigidx]
+ endif
+ endif
+ return [triggerKind, triggerChar]
+enddef
+
+
# omni complete handler
def g:LspOmniFunc(findstart: number, base: string): any
var lspserver: dict<any> = buf.CurbufGetServerChecked('completion')
endif
if findstart
- var triggerKind = LspGetCompletion(lspserver)
+
+ var [triggerKind, triggerChar] = GetTriggerAttributes(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
+ return -1
endif
+ # 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(triggerKind, triggerChar)
+
+ # 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()
+
else
# Wait for the list of matches from the LSP server
var count: number = 0
endif
var res: list<dict<any>> = lspserver.completeItems
-
var prefix = lspserver.omniCompleteKeyword
# Don't attempt to filter on the items, when "isIncomplete" is set
return !lspserver->empty() && lspserver.omniCompletePending
enddef
-# 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 -1
+# 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
- # Trigger kind is 1 for 24x7 code complete or manual invocation
- var triggerKind: number = 1
- var triggerChar: string = ''
-
- # If the character before the cursor is not a keyword character or is not
- # one of the LSP completion trigger characters, then do nothing.
- if line[cur_col - 2] !~ '\k'
- var trigChars = lspserver.completionTriggerChars
- var trigidx = trigChars->index(line[cur_col - 2])
- if trigidx == -1
- return -1
- endif
- # completion triggered by one of the trigger characters
- triggerKind = 2
- triggerChar = trigChars[trigidx]
+ var [triggerKind, triggerChar] = GetTriggerAttributes(lspserver)
+ if triggerKind < 0
+ return
endif
# first send all the changes in the current buffer to the LSP server
# 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
END
writefile(lines, 'Xtagfunc.c')
:silent! edit Xtagfunc.c
- g:WaitForServerFileLoad(1)
+ g:WaitForServerFileLoad(3)
:setlocal tagfunc=lsp#lsp#TagFunc
cursor(3, 4)
:exe "normal \<C-]>"
feedkeys("cwb\<C-X>\<C-O>\<C-N>\<C-Y>", 'xt')
assert_equal(' myTest.baz = 10;', getline('.'))
cursor(11, 12)
- feedkeys("cw\<C-X>\<C-O>\<C-N>\<C-N>\<C-Y>", 'xt')
- assert_equal(' pTest->foo = 20;', getline('.'))
+ feedkeys("cw\<C-X>\<C-O>\<C-N>\<C-Y>", 'xt')
+ assert_equal(' pTest->baz = 20;', getline('.'))
:%bw!
enddef
g:LspOptionsSet({showDiagWithVirtualText: true})
p = prop_list(1, {end_lnum: line('$')})
assert_equal(1, p->len())
- assert_equal([3, 8, 'LspDiagVirtualTextError'], [p[0].lnum, p[0].length, p[0].type])
+ assert_equal([3, 'LspDiagVirtualTextError'], [p[0].lnum, p[0].type])
g:LspOptionsSet({showDiagWithVirtualText: false})
p = prop_list(1, {end_lnum: line('$')})