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
|
local configs = require 'lspconfig/configs'
local lspui = require 'lspconfig/_lspui'
return function ()
-- These options need to be cached before switching to the floating
-- buffer.
local buf_clients = vim.lsp.buf_get_clients()
local clients = vim.lsp.get_active_clients()
local buffer_filetype = vim.bo.filetype
local buffer_dir = vim.fn.expand('%:p:h')
local win_info = lspui.percentage_range_window(0.8, 0.7)
local bufnr, win_id = win_info.bufnr, win_info.win_id
local buf_lines = {}
local header = {
"Available servers:",
"\t"..table.concat(vim.tbl_keys(configs), ', '),
"",
"Clients attached to this buffer: "..tostring(#buf_clients)
}
vim.list_extend(buf_lines, header)
local function trim_whitespace(cmd)
local trimmed_cmd = {}
for _, str in ipairs(cmd) do
table.insert(trimmed_cmd, str:match'^%s*(.*)')
end
return trimmed_cmd
end
local function remove_newlines(cmd)
cmd = trim_whitespace(cmd)
cmd = table.concat(cmd, ' ')
cmd = vim.split(cmd, '\n')
cmd = trim_whitespace(cmd)
cmd = table.concat(cmd, ' ')
return cmd
end
local function make_client_info(client)
return {
"",
"Client: "..tostring(client.id),
"\tname: "..client.name,
"\troot: "..client.workspaceFolders[1].name,
"\tfiletypes: "..table.concat(client.config.filetypes or {}, ', '),
"\tcmd: "..remove_newlines(client.config.cmd),
}
end
for _, client in ipairs(buf_clients) do
local client_info = make_client_info(client)
vim.list_extend(buf_lines, client_info)
end
local active_section_header = {
"",
"Total active clients: "..tostring(#clients),
}
vim.list_extend(buf_lines, active_section_header)
for _, client in ipairs(clients) do
local client_info = make_client_info(client)
vim.list_extend(buf_lines, client_info)
end
local matching_config_header = {
"",
"Clients that match the current buffer filetype:",
}
local cmd_not_found_msg = "False. Please check your path and ensure the server is installed"
vim.list_extend(buf_lines, matching_config_header)
for _, config in pairs(configs) do
local cmd_is_executable, cmd
if config.cmd then
cmd = remove_newlines(config.cmd)
if vim.fn.executable(config.cmd[1]) == 1 then
cmd_is_executable = "True"
else
cmd_is_executable = cmd_not_found_msg
end
else
cmd = "cmd not defined"
cmd_is_executable = cmd
end
if config.filetypes then
for _, filetype_match in ipairs(config.filetypes) do
if buffer_filetype == filetype_match then
local matching_config_info = {
"",
"Config: "..config.name,
"\tcmd: "..cmd,
"\tcmd is executable: ".. cmd_is_executable,
"\tidentified root: "..(config.get_root_dir(buffer_dir) or "None"),
"\tcustom handlers: "..table.concat(vim.tbl_keys(config.handlers), ", "),
}
vim.list_extend(buf_lines, matching_config_info)
end
end
else
local matching_config_info = {
"",
"Config: "..config.name,
"\tfiletype: ".."No filetypes defined, please define filetypes in setup().",
}
vim.list_extend(buf_lines, matching_config_info)
end
end
buf_lines = vim.lsp.util._trim_and_pad(buf_lines, { pad_left = 2, pad_top = 1})
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, buf_lines )
vim.fn.matchadd("Title", table.concat(vim.tbl_keys(configs), '\\|'))
vim.fn.matchadd("Error",
"No filetypes defined, please define filetypes in setup().\\|"..
"cmd not defined\\|" ..
cmd_not_found_msg)
vim.api.nvim_buf_set_keymap(bufnr, 'n', '<esc>', '<cmd>bd<CR>', { noremap = true})
vim.lsp.util.close_preview_autocmd({"BufHidden", "BufLeave"}, win_id)
end;
|