99 lines
2.3 KiB
Lua
99 lines
2.3 KiB
Lua
local user_config = require('cosmic.core.user')
|
|
local M = {}
|
|
|
|
M.format_disabled_override = false
|
|
|
|
local function can_client_format(client)
|
|
-- formatting enabled by default if server=true
|
|
if user_config.lsp.servers[client.name] == true or client.name == 'null-ls' then
|
|
return true
|
|
end
|
|
|
|
-- check config server settings
|
|
if user_config.lsp.servers[client.name] then
|
|
-- default to true if no format flag on server settings is set
|
|
if user_config.lsp.servers[client.name].format == nil then
|
|
return true
|
|
end
|
|
|
|
-- check format flag on server settings
|
|
return (user_config.lsp.servers[client.name].format == true)
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function M.toggle_format_on_save()
|
|
M.format_disabled_override = not M.format_disabled_override
|
|
vim.notify(string.format('Format on save disabled: %s', M.format_disabled_override))
|
|
end
|
|
|
|
-- format current buffer w/user settings
|
|
function M.format(bufnr, timeout)
|
|
if timeout ~= '' then
|
|
timeout = timeout * 1000
|
|
else
|
|
timeout = user_config.lsp.format_timeout
|
|
end
|
|
timeout = user_config.lsp.format_timeout
|
|
local filter = can_client_format
|
|
if M.format_disabled_override then
|
|
filter = function(client)
|
|
return false
|
|
end
|
|
end
|
|
vim.lsp.buf.format({
|
|
timeout_ms = timeout,
|
|
filter = filter,
|
|
bufnr = bufnr or 0,
|
|
})
|
|
end
|
|
|
|
function M.get_active_lsp_client_names()
|
|
local active_clients = vim.lsp.get_clients()
|
|
local client_names = {}
|
|
for _, client in pairs(active_clients or {}) do
|
|
local buf = vim.api.nvim_get_current_buf()
|
|
-- only return attached buffers
|
|
if vim.lsp.buf_is_attached(buf, client.id) then
|
|
table.insert(client_names, client.name)
|
|
end
|
|
end
|
|
|
|
if not vim.tbl_isempty(client_names) then
|
|
table.sort(client_names)
|
|
end
|
|
return client_names
|
|
end
|
|
|
|
function M.get_lsp_status_str()
|
|
local clients = M.get_active_lsp_client_names()
|
|
local client_str = ''
|
|
|
|
if #clients < 1 then
|
|
return client_str
|
|
end
|
|
|
|
for i, client in ipairs(clients) do
|
|
client_str = client_str .. client
|
|
if i < #clients then
|
|
client_str = client_str .. ', '
|
|
end
|
|
end
|
|
|
|
if client_str:len() < 1 then
|
|
return
|
|
end
|
|
|
|
return client_str
|
|
end
|
|
|
|
function M.toggle_inlay_hints()
|
|
local enabled = user_config.lsp.inlay_hint
|
|
return function()
|
|
enabled = not enabled
|
|
vim.lsp.inlay_hint(vim.api.nvim_get_current_buf() or 0, enabled)
|
|
end
|
|
end
|
|
|
|
return M
|