1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
--- State and methods of the language server client.
-- This module table is returned when requiring the vis-lspc plugin.
-- @module lspc
-- @author Florian Fischer
-- @license GPL-3
-- @copyright Florian Fischer 2021-2024
--- Initial state of the client.
-- This includes the default configuration that can be modified in
-- your visrc.lua file.
local lspc = {
-- mapping language server names to their state tables
running = {},
open_files = {},
name = 'vis-lspc',
version = '0.1.8',
-- write log messages to lspc.log_file
logging = false,
log_file = nil,
-- automatically start a language server when a new window is opened
autostart = true,
-- program used to let the user make choices
-- The available choices are passed to <menu_cmd> on stdin separated by '\n'
menu_cmd = 'vis-menu -l 10',
-- program used to ask the user for confirmation
confirm_cmd = 'vis-menu',
-- apply workspaceEdits without confirmation
autoconfirm_edits = false,
-- should diagnostics be highlighted if available
highlight_diagnostics = 'line',
-- style id used by lspc to register the style used to highlight diagnostics
-- by default win.STYLE_LEXER_MAX is used (the last style id available for the lexer styles). See vis/ui.h.
diagnostic_style_id = nil,
-- styles used by lspc to highlight the diagnostic range
-- must be set by the user
diagnostic_styles = {
error = 'fore:red,italics,reverse',
warning = 'fore:yellow,italics,reverse',
information = 'fore:yellow,italics,reverse',
hint = 'fore:yellow,italics,reverse',
},
-- restore the position of the primary curser after applying a workspace edit
workspace_edit_remember_cursor = true,
-- message level to show in the UI when receiving messages from the server
-- Error = 1, Warning = 2, Info = 3, Log = 4
message_level = 3,
-- How to present messages to the user.
-- 'message': use vis:message; 'open': use a new split window allowing for syntax highlighting
show_message = 'message',
-- Globs that are considered to be workspace roots (e.g. ".git" or ".hg")
universal_root_globs = {},
-- Should a file's directory be used as workspace root if no explicit root was found.
fallback_dirname_as_root = false,
-- Format string how the symbols are presented in the navigation window.
-- The following arguments are passed to the string.format function:
-- indentation, symbol kind, name, line, column
navwin_symbol_format = '%s[%.1s] %s\n', -- short version
-- navwin_symbol_format = '%s[%s] %s %d:%d\n', -- verbose version
-- The layout where the navigation window will be placed.
-- The following layout identifiers are supported:
-- 'vr' -- DEFAULT: vertical right
-- 'vl' -- vertical left
-- 'ht' -- horizontal top
-- 'hb' -- horizontak bottom
navwin_layout = 'vr',
-- active navigation windows
navwins = {},
-- events
events = {
LS_INITIALIZED = 'LspcEvent::LS_INITIALIZED',
LS_DID_OPEN = 'LspcEvent::LS_DID_OPEN',
},
}
-- check if fzf is available and use fzf instead of vis-menu per default
if os.execute('type fzf >/dev/null 2>/dev/null') then
lspc.menu_cmd = 'fzf'
end
local supported_markup_kind = {'markdown'}
local goto_methods_capabilities = {
linkSupport = true,
dynamicRegistration = false,
}
--- ClientCapabilities we tell the language server when calling "initialize".
local client_capabilites = {
workspace = {
configuration = true,
didChangeConfiguration = {dynamicRegistration = false},
},
textDocument = {
synchronization = {dynamicRegistration = false, didSave = true},
-- ask the server to send us only markdown completionItems
completion = {
dynamicRegistration = false,
completionItem = {documentationFormat = supported_markup_kind},
},
-- ask the server to send us only markdown hover results
hover = {dynamicRegistration = false, contentFormat = supported_markup_kind},
-- ask the server to send us only markdown signatureHelp results
signatureHelp = {
dynamicRegistration = false,
signatureInformation = {documentationFormat = supported_markup_kind},
},
declaration = {dynamicRegistration = false, linkSupport = true},
definition = goto_methods_capabilities,
publishDiagnostics = {relatedInformation = false},
diagnostic = {dynamicRegistration = false},
typeDefinition = goto_methods_capabilities,
implementation = goto_methods_capabilities,
references = {dynamicRegistration = false},
rename = {
dynamicRegistration = false,
prepareSupport = false,
honorsChangeAnnotations = false,
},
},
window = {workDoneProgress = false, showDocument = {support = false}},
}
lspc.client_capabilites = client_capabilites
local Lspc = {}
--- Log a message.
-- @string: the message to log
function Lspc:log(msg)
self.logger:log(msg)
end
--- Present a warning to the user.
-- @string: the warning message
function Lspc:warn(msg)
local warning = 'LSPC Warning: ' .. msg
self.logger:log(warning)
vis:info(warning)
end
--- Present an error to the user.
-- @string: the error message
function Lspc:err(msg)
local warning = 'LSPC Error: ' .. msg
self.logger:log(warning)
vis:info(warning)
end
setmetatable(lspc, {__index = Lspc})
return lspc
|