3 # Functions related to handling LSP symbol signature help.
5 import './options.vim' as opt
7 import './buffer.vim' as buf
9 # close the signature popup window
10 def CloseSignaturePopup(lspserver: dict<any>)
11 lspserver.signaturePopup->popup_close()
12 lspserver.signaturePopup = -1
15 def CloseCurBufSignaturePopup()
16 var lspserver: dict<any> = buf.CurbufGetServer()
21 CloseSignaturePopup(lspserver)
25 hlset([{name: 'LspSigActiveParameter', default: true, linksto: 'LineNr'}])
28 # Initialize the signature triggers for the current buffer
29 export def BufferInit(lspserver: dict<any>)
30 if !lspserver.isSignatureHelpProvider
31 || !lspserver.caps.signatureHelpProvider->has_key('triggerCharacters')
32 # no support for signature help
36 if !opt.lspOptions.showSignature
37 # Show signature are disabled
41 # map characters that trigger signature help
42 for ch in lspserver.caps.signatureHelpProvider.triggerCharacters
43 exe $"inoremap <buffer> <silent> {ch} {ch}<C-R>=LspShowSignature()<CR>"
46 # close the signature popup when leaving insert mode
47 autocmd_add([{bufnr: bufnr(),
49 cmd: 'CloseCurBufSignaturePopup()'}])
52 # process the 'textDocument/signatureHelp' reply from the LSP server and
53 # display the symbol signature help.
54 # Result: SignatureHelp | null
55 export def SignatureHelp(lspserver: dict<any>, sighelp: any): void
57 CloseSignaturePopup(lspserver)
61 if sighelp.signatures->len() <= 0
62 util.WarnMsg('No signature help available')
63 CloseSignaturePopup(lspserver)
67 var sigidx: number = 0
68 if sighelp->has_key('activeSignature')
69 sigidx = sighelp.activeSignature
72 var sig: dict<any> = sighelp.signatures[sigidx]
73 var text: string = sig.label
75 var startcol: number = 0
76 if sig->has_key('parameters') && sighelp->has_key('activeParameter')
77 var params_len = sig.parameters->len()
78 if params_len > 0 && sighelp.activeParameter < params_len
79 var label: string = sig.parameters[sighelp.activeParameter].label
81 startcol = text->stridx(label)
84 if opt.lspOptions.echoSignature
87 :echon text->strpart(0, startcol)
88 :echoh LspSigActiveParameter
89 :echon text->strpart(startcol, hllen)
91 :echon text->strpart(startcol + hllen)
93 # Close the previous signature popup and open a new one
94 lspserver.signaturePopup->popup_close()
96 var popupID = text->popup_atcursor({moved: [col('.') - 1, 9999999]})
97 var bnr: number = popupID->winbufnr()
98 prop_type_add('signature', {bufnr: bnr, highlight: 'LspSigActiveParameter'})
100 prop_add(1, startcol + 1, {bufnr: bnr, length: hllen, type: 'signature'})
102 lspserver.signaturePopup = popupID
106 # vim: tabstop=8 shiftwidth=2 softtabstop=2