callhier.IncomingCalls = callhierarchy_import.IncomingCalls
callhier.OutgoingCalls = callhierarchy_import.OutgoingCalls
selection.SelectionStart = selection_import.SelectionStart
+ signature.SignatureInit = signature_import.SignatureInit
signature.SignatureDisplay = signature_import.SignatureDisplay
else
import lspOptions from './lspoptions.vim'
import ApplyCodeAction from './codeaction.vim'
import {IncomingCalls, OutgoingCalls} from './callhierarchy.vim'
import {SelectionStart} from './selection.vim'
- import {SignatureDisplay} from './signature.vim'
+ import {SignatureInit, SignatureDisplay} from './signature.vim'
opt.lspOptions = lspOptions
util.WarnMsg = WarnMsg
callhier.IncomingCalls = IncomingCalls
callhier.OutgoingCalls = OutgoingCalls
selection.SelectionStart = SelectionStart
+ signature.SignatureInit = SignatureInit
signature.SignatureDisplay = SignatureDisplay
endif
# TODO: Check all the buffers with filetype corresponding to this LSP server
# and then setup the below mapping for those buffers.
- # map characters that trigger signature help
- if opt.lspOptions.showSignature && caps->has_key('signatureHelpProvider')
- var triggers = caps.signatureHelpProvider.triggerCharacters
- for ch in triggers
- exe 'inoremap <buffer> <silent> ' .. ch .. ' ' .. ch .. "<C-R>=LspShowSignature()<CR>"
- endfor
- endif
+ # initialize signature help
+ signature.SignatureInit(lspserver)
if opt.lspOptions.autoComplete && caps->has_key('completionProvider')
var triggers = caps.completionProvider.triggerCharacters
var diag = {}
var symbol = {}
var outline = {}
+var signature = {}
+var buf = {}
if has('patch-8.2.4019')
import './lspoptions.vim' as opt_import
import './lspserver.vim' as server_import
import './util.vim' as util_import
+ import './buffer.vim' as buf_import
import './diag.vim' as diag_import
import './symbol.vim' as symbol_import
import './outline.vim' as outline_import
+ import './signature.vim' as signature_import
opt.lspOptions = opt_import.lspOptions
lserver.NewLspServer = server_import.NewLspServer
util.GetLineByteFromPos = util_import.GetLineByteFromPos
util.PushCursorToTagStack = util_import.PushCursorToTagStack
util.LspUriRemote = util_import.LspUriRemote
+ buf.BufLspServerSet = buf_import.BufLspServerSet
+ buf.BufLspServerRemove = buf_import.BufLspServerRemove
+ buf.BufHasLspServer = buf_import.BufHasLspServer
+ buf.BufLspServerGet = buf_import.BufLspServerGet
+ buf.CurbufGetServer = buf_import.CurbufGetServer
diag.UpdateDiags = diag_import.UpdateDiags
diag.DiagsGetErrorCount = diag_import.DiagsGetErrorCount
diag.ShowAllDiags = diag_import.ShowAllDiags
symbol.ShowSymbolMenu = symbol_import.ShowSymbolMenu
outline.OpenOutlineWindow = outline_import.OpenOutlineWindow
outline.SkipOutlineRefresh = outline_import.SkipOutlineRefresh
+ signature.SignatureInit = signature_import.SignatureInit
else
import {lspOptions} from './lspoptions.vim'
import NewLspServer from './lspserver.vim'
GetLineByteFromPos,
PushCursorToTagStack,
LspUriRemote} from './util.vim'
+ import {BufLspServerSet,
+ BufLspServerRemove,
+ BufHasLspServer,
+ BufLspServerGet,
+ CurbufGetServer} from './buffer.vim'
import {DiagRemoveFile,
UpdateDiags,
DiagsGetErrorCount,
DiagsHighlightDisable} from './diag.vim'
import ShowSymbolMenu from './symbol.vim'
import {OpenOutlineWindow, SkipOutlineRefresh} from './outline.vim'
+ import {SignatureInit} from './signature.vim'
opt.lspOptions = lspOptions
lserver.NewLspServer = NewLspServer
util.GetLineByteFromPos = GetLineByteFromPos
util.PushCursorToTagStack = PushCursorToTagStack
util.LspUriRemote = LspUriRemote
+ buf.BufLspServerSet = BufLspServerSet
+ buf.BufLspServerRemove = BufLspServerRemove
+ buf.BufHasLspServer = BufHasLspServer
+ buf.BufLspServerGet = BufLspServerGet
+ buf.CurbufGetServer = CurbufGetServer
diag.DiagRemoveFile = DiagRemoveFile
diag.UpdateDiags = UpdateDiags
diag.DiagsGetErrorCount = DiagsGetErrorCount
symbol.ShowSymbolMenu = ShowSymbolMenu
outline.OpenOutlineWindow = OpenOutlineWindow
outline.SkipOutlineRefresh = SkipOutlineRefresh
+ signature.SignatureInit = SignatureInit
endif
# LSP server information
# per-filetype omni-completion enabled/disabled table
var ftypeOmniCtrlMap: dict<bool> = {}
-# Buffer number to LSP server map
-var bufnrToServer: dict<dict<any>> = {}
-
var lspInitializedOnce = false
def s:lspInitOnce()
return ftypeServerMap->get(ftype, {})
enddef
-# Returns the LSP server for the buffer 'bnr'. Returns an empty dict if the
-# server is not found.
-def s:bufGetServer(bnr: number): dict<any>
- return bufnrToServer->get(bnr, {})
-enddef
-
-# Returns the LSP server for the current buffer. Returns an empty dict if the
-# server is not found.
-def s:curbufGetServer(): dict<any>
- return s:bufGetServer(bufnr())
-enddef
-
# Returns the LSP server for the current buffer if it is running and is ready.
# Returns an empty dict if the server is not found or is not ready.
def s:curbufGetServerChecked(): dict<any>
return {}
endif
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty()
util.ErrMsg('Error: LSP server for "' .. fname .. '" is not found')
return {}
# buffer change notification listener
def s:bufchange_listener(bnr: number, start: number, end: number, added: number, changes: list<dict<number>>)
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running
return
endif
# A buffer is saved. Send the "textDocument/didSave" LSP notification
def s:lspSavedFile()
var bnr: number = expand('<abuf>')->str2nr()
- var lspserver: dict<any> = s:bufGetServer(bnr)
+ var lspserver: dict<any> = buf.BufLspServerGet(bnr)
if lspserver->empty() || !lspserver.running
return
endif
var lspDiagPopupID: number = 0
var lspDiagPopupInfo: dict<any> = {}
def g:LspDiagExpr(): string
- var lspserver: dict<any> = s:bufGetServer(v:beval_bufnr)
+ var lspserver: dict<any> = buf.BufLspServerGet(v:beval_bufnr)
if lspserver->empty() || !lspserver.running
return ''
endif
:unlet b:LspDiagsUpdatePending
var bnr: number = bufnr()
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running
return
endif
# A new buffer is opened. If LSP is supported for this buffer, then add it
export def AddFile(bnr: number): void
- if bufnrToServer->has_key(bnr)
+ if buf.BufHasLspServer(bnr)
# LSP server for this buffer is already initialized and running
return
endif
setbufvar(bnr, '&balloonexpr', 'g:LspDiagExpr()')
- # map characters that trigger signature help
- if opt.lspOptions.showSignature &&
- lspserver.caps->has_key('signatureHelpProvider')
- var triggers = lspserver.caps.signatureHelpProvider.triggerCharacters
- for ch in triggers
- exe 'inoremap <buffer> <silent> ' .. ch .. ' ' .. ch
- .. "<C-R>=LspShowSignature()<CR>"
- endfor
- endif
+ # initialize signature help
+ signature.SignatureInit(lspserver)
# Set buffer local autocmds
augroup LSPBufferAutocmds
endif
augroup END
- bufnrToServer[bnr] = lspserver
+ buf.BufLspServerSet(bnr, lspserver)
enddef
# Notify LSP server to remove a file
export def RemoveFile(bnr: number): void
- var lspserver: dict<any> = s:bufGetServer(bnr)
+ var lspserver: dict<any> = buf.BufLspServerGet(bnr)
if lspserver->empty() || !lspserver.running
return
endif
lspserver.textdocDidClose(bnr)
diag.DiagRemoveFile(lspserver, bnr)
- bufnrToServer->remove(bnr)
+ buf.BufLspServerRemove(bnr)
enddef
# Stop all the LSP servers
return false
endif
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty()
return false
endif
return
endif
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running
return
endif
return res
endif
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running
return res
endif
# Insert mode completion handler. Used when 24x7 completion is enabled
# (default).
def g:LspComplete()
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running || !lspserver.ready
return
endif
# Display the hover message from the LSP server for the current cursor
# location
export def Hover()
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running || !lspserver.ready
return
endif
return
endif
- var lspserver: dict<any> = s:curbufGetServer()
+ var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running || !lspserver.ready
return
endif
var opt = {}
var util = {}
+var buf = {}
if has('patch-8.2.4019')
import './lspoptions.vim' as opt_import
import './util.vim' as util_import
+ import './buffer.vim' as buf_import
opt.lspOptions = opt_import.lspOptions
util.WarnMsg = util_import.WarnMsg
+ buf.CurbufGetServer = buf_import.CurbufGetServer
else
import lspOptions from './lspoptions.vim'
import {WarnMsg} from './util.vim'
+ import {CurbufGetServer} from './buffer.vim'
opt.lspOptions = lspOptions
util.WarnMsg = WarnMsg
+ buf.CurbufGetServer = CurbufGetServer
endif
+# close the signature popup window
+def s:closeSignaturePopup(lspserver: dict<any>)
+ lspserver.signaturePopup->popup_close()
+ lspserver.signaturePopup = -1
+enddef
+
+def s:closeCurBufSignaturePopup()
+ var lspserver: dict<any> = buf.CurbufGetServer()
+ if lspserver->empty()
+ return
+ endif
+
+ s:closeSignaturePopup(lspserver)
+enddef
+
+# Initialize the signature triggers for the current buffer
+export def SignatureInit(lspserver: dict<any>)
+ if !opt.lspOptions.showSignature ||
+ !lspserver.caps->has_key('signatureHelpProvider')
+ # no support for signature help
+ return
+ endif
+
+ # map characters that trigger signature help
+ for ch in lspserver.caps.signatureHelpProvider.triggerCharacters
+ exe 'inoremap <buffer> <silent> ' .. ch .. ' ' .. ch
+ .. "<C-R>=LspShowSignature()<CR>"
+ endfor
+ # close the signature popup when leaving insert mode
+ autocmd InsertLeave <buffer> call s:closeCurBufSignaturePopup()
+enddef
+
# Display the symbol signature help
export def SignatureDisplay(lspserver: dict<any>, sighelp: dict<any>): void
if sighelp->empty()
+ s:closeSignaturePopup(lspserver)
return
endif
if sighelp.signatures->len() <= 0
util.WarnMsg('No signature help available')
+ s:closeSignaturePopup(lspserver)
return
endif
endif
var sig: dict<any> = sighelp.signatures[sigidx]
- var text = sig.label
- var hllen = 0
- var startcol = 0
+ var text: string = sig.label
+ var hllen: number = 0
+ var startcol: number = 0
if sig->has_key('parameters') && sighelp->has_key('activeParameter')
var params_len = sig.parameters->len()
if params_len > 0 && sighelp.activeParameter < params_len
- var label = sig.parameters[sighelp.activeParameter].label
+ var label: string = sig.parameters[sighelp.activeParameter].label
hllen = label->len()
startcol = text->stridx(label)
endif
echoh None
echon strpart(text, startcol + hllen)
else
- var popupID = text->popup_atcursor({moved: 'any'})
- prop_type_add('signature', {bufnr: popupID->winbufnr(), highlight: 'LineNr'})
+ # Close the previous signature popup and open a new one
+ lspserver.signaturePopup->popup_close()
+
+ var popupID = text->popup_atcursor({moved: [col('.') - 1, 9999999]})
+ var bnum: number = popupID->winbufnr()
+ prop_type_add('signature', {bufnr: bnum, highlight: 'LineNr'})
if hllen > 0
- prop_add(1, startcol + 1, {bufnr: popupID->winbufnr(), length: hllen, type: 'signature'})
+ prop_add(1, startcol + 1, {bufnr: bnum, length: hllen, type: 'signature'})
endif
+ lspserver.signaturePopup = popupID
endif
enddef