return { { "nvim-treesitter/nvim-treesitter", opts = { ensure_installed = { "go", "gomod", "gowork", "gosum" } }, }, { "neovim/nvim-lspconfig", opts = { servers = { gopls = { settings = { gopls = { gofumpt = true, codelenses = { gc_details = false, generate = true, regenerate_cgo = true, run_govulncheck = true, test = true, tidy = true, upgrade_dependency = true, vendor = true, }, hints = { assignVariableTypes = true, compositeLiteralFields = true, compositeLiteralTypes = true, constantValues = true, functionTypeParameters = true, parameterNames = true, rangeVariableTypes = true, }, analyses = { fieldalignment = true, nilness = true, unusedparams = true, unusedwrite = true, useany = true, }, usePlaceholders = true, completeUnimported = true, staticcheck = true, directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" }, semanticTokens = true, }, }, }, }, setup = { gopls = function(_, opts) -- workaround for gopls not supporting semanticTokensProvider -- https://github.com/golang/go/issues/54531#issuecomment-1464982242 rmz.lsp.on_attach(function(client, _) if not client.server_capabilities.semanticTokensProvider then local semantic = client.config.capabilities.textDocument.semanticTokens client.server_capabilities.semanticTokensProvider = { full = true, legend = { tokenTypes = semantic.tokenTypes, tokenModifiers = semantic.tokenModifiers, }, range = true, } end end, "gopls") -- end workaround end, }, }, }, -- Ensure Go tools are installed { "williamboman/mason.nvim", opts = { ensure_installed = { "goimports", "gofumpt" } }, }, { "nvimtools/none-ls.nvim", optional = true, dependencies = { { "williamboman/mason.nvim", opts = { ensure_installed = { "gomodifytags", "impl" } }, }, }, opts = function(_, opts) local nls = require("null-ls") opts.sources = vim.list_extend(opts.sources or {}, { nls.builtins.code_actions.gomodifytags, nls.builtins.code_actions.impl, nls.builtins.formatting.goimports, nls.builtins.formatting.gofumpt, }) end, }, { "stevearc/conform.nvim", optional = true, opts = { formatters_by_ft = { go = { "goimports", "gofumpt" }, }, }, }, { "mfussenegger/nvim-dap", optional = true, dependencies = { { "williamboman/mason.nvim", opts = { ensure_installed = { "delve" } }, }, { "leoluz/nvim-dap-go", opts = {}, }, }, }, { "nvim-neotest/neotest", optional = true, dependencies = { "fredrikaverpil/neotest-golang", }, opts = { adapters = { ["neotest-golang"] = { -- Here we can set options for neotest-golang, e.g. -- go_test_args = { "-v", "-race", "-count=1", "-timeout=60s" }, dap_go_enabled = true, -- requires leoluz/nvim-dap-go }, }, }, }, -- Filetype icons { "echasnovski/mini.icons", opts = { file = { [".go-version"] = { glyph = "", hl = "MiniIconsBlue" }, }, filetype = { gotmpl = { glyph = "󰟓", hl = "MiniIconsGrey" }, }, }, }, }