80 lines
2.4 KiB
Lua
80 lines
2.4 KiB
Lua
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 can’t 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
|