]> Sergey Matveev's repositories - vim-lsp.git/commitdiff
Initialize buffer with autocmd when LSP server not yet ready
authorRoberto Castagnola <roberto.castagnola@gmail.com>
Sat, 22 Oct 2022 15:05:40 +0000 (17:05 +0200)
committerRoberto Castagnola <roberto.castagnola@gmail.com>
Sat, 22 Oct 2022 18:33:21 +0000 (20:33 +0200)
autoload/lsp/handlers.vim
autoload/lsp/lsp.vim

index 0523b55435a6b80cf1abd12546f62d37f9b82e3f..951bae9ac7c5f2574496d791eb2237806db02c46 100644 (file)
@@ -24,29 +24,17 @@ def ProcessInitializeReply(lspserver: dict<any>, req: dict<any>, reply: dict<any
   var caps: dict<any> = 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 <buffer> 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 <nomodeline> User LspServerReady{lspserver.name}'
+  endif
 
   # if the outline window is opened, then request the symbols for the current
   # buffer
index bd4480065b84a75875713979424bba8134f666eb..80dc97105ec5d8cc086a704e9e08b5e590c51dde 100644 (file)
@@ -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<any> = buf.BufLspServerGet(bnr)
+  if lspserver->empty() || !lspserver.running
     return
   endif
 
   var ftype: string = bnr->getbufvar('&filetype')
-  if ftype == ''
-    return
-  endif
-  var lspserver: dict<any> = 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 <nomodeline> 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<any> = 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<dict<any>>)
                                                    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