108 lines
3.6 KiB
Lua
108 lines
3.6 KiB
Lua
-- lua/plugins/lsp.lua
|
||
return {
|
||
{
|
||
"neovim/nvim-lspconfig",
|
||
config = function()
|
||
---------------------------------------------------------------------------
|
||
-- LSP client utilities
|
||
---------------------------------------------------------------------------
|
||
vim.api.nvim_create_user_command("LspClients", function()
|
||
-- new API: vim.lsp.get_clients
|
||
local clients = vim.lsp.get_clients()
|
||
local client_counts = {}
|
||
|
||
for _, client in ipairs(clients) do
|
||
client_counts[client.name] = (client_counts[client.name] or 0) + 1
|
||
end
|
||
|
||
print("=== Active LSP Clients ===")
|
||
for name, count in pairs(client_counts) do
|
||
local status = count > 1 and " ⚠️ DUPLICATE" or " ✅"
|
||
print(string.format("%s: %d client(s)%s", name, count, status))
|
||
end
|
||
|
||
if next(client_counts) == nil then
|
||
print("No active LSP clients")
|
||
end
|
||
end, { desc = "Show active LSP clients and detect duplicates" })
|
||
|
||
vim.api.nvim_create_user_command("LspKillDuplicates", function()
|
||
-- only worry about duplicate gopls, since that’s your main concern
|
||
local gopls_clients = vim.lsp.get_clients({ name = "gopls" })
|
||
if #gopls_clients <= 1 then
|
||
print("No duplicate gopls clients found")
|
||
return
|
||
end
|
||
|
||
local client_to_keep = nil
|
||
local clients_to_kill = {}
|
||
|
||
for _, client in ipairs(gopls_clients) do
|
||
local settings_count = 0
|
||
if client.config.settings and client.config.settings.gopls then
|
||
for _ in pairs(client.config.settings.gopls) do
|
||
settings_count = settings_count + 1
|
||
end
|
||
end
|
||
|
||
if settings_count > 0 and not client_to_keep then
|
||
client_to_keep = client
|
||
else
|
||
table.insert(clients_to_kill, client)
|
||
end
|
||
end
|
||
|
||
for _, client in ipairs(clients_to_kill) do
|
||
print(string.format("Killing duplicate gopls client (id: %d)", client.id))
|
||
client.stop(true)
|
||
end
|
||
|
||
if client_to_keep then
|
||
print(string.format("Kept gopls client (id: %d) with settings", client_to_keep.id))
|
||
end
|
||
end, { desc = "Kill duplicate gopls clients" })
|
||
|
||
---------------------------------------------------------------------------
|
||
-- Hover safety + keymaps
|
||
---------------------------------------------------------------------------
|
||
local function has_hover(bufnr)
|
||
local clients = vim.lsp.get_clients({ bufnr = bufnr })
|
||
for _, c in pairs(clients) do
|
||
if c.server_capabilities and c.server_capabilities.hoverProvider then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
vim.api.nvim_create_autocmd("LspAttach", {
|
||
callback = function(args)
|
||
local bufnr = args.buf
|
||
local lsp_keymaps = require("plugins.lsp-keymaps")
|
||
lsp_keymaps.on_attach(nil, bufnr)
|
||
|
||
local function buf_map(mode, lhs, rhs, desc)
|
||
vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc })
|
||
end
|
||
|
||
-- K = hover (safe)
|
||
buf_map("n", "K", function()
|
||
if not has_hover(bufnr) then
|
||
return
|
||
end
|
||
local ok, saga_hover = pcall(require, "lspsaga.hover")
|
||
if ok and saga_hover and saga_hover.render_hover_doc then
|
||
pcall(function()
|
||
saga_hover:render_hover_doc()
|
||
end)
|
||
else
|
||
pcall(vim.lsp.buf.hover)
|
||
end
|
||
end, "LSP: Hover (safe)")
|
||
end,
|
||
})
|
||
end,
|
||
},
|
||
}
|
||
|