enddef
# Called after leaving insert mode. Used to process diag messages (if any)
-def g:LspLeftInsertMode()
+def LspLeftInsertMode()
if !exists('b:LspDiagsUpdatePending')
return
endif
diag.UpdateDiags(lspserver, bnr)
enddef
+# Add buffer-local autocmds when attaching a LSP server to a buffer
+def AddBufLocalAutocmds(lspserver: dict<any>, bnr: number): void
+ var acmds: list<dict<any>> = []
+
+ # file saved notification handler
+ acmds->add({bufnr: bnr,
+ event: 'BufWritePost',
+ group: 'LSPBufferAutocmds',
+ cmd: 'LspSavedFile()'})
+
+ # Update the diagnostics when insert mode is stopped
+ acmds->add({bufnr: bnr,
+ event: 'InsertLeave',
+ group: 'LSPBufferAutocmds',
+ cmd: 'LspLeftInsertMode()'})
+
+ # Insert-mode completion autocmds (if configured)
+ if opt.lspOptions.autoComplete
+ # Trigger 24x7 insert mode completion when text is changed
+ acmds->add({bufnr: bnr,
+ event: 'TextChangedI',
+ group: 'LSPBufferAutocmds',
+ cmd: 'LspComplete()'})
+ if lspserver.completionLazyDoc
+ # resolve additional documentation for a selected item
+ acmds->add({bufnr: bnr,
+ event: 'CompleteChanged',
+ group: 'LSPBufferAutocmds',
+ cmd: 'LspResolve()'})
+ endif
+ endif
+
+ # Auto highlight all the occurrences of the current keyword
+ if opt.lspOptions.autoHighlight &&
+ lspserver.caps->get('documentHighlightProvider', false)
+ acmds->add({bufnr: bnr,
+ event: 'CursorMoved',
+ group: 'LSPBufferAutocmds',
+ cmd: 'call LspDocHighlightClear() | call LspDocHighlight()'})
+ endif
+
+ autocmd_add(acmds)
+
+enddef
+
def BufferInit(bnr: number): void
var lspserver: dict<any> = buf.BufLspServerGet(bnr)
if lspserver->empty() || !lspserver.running
# initialize signature help
signature.SignatureInit(lspserver)
- # Set buffer local autocmds
- augroup LSPBufferAutocmds
- # file saved notification handler
- exe $'autocmd BufWritePost <buffer={bnr}> call LspSavedFile()'
-
- if opt.lspOptions.autoComplete
- # Trigger 24x7 insert mode completion when text is changed
- exe $'autocmd TextChangedI <buffer={bnr}> call LspComplete()'
- if lspserver.completionLazyDoc
- exe $'autocmd CompleteChanged <buffer={bnr}> call LspResolve()'
- endif
- endif
-
- # Update the diagnostics when insert mode is stopped
- exe $'autocmd InsertLeave <buffer={bnr}> call LspLeftInsertMode()'
-
- if opt.lspOptions.autoHighlight &&
- lspserver.caps->get('documentHighlightProvider', false)
- # Highlight all the occurrences of the current keyword
- exe $'autocmd CursorMoved <buffer={bnr}> call LspDocHighlightClear() | call LspDocHighlight()'
- endif
- augroup END
+ AddBufLocalAutocmds(lspserver, bnr)
if exists('#User#LspAttached')
doautocmd <nomodeline> User LspAttached
endif
-
enddef
# A new buffer is opened. If LSP is supported for this buffer, then add it
BufferInit(bnr)
else
augroup LSPBufferAutocmds
- exe $'autocmd User LspServerReady{lspserver.name} ++once call BufferInit({bnr})'
+ exe $'autocmd User LspServerReady{lspserver.name} ++once BufferInit({bnr})'
augroup END
endif
# Insert mode completion handler. Used when 24x7 completion is enabled
# (default).
-def g:LspComplete()
+def LspComplete()
var lspserver: dict<any> = buf.CurbufGetServer()
if lspserver->empty() || !lspserver.running || !lspserver.ready
return
enddef
# Lazy complete documentation handler
-def g:LspResolve()
+def LspResolve()
var lspserver: dict<any> = CurbufGetServerChecked()
if lspserver->empty()
return
# when the outline window is closed, do the cleanup
def OutlineCleanup()
# Remove the outline autocommands
- :silent! autocmd! LSPOutline
+ silent! autocmd_delete([{group: 'LSPOutline'}])
:silent! syntax clear LSPTitle
enddef
prop_type_add('LspOutlineHighlight', {bufnr: bufnr(), highlight: 'Search'})
- augroup LSPOutline
- au!
- autocmd BufEnter * call g:LspRequestDocSymbols()
- # when the outline window is closed, do the cleanup
- autocmd BufUnload LSP-Outline call OutlineCleanup()
- autocmd CursorHold * call OutlineHighlightCurrentSymbol()
- augroup END
+ try
+ autocmd_delete([{group: 'LSPOutline', event: '*'}])
+ catch /E367:/
+ endtry
+ var acmds: list<dict<any>>
+
+ # Refresh or add the symbols in a buffer to the outline window
+ acmds->add({event: 'BufEnter',
+ group: 'LSPOutline',
+ pattern: '*',
+ cmd: 'call g:LspRequestDocSymbols()'})
+
+ # when the outline window is closed, do the cleanup
+ acmds->add({event: 'BufUnload',
+ group: 'LSPOutline',
+ pattern: 'LSP-Outline',
+ cmd: 'OutlineCleanup()'})
+
+ # Highlight the current symbol when the cursor is not moved for sometime
+ acmds->add({event: 'CursorHold',
+ group: 'LSPOutline',
+ pattern: '*',
+ cmd: 'OutlineHighlightCurrentSymbol()'})
+
+ autocmd_add(acmds)
prevWinID->win_gotoid()
enddef