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
|
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 buf_client_names = {}
for _, client in ipairs(buf_clients) do
table.insert(buf_client_names, client.name)
end
local header = {
"Configured servers: "..table.concat(vim.tbl_keys(configs), ', '),
"",
tostring(#buf_clients).." client(s) attached to this buffer: "..table.concat(buf_client_names, ', '),
}
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 indent = " "
local function make_client_info(client)
return {
"",
indent.."Client: "..client.name.." (id "..tostring(client.id)..")",
indent.."\troot: "..client.workspaceFolders[1].name,
indent.."\tfiletypes: "..table.concat(client.config.filetypes or {}, ', '),
indent.."\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 = {
"",
tostring(#clients).." active client(s): ",
}
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 filetype "..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 = {
indent.."",
indent.."Config: "..config.name,
indent.."\tcmd: "..cmd,
indent.."\tcmd is executable: ".. cmd_is_executable,
indent.."\tidentified root: "..(config.get_root_dir(buffer_dir) or "None"),
indent.."\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.api.nvim_buf_set_option(bufnr,'modifiable',false)
vim.fn.matchadd("Title", table.concat(vim.tbl_keys(configs), '\\|'))
vim.fn.matchadd("Title", buffer_filetype)
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;
|