diff --git a/.gitignore b/.gitignore index 8fad781dbcdb39aa8b8224833618dae2a58999bf..d290fb0dd6157adafa813f74319798438ce5164a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /plugin log +/lua/.luarc.json diff --git a/init.lua b/init.lua index 2219ddcbc583addc70df72c980f23bf20faf98eb..87c3acfd37adb5bec4912cfd1b98aac4a57b2aa7 100644 --- a/init.lua +++ b/init.lua @@ -31,6 +31,7 @@ require('codecraft.plugin.lsp.navic') require('codecraft.plugin.lsp.lsp') require('codecraft.plugin.lsp.completion') require('codecraft.plugin.lsp.null-ls') +require('codecraft.plugin.lsp.rust-tools') -- DAP require('codecraft.plugin.dap.dap') diff --git a/lua/codecraft/plugin-setup.lua b/lua/codecraft/plugin-setup.lua index f38750e43fb799746cf246af4498c5ac12d8c2d8..3d0201e2db9daddacf057c477a5c341135f3e727 100644 --- a/lua/codecraft/plugin-setup.lua +++ b/lua/codecraft/plugin-setup.lua @@ -26,6 +26,8 @@ require('packer').startup(function(use) "SmiteshP/nvim-navic", requires = "neovim/nvim-lspconfig" } + -- Rust tools + use 'simrat39/rust-tools.nvim' -- Project manager use 'ahmedkhalf/project.nvim' diff --git a/lua/codecraft/plugin/lsp/rust-tools.lua b/lua/codecraft/plugin/lsp/rust-tools.lua new file mode 100644 index 0000000000000000000000000000000000000000..e8199d1dccf09ac3b72a9e2730e719184ab3899d --- /dev/null +++ b/lua/codecraft/plugin/lsp/rust-tools.lua @@ -0,0 +1,68 @@ +local rt = require("rust-tools") +local mason_registry = require("mason-registry") + +local codelldb = mason_registry.get_package("codelldb") +local extension_path = codelldb:get_install_path() .. "/extension/" +local codelldb_path = extension_path .. "adapter/codelldb" +local liblldb_path = extension_path .. "lldb/lib/liblldb.so" + +rt.setup({ + server = { + on_attach = function(_, bufnr) + -- Hover actions + vim.keymap.set("n", "<leader>h", rt.hover_actions.hover_actions, { buffer = bufnr }) + -- Code action groups + vim.keymap.set("n", "<Leader>a", rt.code_action_group.code_action_group, { buffer = bufnr }) + + + local nmap = function(keys, func, desc) + if desc then + desc = 'LSP: ' .. desc + end + + vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) + end + + if _.server_capabilities.documentSymbolProvider then + require('nvim-navic').attach(_, bufnr) + end + + nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame') + nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction') + nmap('<leader>di', vim.diagnostic.open_float, '[D]iagnostic [I]nfo') + nmap('<leader>dv', '<cmd>Telescope diagnostics<CR>', '[D]iagnostic [V]iew') + + nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') + nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') + nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') + nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition') + nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') + nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') + + -- See `:help K` for why this keymap + nmap('<leader>K', vim.lsp.buf.hover, 'Hover Documentation') + nmap('<leader>k', vim.lsp.buf.signature_help, 'Signature Documentation') + + -- Lesser used LSP functionality + nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') + nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') + nmap('<leader>wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, '[W]orkspace [L]ist Folders') + + -- Create a command `:Format` local to the LSP buffer + vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) + vim.lsp.buf.format() + end, { desc = 'Format current buffer with LSP' }) + end, + }, + tools = { + hover_actions = { + auto_focus = true, + } + }, + dap = { + adapter = require("rust-tools.dap").get_codelldb_adapter(codelldb_path, liblldb_path), + }, +})