# List of diagnostics for each opened file
var diagsMap: dict<any> = {}
-var lsp_log_dir: string = '/tmp/'
-
prop_type_add('LspTextRef', {'highlight': 'Search'})
prop_type_add('LspReadRef', {'highlight': 'DiffChange'})
prop_type_add('LspWriteRef', {'highlight': 'DiffDelete'})
# Return the LSP server for the a specific filetype. Returns a null dict if
# the server is not found.
-def LspGetServer(ftype: string): dict<any>
+def s:lspGetServer(ftype: string): dict<any>
return ftypeServerMap->get(ftype, {})
enddef
# Add a LSP server for a filetype
-def LspAddServer(ftype: string, lspserver: dict<any>)
+def s:lspAddServer(ftype: string, lspserver: dict<any>)
ftypeServerMap->extend({[ftype]: lspserver})
enddef
+# Lsp server trace log directory
+var lsp_log_dir: string = '/tmp/'
+var lsp_server_trace: bool = v:false
+
+def lsp#enableServerTrace()
+ lsp_server_trace = v:true
+enddef
+
+# Log a message from the LSP server. stderr is v:true for logging messages
+# from the standard error and v:false for stdout.
+def s:traceLog(stderr: bool, msg: string)
+ if !lsp_server_trace
+ return
+ endif
+ if stderr
+ writefile(split(msg, "\n"), lsp_log_dir .. 'lsp_server.err', 'a')
+ else
+ writefile(split(msg, "\n"), lsp_log_dir .. 'lsp_server.out', 'a')
+ endif
+enddef
+
+# Empty out the LSP server trace logs
+def s:clearTraceLogs()
+ if !lsp_server_trace
+ return
+ endif
+ writefile([], lsp_log_dir .. 'lsp_server.out')
+ writefile([], lsp_log_dir .. 'lsp_server.err')
+enddef
+
# Show information about all the LSP servers
def lsp#showServers()
for [ftype, lspserver] in items(ftypeServerMap)
# LSP server standard output handler
def lsp#output_cb(lspserver: dict<any>, chan: channel, msg: string): void
- writefile(split(msg, "\n"), lsp_log_dir .. 'lsp_server.out', 'a')
+ s:traceLog(v:false, msg)
lspserver.data = lspserver.data .. msg
lspserver.processMessages()
enddef
# LSP server error output handler
def lsp#error_cb(lspserver: dict<any>, chan: channel, emsg: string,): void
- writefile(split(emsg, "\n"), lsp_log_dir .. 'lsp_server.err', 'a')
+ s:traceLog(v:true, emsg)
enddef
# LSP server exit callback
'err_cb': function('lsp#error_cb', [lspserver]),
'exit_cb': function('lsp#exit_cb', [lspserver])}
- writefile([], lsp_log_dir .. 'lsp_server.out')
- writefile([], lsp_log_dir .. 'lsp_server.err')
+ s:clearTraceLogs()
lspserver.data = ''
lspserver.caps = {}
lspserver.nextID = 1
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return ''
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return ''
# buffer change notification listener
def lsp#bufchange_listener(bnum: number, start: number, end: number, added: number, changes: list<dict<number>>)
var ftype = bnum->getbufvar('&filetype')
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty() || !lspserver.running
return
endif
def s:lspSavedFile()
var bnr: number = str2nr(expand('<abuf>'))
var ftype: string = bnr->getbufvar('&filetype')
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty() || !lspserver.running
return
endif
if ftype == ''
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
return
endif
if fname == '' || ftype == ''
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty() || !lspserver.running
return
endif
})
if type(server.filetype) == v:t_string
- LspAddServer(server.filetype, lspserver)
+ s:lspAddServer(server.filetype, lspserver)
elseif type(server.filetype) == v:t_list
for ftype in server.filetype
- LspAddServer(ftype, lspserver)
+ s:lspAddServer(ftype, lspserver)
endfor
else
ErrMsg('Error: Unsupported file type information "' .. string(server.filetype)
# Insert mode completion handler
def lsp#completeFunc(findstart: number, base: string): any
var ftype: string = &filetype
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if findstart
if lspserver->empty()
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
return
endif
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var lspserver: dict<any> = LspGetServer(ftype)
+ var lspserver: dict<any> = s:lspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return