# Return the LSP server for the given file type. Returns null dict if server
# is not found.
-def LSPgetServer(ftype: string): dict<any>
+def LspGetServer(ftype: string): dict<any>
return ftypeServerMap->get(ftype, {})
enddef
+# Convert a LSP file URI to a Vim file name
+def LspUriToFile(uri: string): string
+ return uri[7:]
+enddef
+
+# Convert a Vim filenmae to an LSP URI
+def LspFileToUri(fname: string): string
+ return 'file://' .. fnamemodify(fname, ':p')
+enddef
+
# process the 'initialize' method reply from the LSP server
def LSP_processInitializeReply(lspserver: dict<any>, req: dict<any>, reply: dict<any>): void
if reply.result->len() <= 0
endif
var result: dict<any> = reply.result[0]
- var file = result.uri[7:]
+ var file = LspUriToFile(result.uri)
var wid = bufwinid(file)
if wid != -1
win_gotoid(wid)
else
exe 'split ' .. file
endif
+ # Set the previous cursor location mark
+ setpos("'`", getcurpos())
cursor(result.range.start.line + 1, result.range.start.character + 1)
redraw!
enddef
var locations: list<dict<any>> = reply.result
var qflist: list<dict<any>> = []
for loc in locations
- var fname: string = loc.uri[7:]
+ var fname: string = LspUriToFile(loc.uri)
var text: string = fname->getbufline(loc.range.start.line + 1)[0]
->trim("\t ", 1)
qflist->add({'filename': fname,
return
endif
- var fname: string = req.params.textDocument.uri[7:]
+ var fname: string = LspUriToFile(req.params.textDocument.uri)
var bnum = bufnr(fname)
for docHL in reply.result
var symbols: dict<list<dict<any>>>
var symbolType: string
- var fname: string = req.params.textDocument.uri[7:]
+ var fname: string = LspUriToFile(req.params.textDocument.uri)
for symbol in reply.result
if symbol->has_key('location')
symbolType = LSP_symbolKindToName(symbol.kind)
enddef
def LSP_processDiagNotif(lspserver: dict<any>, reply: dict<any>): void
- var fname: string = reply.params.uri[7:]
+ var fname: string = LspUriToFile(reply.params.uri)
diagsMap->extend({[fname]: reply.params.diagnostics})
enddef
# interface DidOpenTextDocumentParams
# interface TextDocumentItem
var tdi = {}
- tdi.uri = 'file://' .. fnamemodify(bufname(bnum), ':p')
+ tdi.uri = LspFileToUri(bufname(bnum))
tdi.languageId = ftype
tdi.version = 1
tdi.text = getbufline(bnum, 1, '$')->join("\n") .. "\n"
# interface DidCloseTextDocumentParams
# interface TextDocumentIdentifier
var tdid = {}
- tdid.uri = 'file://' .. fname
+ tdid.uri = LspFileToUri(fname)
notif.params->extend({'textDocument': tdid})
LSP_sendToServer(lspserver, notif)
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname: string = expand('%:p')
+ var fname: string = @%
if fname == ''
return
endif
# interface DefinitionParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname: string = expand('%:p')
+ var fname: string = @%
if fname == ''
return
endif
# interface DeclarationParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname: string = expand('%:p')
+ var fname: string = @%
if fname == ''
return
endif
# interface TypeDefinitionParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname: string = expand('%:p')
+ var fname: string = @%
if fname == ''
return
endif
# interface ImplementationParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
return ''
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return ''
return ''
endif
- var fname: string = expand('%:p')
+ var fname: string = @%
if fname == ''
return ''
endif
# interface SignatureHelpParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
# buffer change notification listener
def lsp#bufchange_listener(bnum: number, start: number, end: number, added: number, changes: list<dict<number>>)
var ftype = getbufvar(bnum, '&filetype')
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty() || !lspserver.running
return
endif
# interface DidChangeTextDocumentParams
# interface VersionedTextDocumentIdentifier
var vtdid: dict<any> = {}
- vtdid.uri = 'file://' .. fnamemodify(bufname(bnum), ':p')
+ vtdid.uri = LspFileToUri(bufname(bnum))
# Use Vim 'changedtick' as the LSP document version number
vtdid.version = getbufvar(bnum, 'changedtick')
notif.params->extend({'textDocument': vtdid})
if ftype == ''
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
return
endif
if fname == '' || ftype == ''
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty() || !lspserver.running
return
endif
return
endif
- var fname = expand('%:p')
+ var fname = @%
if fname == ''
return
endif
# interface CompletionParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
# 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> = LspGetServer(ftype)
if findstart
if lspserver->empty()
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname = expand('%:p')
+ var fname = @%
if fname == ''
return
endif
# interface HoverParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname = expand('%:p')
+ var fname = @%
if fname == ''
return
endif
# interface ReferenceParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
req.params->extend({'context': {'includeDeclaration': v:true}})
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname = expand('%:p')
+ var fname = @%
if fname == ''
return
endif
# interface DocumentHighlightParams
# interface TextDocumentPositionParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
# interface Position
req.params->extend({'position': {'line': lnum, 'character': col}})
return
endif
- var lspserver: dict<any> = LSPgetServer(ftype)
+ var lspserver: dict<any> = LspGetServer(ftype)
if lspserver->empty()
ErrMsg('Error: LSP server for "' .. ftype .. '" filetype is not found')
return
return
endif
- var fname = expand('%:p')
+ var fname = @%
if fname == ''
return
endif
var req = LSP_createReqMsg(lspserver, 'textDocument/documentSymbol')
# interface DocumentSymbolParams
# interface TextDocumentIdentifier
- req.params->extend({'textDocument': {'uri': 'file://' .. fname}})
+ req.params->extend({'textDocument': {'uri': LspFileToUri(fname)}})
LSP_sendToServer(lspserver, req)
enddef