Hyprland-dotfiles/nvim/lua/modules/configs/completion/servers/clangd.lua

80 lines
2.4 KiB
Lua
Raw Permalink Normal View History

2024-07-21 02:51:17 -04:00
local function switch_source_header_splitcmd(bufnr, splitcmd)
bufnr = require("lspconfig").util.validate_bufnr(bufnr)
local clangd_client = require("lspconfig").util.get_active_client_by_name(bufnr, "clangd")
local params = { uri = vim.uri_from_bufnr(bufnr) }
if clangd_client then
clangd_client.request("textDocument/switchSourceHeader", params, function(err, result)
if err then
error(tostring(err))
end
if not result then
vim.notify("Corresponding file cant be determined", vim.log.levels.ERROR, { title = "LSP Error!" })
return
end
vim.api.nvim_command(splitcmd .. " " .. vim.uri_to_fname(result))
end)
else
vim.notify(
"Method textDocument/switchSourceHeader is not supported by any active server on this buffer",
vim.log.levels.ERROR,
{ title = "LSP Error!" }
)
end
end
local function get_binary_path_list(binaries)
local path_list = {}
for _, binary in ipairs(binaries) do
local path = vim.fn.exepath(binary)
if path ~= "" then
table.insert(path_list, path)
end
end
return table.concat(path_list, ",")
end
-- https://github.com/neovim/nvim-lspconfig/blob/master/lua/lspconfig/server_configurations/clangd.lua
return function(options)
require("lspconfig").clangd.setup({
on_attach = options.on_attach,
capabilities = vim.tbl_deep_extend("keep", { offsetEncoding = { "utf-16", "utf-8" } }, options.capabilities),
single_file_support = true,
cmd = {
"clangd",
"-j=12",
"--enable-config",
"--background-index",
"--pch-storage=memory",
-- You MUST set this arg ↓ to your c/cpp compiler location (if not included)!
"--query-driver=" .. get_binary_path_list({ "clang++", "clang", "gcc", "g++" }),
"--clang-tidy",
"--all-scopes-completion",
"--completion-style=detailed",
"--header-insertion-decorators",
"--header-insertion=iwyu",
"--limit-references=3000",
"--limit-results=350",
},
commands = {
ClangdSwitchSourceHeader = {
function()
switch_source_header_splitcmd(0, "edit")
end,
description = "Open source/header in current buffer",
},
ClangdSwitchSourceHeaderVSplit = {
function()
switch_source_header_splitcmd(0, "vsplit")
end,
description = "Open source/header in a new vsplit",
},
ClangdSwitchSourceHeaderSplit = {
function()
switch_source_header_splitcmd(0, "split")
end,
description = "Open source/header in a new split",
},
},
})
end