diff options
-rw-r--r-- | home/.config/nvim/lua/cfg/lsp.lua | 53 | ||||
-rw-r--r-- | home/.config/nvim/lua/custom/plugins/lsp.lua | 89 |
2 files changed, 54 insertions, 88 deletions
diff --git a/home/.config/nvim/lua/cfg/lsp.lua b/home/.config/nvim/lua/cfg/lsp.lua deleted file mode 100644 index 894b578..0000000 --- a/home/.config/nvim/lua/cfg/lsp.lua +++ /dev/null @@ -1,53 +0,0 @@ -local M = {} -local map = require("mapper") -local lspconfig = require("lspconfig") - -function M.on_attach_wrapper(client, bufnr, opts) - local autocmd = vim.api.nvim_create_autocmd - - if client.supports_method("textDocument/codeLens") then - autocmd( - { "CursorHold", "CursorHoldI", "InsertLeave" }, - { buffer = bufnr, callback = vim.lsp.codelens.refresh } - ) - map.n("gl", vim.lsp.codelens.run, { buffer = bufnr }) - end - - map.n("<c-]>", vim.lsp.buf.definition, { buffer = bufnr }) - map.n("gD", vim.lsp.buf.declaration, { buffer = bufnr }) - map.n("gR", vim.lsp.buf.rename, { buffer = bufnr }) - map.n("ga", vim.lsp.buf.code_action, { buffer = bufnr }) - map.v("ga", vim.lsp.buf.code_action, { buffer = bufnr }) -end - -function M.switch_source_header_splitcmd(bufnr, splitcmd) - bufnr = lspconfig.util.validate_bufnr(bufnr) - local clangd_client = 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 - print("Corresponding file cannot be determined") - return - end - vim.api.nvim_command(splitcmd .. " " .. vim.uri_to_fname(result)) - end, - bufnr - ) - else - print( - "method textDocument/switchSourceHeader is not supported by any servers active on the current buffer" - ) - end -end - -return M diff --git a/home/.config/nvim/lua/custom/plugins/lsp.lua b/home/.config/nvim/lua/custom/plugins/lsp.lua index 9faa259..e487081 100644 --- a/home/.config/nvim/lua/custom/plugins/lsp.lua +++ b/home/.config/nvim/lua/custom/plugins/lsp.lua @@ -1,5 +1,40 @@ local map = require("mapper") +local function handler_splitcmd(_, uri, splitcmd) + if not uri or uri == "" then + vim.api.nvim_echo({ { "Corresponding file cannot be determined" } }, false, {}) + return + end + local file_name = vim.uri_to_fname(uri) + vim.api.nvim_cmd({ + cmd = splitcmd, + args = { file_name }, + }, {}) +end + +local function switch_source_header_splitcmd(bufnr, splitcmd) + bufnr = bufnr or 0 + vim.lsp.buf_request(bufnr, "textDocument/switchSourceHeader", { + uri = vim.uri_from_bufnr(bufnr), + }, function(err, uri) return handler_splitcmd(err, uri, splitcmd) end) +end + +local function edit_source_header(bufnr) + switch_source_header_splitcmd(bufnr, "edit") +end + +local function split_source_header(bufnr) + switch_source_header_splitcmd(bufnr, "split") +end + +local function vsplit_source_header(bufnr) + switch_source_header_splitcmd(bufnr, "vsplit") +end + +local function tabedit_source_header(bufnr) + switch_source_header_splitcmd(bufnr, "tabedit") +end + return { { "lewis6991/hover.nvim", @@ -23,7 +58,6 @@ return { 'neovim/nvim-lspconfig', config = function() local lspconfig = require("lspconfig") - local cfg_lsp = require "cfg.lsp" -- Enable (broadcasting) snippet capability for completion local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true @@ -61,37 +95,11 @@ return { "--function-arg-placeholders", "--pch-storage=memory", }, - commands = { - ClangdSwitchSourceHeader = { - function() - cfg_lsp.switch_source_header_splitcmd(0, "edit") - end, - description = "Open source/header in current buffer", - }, - ClangdSwitchSourceHeaderVSplit = { - function() - cfg_lsp.switch_source_header_splitcmd(0, "vsplit") - end, - description = "Open source/header in a new vsplit", - }, - ClangdSwitchSourceHeaderSplit = { - function() - cfg_lsp.lsp.switch_source_header_splitcmd(0, "split") - end, - description = "Open source/header in a new split", - }, - ClangdSwitchSourceHeaderTab = { - function() - cfg_lsp.lsp.switch_source_header_splitcmd(0, "tabedit") - end, - description = "Open source/header in a new tab", - }, - }, on_attach = function(_, bufnr) - map.ncmd("gH", "ClangdSwitchSourceHeader", { buffer = bufnr }) - map.ncmd("gvH", "ClangdSwitchSourceHeaderVSplit", { buffer = bufnr }) - map.ncmd("gxH", "ClangdSwitchSourceHeaderSplit", { buffer = bufnr }) - map.ncmd("gtH", "ClangdSwitchSourceHeaderSplit", { buffer = bufnr }) + map.n("gH", edit_source_header, { buffer = bufnr }) + map.n("gvH", vsplit_source_header, { buffer = bufnr }) + map.n("gxH", split_source_header, { buffer = bufnr }) + map.n("gtH", tabedit_source_header, { buffer = bufnr }) require("clangd_extensions.inlay_hints").setup_autocmd() require("clangd_extensions.inlay_hints").set_inlay_hints() @@ -114,8 +122,21 @@ return { vim.api.nvim_create_autocmd("LspAttach", { callback = function(args) local bufnr = args.buf - local client = vim.lsp.get_client_by_id(args.data.client_id) - cfg_lsp.on_attach_wrapper(client, bufnr) + local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) + + if client.supports_method("textDocument/codeLens") then + vim.api.nvim_create_autocmd( + { "CursorHold", "CursorHoldI", "InsertLeave" }, + { buffer = bufnr, callback = vim.lsp.codelens.refresh } + ) + map.n("gl", vim.lsp.codelens.run, { buffer = bufnr }) + end + + map.n("<c-]>", vim.lsp.buf.definition, { buffer = bufnr }) + map.n("gD", vim.lsp.buf.declaration, { buffer = bufnr }) + map.n("gR", vim.lsp.buf.rename, { buffer = bufnr }) + map.n("ga", vim.lsp.buf.code_action, { buffer = bufnr }) + map.v("ga", vim.lsp.buf.code_action, { buffer = bufnr }) end, }) end, @@ -166,8 +187,6 @@ return { opts = { formatters_by_ft = { python = { "ruff_format" }, - c = { "clang-format" }, - cpp = { "clang-format" }, cmake = { "cmake_format" }, json = { "jq" }, rust = { "rustfmt" }, |