From 073e01a8b25739e703f72f2ac62e8802381fd86c Mon Sep 17 00:00:00 2001 From: Rakshit Sinha Date: Wed, 8 Jan 2025 11:29:11 -0800 Subject: [PATCH] Autcmd to organize imports for Go files. Remove unused imports on save --- lua/rakshit/plugins/lsp/lspconfig.lua | 124 +++++++++++++++----------- 1 file changed, 74 insertions(+), 50 deletions(-) diff --git a/lua/rakshit/plugins/lsp/lspconfig.lua b/lua/rakshit/plugins/lsp/lspconfig.lua index 0a7bd2b8..5809bfc4 100644 --- a/lua/rakshit/plugins/lsp/lspconfig.lua +++ b/lua/rakshit/plugins/lsp/lspconfig.lua @@ -1,14 +1,14 @@ return { -- Main LSP Configuration - 'neovim/nvim-lspconfig', - event = { 'BufReadPre', 'BufNewFile' }, + "neovim/nvim-lspconfig", + event = { "BufReadPre", "BufNewFile" }, dependencies = { -- Allows extra capabilities provided by nvim-cmp - 'hrsh7th/cmp-nvim-lsp', + "hrsh7th/cmp-nvim-lsp", -- Modify imports when a file has been renamed - { 'antosha417/nvim-lsp-file-operations', config = true }, + { "antosha417/nvim-lsp-file-operations", config = true }, -- Improved LSP functionality when working with lua files - { 'folke/neodev.nvim', opts = {} }, + { "folke/neodev.nvim", opts = {} }, -- Automatically install LSPs and related tools to stdpath for Neovim -- { 'williamboman/mason.nvim', config = true }, -- NOTE: Must be loaded before dependants @@ -16,7 +16,7 @@ return { -- Useful status updates for LSP. -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` - { 'j-hui/fidget.nvim', opts = {} }, + { "j-hui/fidget.nvim", opts = {} }, }, config = function() -- Brief aside: **What is LSP?** @@ -49,12 +49,12 @@ return { -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this -- function will be executed to configure the current buffer -- import lspconfig plugin - local lspconfig = require('lspconfig') - local util = require('lspconfig/util') + local lspconfig = require("lspconfig") + local util = require("lspconfig/util") lspconfig.gopls.setup({ - cmd = { 'gopls' }, - filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' }, - root_dir = util.root_pattern('go.work', 'go.mod', '.git'), + cmd = { "gopls" }, + filetypes = { "go", "gomod", "gowork", "gotmpl" }, + root_dir = util.root_pattern("go.work", "go.mod", ".git"), settings = { gopls = { completeUnimported = true, @@ -67,64 +67,64 @@ return { }) -- import mason_lspconfig plugin - local mason_lspconfig = require('mason-lspconfig') + local mason_lspconfig = require("mason-lspconfig") -- import cmp-nvim-lsp plugin - local cmp_nvim_lsp = require('cmp_nvim_lsp') + local cmp_nvim_lsp = require("cmp_nvim_lsp") local keymap = vim.keymap - vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspConfig", {}), callback = function(event) -- Buffer local mappings -- See `:help vim.lsp.*` for documentation on ay of the below function local opts = { buffer = event.buf, silent = true } -- set keybinds - opts.desc = 'Show LSP references' - keymap.set('n', 'gR', 'Telescope lsp_references', opts) -- show definition, references + opts.desc = "Show LSP references" + keymap.set("n", "gR", "Telescope lsp_references", opts) -- show definition, references - opts.desc = 'Go to declaration' - keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) -- go to declaration + opts.desc = "Go to declaration" + keymap.set("n", "gD", vim.lsp.buf.declaration, opts) -- go to declaration - opts.desc = 'Show LSP definitions' - keymap.set('n', 'gd', 'Telescope lsp_definitions', opts) -- show lsp definitions + opts.desc = "Show LSP definitions" + keymap.set("n", "gd", "Telescope lsp_definitions", opts) -- show lsp definitions - opts.desc = 'Show LSP implementations' - keymap.set('n', 'gi', 'Telescope lsp_implementations', opts) -- show lsp implementations + opts.desc = "Show LSP implementations" + keymap.set("n", "gi", "Telescope lsp_implementations", opts) -- show lsp implementations - opts.desc = 'Show LSP type definitions' - keymap.set('n', 'gt', 'Telescope lsp_type_definitions', opts) -- show lsp type definitions + opts.desc = "Show LSP type definitions" + keymap.set("n", "gt", "Telescope lsp_type_definitions", opts) -- show lsp type definitions - opts.desc = 'See available code actions' - keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection + opts.desc = "See available code actions" + keymap.set({ "n", "v" }, "ca", vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection - opts.desc = 'Smart rename' - keymap.set('n', 'rn', vim.lsp.buf.rename, opts) -- smart rename + opts.desc = "Smart rename" + keymap.set("n", "rn", vim.lsp.buf.rename, opts) -- smart rename - opts.desc = 'Show buffer diagnostics' - keymap.set('n', 'D', 'Telescope diagnostics bufnr=0', opts) -- show diagnostics for file + opts.desc = "Show buffer diagnostics" + keymap.set("n", "D", "Telescope diagnostics bufnr=0", opts) -- show diagnostics for file - opts.desc = 'Show line diagnostics' - keymap.set('n', 'd', vim.diagnostic.open_float, opts) -- show diagnostics for line + opts.desc = "Show line diagnostics" + keymap.set("n", "d", vim.diagnostic.open_float, opts) -- show diagnostics for line - opts.desc = 'Go to previous diagnostic' - keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) -- jump to previous diagnostic in buffer + opts.desc = "Go to previous diagnostic" + keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) -- jump to previous diagnostic in buffer - opts.desc = 'Go to next diagnostic' - keymap.set('n', ']d', vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer + opts.desc = "Go to next diagnostic" + keymap.set("n", "]d", vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer - opts.desc = 'Show documentation for what is under cursor' - keymap.set('n', 'K', vim.lsp.buf.hover, opts) -- show documentation for what is under cursor + opts.desc = "Show documentation for what is under cursor" + keymap.set("n", "K", vim.lsp.buf.hover, opts) -- show documentation for what is under cursor - opts.desc = 'Restart LSP' - keymap.set('n', 'rs', ':LspRestart', opts) -- mapping to restart lsp if necessary + opts.desc = "Restart LSP" + keymap.set("n", "rs", ":LspRestart", opts) -- mapping to restart lsp if necessary end, }) -- Configure Neovim tab settings for Go files [Go indendation] - vim.api.nvim_create_autocmd('FileType', { - pattern = 'go', + vim.api.nvim_create_autocmd("FileType", { + pattern = "go", callback = function() vim.bo.expandtab = true -- Use spaces instead of tabs vim.bo.tabstop = 4 -- Display each tab as 4 spaces @@ -133,13 +133,37 @@ return { end, }) + -- Organize imports on save. Also helps remove unused imports on save. + vim.api.nvim_create_autocmd("BufWritePre", { + pattern = "*.go", + callback = function() + local params = vim.lsp.util.make_range_params() + params.context = { only = { "source.organizeImports" } } + -- buf_request_sync defaults to a 1000ms timeout. Depending on your + -- machine and codebase, you may want longer. Add an additional + -- argument after params if you find that you have to write the file + -- twice for changes to be saved. + -- E.g., vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, 3000) + local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params) + for cid, res in pairs(result or {}) do + for _, r in pairs(res.result or {}) do + if r.edit then + local enc = (vim.lsp.get_client_by_id(cid) or {}).offset_encoding or "utf-16" + vim.lsp.util.apply_workspace_edit(r.edit, enc) + end + end + end + vim.lsp.buf.format({ async = false }) + end, + }) + local capabilities = cmp_nvim_lsp.default_capabilities() -- Change the Diagnostic symbols in the sign column (gutter) -- (not in youtube nvim video) - local signs = { Error = ' ', Warn = ' ', Hint = '󰠠 ', Info = ' ' } + local signs = { Error = " ", Warn = " ", Hint = "󰠠 ", Info = " " } for type, icon in pairs(signs) do - local hl = 'DiagnosticSign' .. type - vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = '' }) + local hl = "DiagnosticSign" .. type + vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) end mason_lspconfig.setup_handlers({ @@ -151,18 +175,18 @@ return { end, -- Language specific configuration for any individual language server. Lua in this case - ['lua_ls'] = function() + ["lua_ls"] = function() -- configure lua server (with special settings) - lspconfig['lua_ls'].setup({ + lspconfig["lua_ls"].setup({ capabilities = capabilities, settings = { Lua = { -- make the language server recognize "vim" global diagnostics = { - globals = { 'vim' }, + globals = { "vim" }, }, completion = { - callSnippet = 'Replace', + callSnippet = "Replace", }, }, },