Files
nvim/lua/lsp/init.lua
T

201 lines
7.0 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--[[
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣷⣦⣄⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠚⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠗⢀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣄⡉⠓⠦⣌⡙⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⢋⣡⠴⠚⢉⣠⣤⣀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⣿⣿⣿⣿⣿⣷⣦⣄⡉⠓⠦⣌⡙⠻⢿⣿⣿⣿⣿⣿⣿⡿⠟⢋⣡⠴⠚⢉⣠⣴⣾⣿⣿⣿⣿⣿⣶⣤
⠀⠀⠀⠀⠀⠀⠀⠀⠐⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠓⠦⣌⡙⠻⠟⢋⣡⠴⠚⢉⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⠂
⠀⠀⠀⠀⢀⣠⣴⣆⡈⠻⢿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠃⠘⢉⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢁⣰⣦⣄⡀
⠀⠀⠐⠾⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠷⠂
⠀⢸⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⡇
⠀⢸⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⣦⣄⡉⠛⠿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⡇
⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⡆⢰⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠃⠘⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⡇⢸⣿⣿⣿⣿⠿⠛⠉
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⡇⢸⠿⠛⠉
__ _ _
/ _|___ ___| |_ __ _ ___| | __
| ||_ /____/ __| __/ _` |/ __| |/ /
| _/ /_____\__ \ || (_| | (__| <
|_|/___| |___/\__\__,_|\___|_|\_\
Neovim v0.12 configuration
(C) Frank Zechert 2026
]]
vim.pack.add({
{ src = "https://github.com/neovim/nvim-lspconfig" },
})
require("lsp.lua_ls")
local function run_healthcheck(section)
local before = {}
for _, b in ipairs(vim.api.nvim_list_bufs()) do
before[b] = true
end
vim.cmd("silent checkhealth " .. section)
local after = vim.api.nvim_list_bufs()
local health_buf = nil
for _, b in ipairs(after) do
if not before[b] then
health_buf = b
break
end
end
if not health_buf then
return { "Could not capture :checkhealth vim.lsp output" }
end
-- Read lines
local lines = vim.api.nvim_buf_get_lines(health_buf, 0, -1, false)
-- Close the health window
for _, win in ipairs(vim.api.nvim_list_wins()) do
if vim.api.nvim_win_get_buf(win) == health_buf then
vim.api.nvim_win_close(win, true)
end
end
return lines
end
local function get_all_treesitter_languages()
local bufnr = 0
local ok, parser = pcall(vim.treesitter.get_parser, bufnr)
if not ok or not parser then
return {}
end
local langs = { parser:lang() }
for _, child in ipairs(parser:children()) do
table.insert(langs, child:lang())
end
return langs
end
local function get_treesitter_status()
local bufnr = 0
local ok, parser = pcall(vim.treesitter.get_parser, bufnr)
if not ok or not parser then
return {
"Treesitter:",
" active: no",
" parsers: none",
}
end
local langs = get_all_treesitter_languages()
return {
"Treesitter:",
" active: yes",
" parsers: " .. table.concat(langs, ", "),
}
end
local function show_lsp_details()
local popup_buffer = vim.api.nvim_create_buf(false, true)
local lsp_clients = vim.lsp.get_clients({ bufnr = 0 })
local lines = {}
-- Treesitter status
table.insert(lines, "Treesitter Status")
table.insert(lines, "=================")
local ts = get_treesitter_status()
for _, l in ipairs(ts) do
table.insert(lines, l)
end
table.insert(lines, "")
if #lsp_clients == 0 then
table.insert(lines, "No LSP clients attached.")
else
table.insert(lines, "Active LSP Clients:")
table.insert(lines, "===================")
for _, client in ipairs(lsp_clients) do
table.insert(lines, "")
table.insert(lines, "" .. client.name)
-- Root folders
local roots = {}
if client.workspace_folders then
for _, workspace_folder in ipairs(client.workspace_folders) do
table.insert(roots, workspace_folder.name or workspace_folder.uri or "")
end
end
if #roots > 0 then
table.insert(lines, " Roots:")
for _, root in ipairs(roots) do
table.insert(lines, " - " ..root)
end
else
table.insert(lines, " Roots: none")
end
-- Capabilities
table.insert(lines, " Capabilities:")
for capability, _ in pairs(client.server_capabilities or {}) do
table.insert(lines, " - " .. capability)
end
end
end
table.insert(lines, "")
table.insert(lines, "Health Check (vim.lsp):")
table.insert(lines, "=======================")
local health_lines = run_healthcheck("vim.lsp")
for _, l in ipairs(health_lines) do
table.insert(lines, " " .. l)
end
table.insert(lines, "")
table.insert(lines, "Health Check (vim.treesitter):")
table.insert(lines, "=======================")
local health_lines = run_healthcheck("vim.treesitter")
for _, l in ipairs(health_lines) do
table.insert(lines, " " .. l)
end
vim.api.nvim_buf_set_lines(popup_buffer, 0, -1, false, lines)
vim.api.nvim_set_option_value("modifiable", false, { buf = popup_buffer })
vim.api.nvim_set_option_value("readonly", true, { buf = popup_buffer })
local width = math.floor(vim.o.columns * 0.6)
local height = math.floor(vim.o.lines * 0.6)
local row = math.floor((vim.o.lines - height) / 2)
local col = math.floor((vim.o.columns - width) / 2)
local window = vim.api.nvim_open_win(popup_buffer, true, {
relative = "editor",
style = "minimal",
border = vim.g.ui.popupborder,
row = row,
col = col,
width = width,
height = height,
})
vim.keymap.set("n", "q", function()
if vim.api.nvim_win_is_valid(window) then
vim.api.nvim_win_close(window, true)
end
end, { buffer = popup_buffer, nowait = true, desc = "Close Window" })
end
vim.keymap.set("n", "<leader>li", show_lsp_details, {
desc = "Show detailed LSP info in a float"
})