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 if lspserver.signaturePopup != -1
12 lspserver.signaturePopup->popup_close()
14 lspserver.signaturePopup = -1
17 def CloseCurBufSignaturePopup()
18 var lspserver: dict<any> = buf.CurbufGetServer('signatureHelp')
23 CloseSignaturePopup(lspserver)
27 hlset([{name: 'LspSigActiveParameter', default: true, linksto: 'LineNr'}])
30 # Initialize the signature triggers for the current buffer
31 export def BufferInit(lspserver: dict<any>)
32 if !lspserver.isSignatureHelpProvider
33 || !lspserver.caps.signatureHelpProvider->has_key('triggerCharacters')
34 # no support for signature help
38 if !opt.lspOptions.showSignature
39 || !lspserver.featureEnabled('signatureHelp')
40 # Show signature support is disabled
44 # map characters that trigger signature help
45 for ch in lspserver.caps.signatureHelpProvider.triggerCharacters
46 exe $"inoremap <buffer> <silent> {ch} {ch}<C-R>=LspShowSignature()<CR>"
49 # close the signature popup when leaving insert mode
50 autocmd_add([{bufnr: bufnr(),
52 cmd: 'CloseCurBufSignaturePopup()'}])
55 # process the 'textDocument/signatureHelp' reply from the LSP server and
56 # display the symbol signature help.
57 # Result: SignatureHelp | null
58 export def SignatureHelp(lspserver: dict<any>, sighelp: any): void
60 CloseSignaturePopup(lspserver)
64 if sighelp.signatures->len() <= 0
65 CloseSignaturePopup(lspserver)
69 var sigidx: number = 0
70 if sighelp->has_key('activeSignature')
71 sigidx = sighelp.activeSignature
74 var sig: dict<any> = sighelp.signatures[sigidx]
75 var text: string = sig.label
77 var startcol: number = 0
78 if sig->has_key('parameters') && sighelp->has_key('activeParameter')
79 var params_len = sig.parameters->len()
80 if params_len > 0 && sighelp.activeParameter < params_len
81 var label: string = sig.parameters[sighelp.activeParameter].label
83 startcol = text->stridx(label)
86 if opt.lspOptions.echoSignature
89 :echon text->strpart(0, startcol)
90 :echoh LspSigActiveParameter
91 :echon text->strpart(startcol, hllen)
93 :echon text->strpart(startcol + hllen)
95 # Close the previous signature popup and open a new one
96 lspserver.signaturePopup->popup_close()
98 var popupID = text->popup_atcursor({moved: [col('.') - 1, 9999999]})
99 var bnr: number = popupID->winbufnr()
100 prop_type_add('signature', {bufnr: bnr, highlight: 'LspSigActiveParameter'})
102 prop_add(1, startcol + 1, {bufnr: bnr, length: hllen, type: 'signature'})
104 lspserver.signaturePopup = popupID
108 # vim: tabstop=8 shiftwidth=2 softtabstop=2