From c9870eaa92f0f69b1e43fd65a882f4c19150461f Mon Sep 17 00:00:00 2001 From: Roberto Castagnola Date: Sat, 22 Oct 2022 17:05:40 +0200 Subject: [PATCH] Initialize buffer with autocmd when LSP server not yet ready --- autoload/lsp/handlers.vim | 18 ++--------- autoload/lsp/lsp.vim | 65 ++++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/autoload/lsp/handlers.vim b/autoload/lsp/handlers.vim index 0523b55..951bae9 100644 --- a/autoload/lsp/handlers.vim +++ b/autoload/lsp/handlers.vim @@ -24,29 +24,17 @@ def ProcessInitializeReply(lspserver: dict, req: dict, reply: dict = reply.result.capabilities lspserver.caps = caps - # TODO: Check all the buffers with filetype corresponding to this LSP server - # and then setup the below mapping for those buffers. - - # initialize signature help - signature.SignatureInit(lspserver) - if opt.lspOptions.autoComplete && caps->has_key('completionProvider') var triggers = caps.completionProvider.triggerCharacters lspserver.completionTriggerChars = triggers endif - if opt.lspOptions.autoHighlight && caps->has_key('documentHighlightProvider') - && caps.documentHighlightProvider - # Highlight all the occurrences of the current keyword - augroup LSPBufferAutocmds - autocmd CursorMoved call g:LspDocHighlightClear() - | call g:LspDocHighlight() - augroup END - endif - # send a "initialized" notification to server lspserver.sendInitializedNotif() lspserver.ready = true + if exists('#User#LspServerReady' .. lspserver.name) + exe $'doautocmd User LspServerReady{lspserver.name}' + endif # if the outline window is opened, then request the symbols for the current # buffer diff --git a/autoload/lsp/lsp.vim b/autoload/lsp/lsp.vim index bd44800..80dc971 100644 --- a/autoload/lsp/lsp.vim +++ b/autoload/lsp/lsp.vim @@ -240,32 +240,13 @@ def g:LspLeftInsertMode() diag.UpdateDiags(lspserver, bnr) enddef -# A new buffer is opened. If LSP is supported for this buffer, then add it -export def AddFile(bnr: number): void - if buf.BufHasLspServer(bnr) - # LSP server for this buffer is already initialized and running - return - endif - - # Skip remote files - if util.LspUriRemote(bnr->bufname()->fnamemodify(":p")) +def BufferInit(bnr: number): void + var lspserver: dict = buf.BufLspServerGet(bnr) + if lspserver->empty() || !lspserver.running return endif var ftype: string = bnr->getbufvar('&filetype') - if ftype == '' - return - endif - var lspserver: dict = LspGetServer(ftype) - if lspserver->empty() - return - endif - if !lspserver.running - if !lspInitializedOnce - LspInitOnce() - endif - lspserver.startServer() - endif lspserver.textdocDidOpen(bnr, ftype) # add a listener to track changes to this buffer @@ -315,7 +296,44 @@ export def AddFile(bnr: number): void doautocmd User LspAttached endif +enddef + +# A new buffer is opened. If LSP is supported for this buffer, then add it +export def AddFile(bnr: number): void + if buf.BufHasLspServer(bnr) + # LSP server for this buffer is already initialized and running + return + endif + + # Skip remote files + if util.LspUriRemote(bnr->bufname()->fnamemodify(":p")) + return + endif + + var ftype: string = bnr->getbufvar('&filetype') + if ftype == '' + return + endif + var lspserver: dict = LspGetServer(ftype) + if lspserver->empty() + return + endif + if !lspserver.running + if !lspInitializedOnce + LspInitOnce() + endif + lspserver.startServer() + endif buf.BufLspServerSet(bnr, lspserver) + + if lspserver.ready + BufferInit(bnr) + else + augroup LSPBufferAutocmds + exe $'autocmd User LspServerReady{lspserver.name} ++once call BufferInit({bnr})' + augroup END + endif + enddef # Notify LSP server to remove a file @@ -422,10 +440,13 @@ export def AddServer(serverList: list>) initializationOptions) if server.filetype->type() == v:t_string + lspserver.name = server.filetype->substitute('\w\+', '\L\u\0', '') LspAddServer(server.filetype, lspserver) LspOmniComplSet(server.filetype, server.omnicompl) elseif server.filetype->type() == v:t_list + lspserver.name = '' for ftype in server.filetype + lspserver.name ..= ftype->substitute('\w\+', '\L\u\0', '') LspAddServer(ftype, lspserver) LspOmniComplSet(ftype, server.omnicompl) endfor -- 2.48.1