return { { "fatih/vim-go", init = function() vim.g.go_fmt_command = "gofumpt" end, ft = { "go" }, }, { "nvim-treesitter/nvim-treesitter", opts = function(_, opts) if type(opts) == "table" then opts.ensure_installed = opts.ensure_installed or {} vim.list_extend(opts.ensure_installed, { "go", "gomod", "gosum", }) end end, }, { "jose-elias-alvarez/null-ls.nvim", opts = function(_, opts) if type(opts) == "table" then opts.sources = opts.sources or {} local null_ls = require("null-ls") vim.list_extend(opts.sources, { null_ls.builtins.diagnostics.golangci_lint, null_ls.builtins.formatting.gofumpt, -- Just here because gopls integrated gofumpt doesn't work }) end end, }, { "neovim/nvim-lspconfig", opts = function(_, opts) if type(opts) == "table" then opts.servers = opts.servers or {} opts.servers.gopls = { -- Because integrated gofumpt doesn't work -- I disable formatting for gopls -- Formatting is handled with gofumpt by: -- - null-ls on format request -- - vim-go on save on_attach = function(client, _) client.server_capabilities.documentFormattingProvider = false client.server_capabilities.documentRangeFormattingProvider = false end, cmd = { "gopls", "-remote=auto", "serve" }, -- Shared with vim-go's gopls instance settings = { gopls = { buildFlags = { "-tags=integration,unit" }, -- To make packages with those build flags actually work with the LSP semanticTokens = false, gofumpt = true, -- gofumpt formatting, doesn't work }, }, } end end, }, }