diff --git a/lazy-lock.json b/lazy-lock.json index 31b70c7..ea171fe 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -1,9 +1,9 @@ { "FixCursorHold.nvim": { "branch": "master", "commit": "1900f89dc17c603eec29960f57c00bd9ae696495" }, "LuaSnip": { "branch": "master", "commit": "0abc8f390b278c3b4aabc4c004ac8a088b65cf24" }, - "SchemaStore.nvim": { "branch": "main", "commit": "19adbfb1c4d4049b691be0d840936b109de0f5ea" }, + "SchemaStore.nvim": { "branch": "main", "commit": "e954496f8ef22904e8a84f5078f4a110fdc7a0d3" }, "base46-colors": { "branch": "main", "commit": "131ca742f6e8d1eb4c938a2519a94840ba129c2f" }, - "catppuccin": { "branch": "main", "commit": "e068ab5f8261f23f6f71ffd8791ae40315b77b9c" }, + "catppuccin": { "branch": "main", "commit": "05e8787020dcfdb937bf2ff23855ea2415b4e072" }, "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, "copilot.vim": { "branch": "release", "commit": "a12fd5672110c8aa7e3c8419e28c96943ca179be" }, @@ -15,9 +15,9 @@ "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, "lazygit.nvim": { "branch": "main", "commit": "a04ad0dbc725134edbee3a5eea29290976695357" }, "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "47059d71b42d74b0a1e9f61c1d99d301039c3b5b" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "a4068c3ebd4cb335b25239e5ea35c22ee6007962" }, "mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" }, - "mini.icons": { "branch": "main", "commit": "24dbea2195c477e57d581215839a6ab915f34b14" }, + "mini.icons": { "branch": "main", "commit": "98faae31e9be1cc054ae63485e58ceb185efcad0" }, "neo-tree.nvim": { "branch": "v3.x", "commit": "ebd66767191714e008ce73b769518a763ff31bdc" }, "neotest": { "branch": "master", "commit": "fb84d87285698f7055f618083c351984449119b8" }, "neotest-dotnet": { "branch": "main", "commit": "e27c67a856ce67cc968b773d01a35ec07459bb8b" }, @@ -25,20 +25,20 @@ "neotest-jest": { "branch": "main", "commit": "0e7979d51301dfae5ef839d771bd28cf593fde3f" }, "neotest-playwright": { "branch": "fork", "commit": "e6202f2b00dd5c3b7b626b147b86deb36c2d64bd" }, "neotest-python": { "branch": "master", "commit": "51c453d57f8d5156671b42ea57fafa2e1c9fb641" }, - "neotest-vitest": { "branch": "main", "commit": "ab5a73d6ec9d33e807d6c67ce5169c4ca4a5d7f3" }, + "neotest-vitest": { "branch": "main", "commit": "c3c69715da4b158069fd4262083e7219a5c14cfb" }, "none-ls.nvim": { "branch": "main", "commit": "01f8e62ea11603e59ad9ff7afcfa94fd183f76d6" }, "nuget.nvim": { "branch": "main", "commit": "574cb236bccd8c6e276da923c65f9dbf1f789f73" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, "nvim-autopairs": { "branch": "master", "commit": "7b9923abad60b903ece7c52940e1321d39eccc79" }, - "nvim-cmp": { "branch": "main", "commit": "a1d504892f2bc56c2e79b65c6faded2fd21f3eca" }, + "nvim-cmp": { "branch": "main", "commit": "2ffe79f1f021def8dd1fcd81deb16f1bb0d989f3" }, "nvim-dap": { "branch": "master", "commit": "9e848e09a697ee95302a3ef2dd43fd6eb709e570" }, "nvim-dap-python": { "branch": "master", "commit": "1808458eba2b18f178f990e01376941a42c7f93b" }, "nvim-dap-ui": { "branch": "master", "commit": "1a66cabaa4a4da0be107d5eda6d57242f0fe7e49" }, - "nvim-lspconfig": { "branch": "master", "commit": "d224a1920728ba129880efc700d4a0180ac4ecbb" }, + "nvim-lspconfig": { "branch": "master", "commit": "d5b6e3db4c17b0146f63a2fc47e2027a754b2cb1" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-treesitter": { "branch": "main", "commit": "4916d6592ede8c07973490d9322f187e07dfefac" }, "nvim-treesitter-context": { "branch": "master", "commit": "b311b30818951d01f7b4bf650521b868b3fece16" }, - "nvim-web-devicons": { "branch": "master", "commit": "dad71387de386a946b123079d0e53f23028f3abd" }, + "nvim-web-devicons": { "branch": "master", "commit": "09d1324e264c6950262dbe02a9bce2933a6800db" }, "omnisharp-extended-lsp.nvim": { "branch": "main", "commit": "51e407a46ddb15e49727139b5b1ae3650cd6a069" }, "onedarkpro.nvim": { "branch": "main", "commit": "f5fddfd5122fe00421e199151ae4fe8571a02898" }, "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, @@ -53,6 +53,6 @@ "vim-dadbod-completion": { "branch": "master", "commit": "a8dac0b3cf6132c80dc9b18bef36d4cf7a9e1fe6" }, "vim-dadbod-ui": { "branch": "master", "commit": "afd07819d8efcefc3317205b855ad4e3513b0011" }, "volt": { "branch": "main", "commit": "620de1321f275ec9d80028c68d1b88b409c0c8b1" }, - "watchexec.nvim": { "branch": "main", "commit": "f112ac542ef60bfd3f5168559df3229d389a16e5" }, + "watchexec.nvim": { "branch": "main", "commit": "d424bd730784696e3f97f132581ba6fed39d16b0" }, "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } } diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua index 1fe0a9c..820464b 100644 --- a/lua/plugins/lsp.lua +++ b/lua/plugins/lsp.lua @@ -1,388 +1,427 @@ return { - { - "williamboman/mason.nvim", - lazy = false, - config = function() - require("mason").setup() - end, - }, - { - "williamboman/mason-lspconfig.nvim", - lazy = false, - opts = { - automatic_enable = false, - auto_install = true, - }, - }, - { - "linux-cultist/venv-selector.nvim", - dependencies = { - "neovim/nvim-lspconfig", - "mfussenegger/nvim-dap", - "mfussenegger/nvim-dap-python", - { "nvim-telescope/telescope.nvim", branch = "0.1.x", dependencies = { "nvim-lua/plenary.nvim" } }, - }, - ft = "python", - keys = { - { "v", "VenvSelect" }, - }, - opts = { - search = {}, - options = {}, - }, - }, - { - "b0o/SchemaStore.nvim", - }, - { - "neovim/nvim-lspconfig", - dependencies = { "hoffs/omnisharp-extended-lsp.nvim" }, - lazy = false, - config = function() - local capabilities = require("cmp_nvim_lsp").default_capabilities() - - vim.lsp.handlers["window/showMessage"] = function(_, result, ctx) - local client = vim.lsp.get_client_by_id(ctx.client_id) - - local lvl = ({ - ERROR = vim.log.levels.ERROR, - WARNING = vim.log.levels.WARN, - INFO = vim.log.levels.INFO, - LOG = vim.log.levels.DEBUG, - })[result.type] - - vim.notify(result.message, lvl, { - title = string.format("LSP[%s]", client and client.name or "Unknown"), - }) - end - - vim.lsp.handlers["$/progress"] = function(_, result, ctx) - local client = vim.lsp.get_client_by_id(ctx.client_id) - - if result.value.kind == "begin" then - vim.notify( - string.format("LSP[%s] %s", client and client.name or "Unknown", result.value.title), - vim.log.levels.INFO - ) - end - end - - local base_on_attach = vim.lsp.config.eslint.on_attach - - vim.lsp.config("eslint", { - on_attach = function(client, bufnr) - if not base_on_attach then - return - end - - base_on_attach(client, bufnr) - vim.api.nvim_create_autocmd("BufWritePre", { - buffer = bufnr, - command = "LspEslintFixAll", - }) - end, - }) - - vim.lsp.enable("eslint") - - vim.lsp.config("omnisharp", { - handlers = { - ["textDocument/definition"] = require("omnisharp_extended").handler, - }, - capabilities = capabilities, - }) - - vim.lsp.enable("omnisharp") - - vim.lsp.config("fsautocomplete", { - capabilities = capabilities, - }) - - vim.lsp.enable("fsautocomplete") - - vim.lsp.config("lua_ls", { - capabilities = capabilities, - }) - - vim.lsp.enable("lua_ls") - - local vue_language_server_path = vim.fn.stdpath("data") - .. "/mason/packages/vue-language-server/node_modules/@vue/language-server" - - local tsserver_filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact", "vue" } - - local vue_plugin = { - name = "@vue/typescript-plugin", - location = vue_language_server_path, - languages = { "vue" }, - configNamespace = "typescript", - } - - local ts_ls_config = { - init_options = { - plugins = { - vue_plugin, - }, - }, - filetypes = tsserver_filetypes, - } - - local vue_ls_config = {} - - vim.lsp.config("vue_ls", vue_ls_config) - vim.lsp.config("ts_ls", ts_ls_config) - - vim.lsp.enable("vue_ls") - vim.lsp.enable("ts_ls") - - vim.lsp.config("jsonls", { - capabilities = capabilities, - settings = { - json = { - schemas = require("schemastore").json.schemas(), - validate = { enable = true }, - format = { enable = true }, - }, - }, - }) - - vim.lsp.enable("jsonls") - - vim.lsp.config("html", { - filetypes = { "html", "ejs", "gohtml" }, - capabilities = capabilities, - }) - - vim.lsp.enable("html") - - vim.lsp.config("emmet_language_server", { - filetypes = { "html", "css", "javascriptreact", "typescriptreact", "vue", "gohtml" }, - capabilities = capabilities, - }) - - vim.lsp.enable("emmet_language_server") - - vim.lsp.config("cssls", { - filetypes = { "css", "scss", "less" }, - capabilities = capabilities, - }) - - vim.lsp.enable("cssls") - - vim.lsp.config("tailwindcss", { - capabilities = capabilities, - }) - - vim.lsp.enable("tailwindcss") - - vim.lsp.config("pyright", { - capabilities = capabilities, - }) - - vim.lsp.enable("pyright") - - vim.lsp.config("lemminx", { - capabilities = capabilities, - }) - - vim.lsp.enable("lemminx") - - vim.lsp.config("gopls", { - capabilities = capabilities, - filetypes = { "go", "gomod", "gowork", "gotmpl", "gohtml" }, - settings = { - gopls = { - buildFlags = { "-tags=integration" } - } - } - }) - - vim.lsp.enable("gopls") - - vim.lsp.config("rust_analyzer", { - settings = { - ["rust-analyzer"] = { - files = { - watcher = "server", - }, - check = { - command = "clippy", - }, - diagnostics = { - enable = false, - }, - }, - }, - capabilities = capabilities, - }) - - vim.lsp.enable("rust_analyzer") - - vim.lsp.config("gh_actions_ls", { - capabilities = capabilities, - filetypes = { "yaml" }, - settings = { - yaml = { - schemas = { - ["https://json.schemastore.org/github-workflow.json"] = "/*/.github/workflows/*", - }, - }, - }, - }) - - vim.lsp.enable("gh_actions_ls") - - vim.lsp.config("sqlls", { - capabilities = capabilities, - filetypes = { "sql" }, - }) - - vim.lsp.enable("sqlls") - - vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("UserLspConfig", {}), - callback = function(ev) - local client = vim.lsp.get_client_by_id(ev.data.client_id) - - if not client then - vim.notify("LSP client not found", vim.log.levels.ERROR) - return - end - - if not client.server_capabilities then - vim.notify("LSP server not ready yet", vim.log.levels.WARN) - return - end - - client.on_error = function(err) - vim.notify(string.format("LSP server error: %s", err.message), vim.log.levels.ERROR) - end - - client.on_status = function(status) - if status == "stopped" then - vim.notify("LSP server stopped", vim.log.levels.WARN) - elseif status == "running" then - vim.notify("LSP server running", vim.log.levels.INFO) - end - end - - local omnisharp = require("omnisharp_extended") - - if client.name == "omnisharp" then - vim.keymap.set( - "n", - "gd", - omnisharp.telescope_lsp_definition, - { desc = "Go to definition", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "gi", - omnisharp.telescope_lsp_implementation, - { desc = "Go to implementation", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "gr", - omnisharp.telescope_lsp_references, - { desc = "Go to references", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "D", - omnisharp.telescope_lsp_type_definition, - { desc = "Go to type definition", buffer = ev.buf } - ) - else - vim.keymap.set( - "n", - "gd", - vim.lsp.buf.definition, - { desc = "Go to definition", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "gD", - vim.lsp.buf.declaration, - { desc = "Go to declaration", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "gi", - vim.lsp.buf.implementation, - { desc = "Go to implementation", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "gr", - vim.lsp.buf.references, - { desc = "Go to references", buffer = ev.buf } - ) - end - - vim.api.nvim_create_autocmd({ "FileType" }, { - callback = function() - local parsers = require("nvim-treesitter.parsers") - - if parsers then - vim.opt.foldmethod = "expr" - vim.opt.foldexpr = "nvim_treesitter#foldexpr()" - else - vim.opt.foldmethod = "syntax" - end - end, - }) - - vim.api.nvim_create_autocmd("BufWritePre", { - pattern = "*.go", - callback = function() - local params = vim.lsp.util.make_range_params() - params.context = { only = { "source.organizeImports" } } - 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, - }) - - vim.keymap.set( - "n", - "ca", - vim.lsp.buf.code_action, - { desc = "Code actions", buffer = ev.buf } - ) - - vim.keymap.set("n", "rn", vim.lsp.buf.rename, { desc = "Rename", buffer = ev.buf }) - - vim.keymap.set( - "n", - "e", - vim.diagnostic.open_float, - { desc = "Display error for current line", buffer = ev.buf } - ) - - vim.keymap.set( - "n", - "ea", - ":Telescope diagnostics bufnr=0", - { desc = "Display errors for current buffer", buffer = ev.buf } - ) - - vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Display symbol info", buffer = ev.buf }) - end, - }) - end, - }, + { + "williamboman/mason.nvim", + lazy = false, + config = function() + require("mason").setup() + end, + }, + { + "williamboman/mason-lspconfig.nvim", + lazy = false, + opts = { + automatic_enable = false, + auto_install = true, + }, + }, + { + "linux-cultist/venv-selector.nvim", + dependencies = { + "neovim/nvim-lspconfig", + "mfussenegger/nvim-dap", + "mfussenegger/nvim-dap-python", + { "nvim-telescope/telescope.nvim", branch = "0.1.x", dependencies = { "nvim-lua/plenary.nvim" } }, + }, + ft = "python", + keys = { + { "v", "VenvSelect" }, + }, + opts = { + search = {}, + options = {}, + }, + }, + { + "b0o/SchemaStore.nvim", + }, + { + "neovim/nvim-lspconfig", + dependencies = { "hoffs/omnisharp-extended-lsp.nvim" }, + lazy = false, + config = function() + local capabilities = require("cmp_nvim_lsp").default_capabilities() + + vim.lsp.handlers["window/showMessage"] = function(_, result, ctx) + local client = vim.lsp.get_client_by_id(ctx.client_id) + + local lvl = ({ + ERROR = vim.log.levels.ERROR, + WARNING = vim.log.levels.WARN, + INFO = vim.log.levels.INFO, + LOG = vim.log.levels.DEBUG, + })[result.type] + + vim.notify(result.message, lvl, { + title = string.format("LSP[%s]", client and client.name or "Unknown"), + }) + end + + vim.lsp.handlers["$/progress"] = function(_, result, ctx) + local client = vim.lsp.get_client_by_id(ctx.client_id) + + if result.value.kind == "begin" then + vim.notify( + string.format("LSP[%s] %s", client and client.name or "Unknown", result.value.title), + vim.log.levels.INFO + ) + end + end + + local base_on_attach = vim.lsp.config.eslint.on_attach + + vim.lsp.config("eslint", { + on_attach = function(client, bufnr) + if not base_on_attach then + return + end + + base_on_attach(client, bufnr) + vim.api.nvim_create_autocmd("BufWritePre", { + buffer = bufnr, + command = "LspEslintFixAll", + }) + end, + }) + + vim.lsp.enable("eslint") + + vim.lsp.config("omnisharp", { + handlers = { + ["textDocument/definition"] = require("omnisharp_extended").handler, + }, + capabilities = capabilities, + }) + + vim.lsp.enable("omnisharp") + + vim.lsp.config("fsautocomplete", { + capabilities = capabilities, + }) + + vim.lsp.enable("fsautocomplete") + + vim.lsp.config("lua_ls", { + capabilities = capabilities, + }) + + vim.lsp.enable("lua_ls") + + local vue_language_server_path = vim.fn.stdpath("data") + .. "/mason/packages/vue-language-server/node_modules/@vue/language-server" + + local vue_plugin = { + name = "@vue/typescript-plugin", + location = vue_language_server_path, + languages = { "vue" }, + configNamespace = "typescript", + } + + -- NOTE: need a way to handle typescript 7 and + -- projects using older versions of typescript + -- likely need to revisit this once things get + -- sorted out between vue ls and ts ls. + local function detect_local_ts_version() + local pkg_path = vim.fn.getcwd() .. "/node_modules/typescript/package.json" + local ok, content = pcall(vim.fn.readfile, pkg_path) + + if ok and content and #content > 0 then + local decoded = vim.json.decode(table.concat(content, "\n")) + + if decoded and decoded.version then + return tonumber(decoded.version:match("^(%d+)")) + end + end + return nil + end + + local ts_version = detect_local_ts_version() + + if ts_version and ts_version >= 7 then + vim.lsp.config("tsgo", { + cmd = function(dispatchers, config) + local cmd = "tsc" + + if config and config.root_dir then + local local_cmd = vim.fs.joinpath(config.root_dir, "node_modules/.bin", cmd) + + if vim.fn.executable(local_cmd) == 1 then + cmd = local_cmd + end + end + + return vim.lsp.rpc.start({ cmd, "--lsp", "--stdio" }, dispatchers) + end, + filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact" }, + }) + + vim.lsp.enable("tsgo") + else + local tsserver_filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact", "vue" } + + local ts_ls_config = { + init_options = { + plugins = { + vue_plugin, + }, + }, + filetypes = tsserver_filetypes, + } + + vim.lsp.config("vue_ls", {}) + vim.lsp.config("ts_ls", ts_ls_config) + + vim.lsp.enable("vue_ls") + vim.lsp.enable("ts_ls") + end + + vim.lsp.config("jsonls", { + capabilities = capabilities, + settings = { + json = { + schemas = require("schemastore").json.schemas(), + validate = { enable = true }, + format = { enable = true }, + }, + }, + }) + + vim.lsp.enable("jsonls") + + vim.lsp.config("html", { + filetypes = { "html", "ejs", "gohtml" }, + capabilities = capabilities, + }) + + vim.lsp.enable("html") + + vim.lsp.config("emmet_language_server", { + filetypes = { "html", "css", "javascriptreact", "typescriptreact", "vue", "gohtml" }, + capabilities = capabilities, + }) + + vim.lsp.enable("emmet_language_server") + + vim.lsp.config("cssls", { + filetypes = { "css", "scss", "less" }, + capabilities = capabilities, + }) + + vim.lsp.enable("cssls") + + vim.lsp.config("tailwindcss", { + capabilities = capabilities, + }) + + vim.lsp.enable("tailwindcss") + + vim.lsp.config("pyright", { + capabilities = capabilities, + }) + + vim.lsp.enable("pyright") + + vim.lsp.config("lemminx", { + capabilities = capabilities, + }) + + vim.lsp.enable("lemminx") + + vim.lsp.config("gopls", { + capabilities = capabilities, + filetypes = { "go", "gomod", "gowork", "gotmpl", "gohtml" }, + settings = { + gopls = { + buildFlags = { "-tags=integration" }, + }, + }, + }) + + vim.lsp.enable("gopls") + + vim.lsp.config("rust_analyzer", { + settings = { + ["rust-analyzer"] = { + files = { + watcher = "server", + }, + check = { + command = "clippy", + }, + diagnostics = { + enable = false, + }, + }, + }, + capabilities = capabilities, + }) + + vim.lsp.enable("rust_analyzer") + + vim.lsp.config("gh_actions_ls", { + capabilities = capabilities, + filetypes = { "yaml" }, + settings = { + yaml = { + schemas = { + ["https://json.schemastore.org/github-workflow.json"] = "/*/.github/workflows/*", + }, + }, + }, + }) + + vim.lsp.enable("gh_actions_ls") + + vim.lsp.config("sqlls", { + capabilities = capabilities, + filetypes = { "sql" }, + }) + + vim.lsp.enable("sqlls") + + vim.api.nvim_create_autocmd("LspAttach", { + group = vim.api.nvim_create_augroup("UserLspConfig", {}), + callback = function(ev) + local client = vim.lsp.get_client_by_id(ev.data.client_id) + + if not client then + vim.notify("LSP client not found", vim.log.levels.ERROR) + return + end + + if not client.server_capabilities then + vim.notify("LSP server not ready yet", vim.log.levels.WARN) + return + end + + client.on_error = function(err) + vim.notify(string.format("LSP server error: %s", err.message), vim.log.levels.ERROR) + end + + client.on_status = function(status) + if status == "stopped" then + vim.notify("LSP server stopped", vim.log.levels.WARN) + elseif status == "running" then + vim.notify("LSP server running", vim.log.levels.INFO) + end + end + + local omnisharp = require("omnisharp_extended") + + if client.name == "omnisharp" then + vim.keymap.set( + "n", + "gd", + omnisharp.telescope_lsp_definition, + { desc = "Go to definition", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "gi", + omnisharp.telescope_lsp_implementation, + { desc = "Go to implementation", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "gr", + omnisharp.telescope_lsp_references, + { desc = "Go to references", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "D", + omnisharp.telescope_lsp_type_definition, + { desc = "Go to type definition", buffer = ev.buf } + ) + else + vim.keymap.set( + "n", + "gd", + vim.lsp.buf.definition, + { desc = "Go to definition", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "gD", + vim.lsp.buf.declaration, + { desc = "Go to declaration", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "gi", + vim.lsp.buf.implementation, + { desc = "Go to implementation", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "gr", + vim.lsp.buf.references, + { desc = "Go to references", buffer = ev.buf } + ) + end + + vim.api.nvim_create_autocmd({ "FileType" }, { + callback = function() + local parsers = require("nvim-treesitter.parsers") + + if parsers then + vim.opt.foldmethod = "expr" + vim.opt.foldexpr = "nvim_treesitter#foldexpr()" + else + vim.opt.foldmethod = "syntax" + end + end, + }) + + vim.api.nvim_create_autocmd("BufWritePre", { + pattern = "*.go", + callback = function() + local params = vim.lsp.util.make_range_params() + params.context = { only = { "source.organizeImports" } } + 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, + }) + + vim.keymap.set( + "n", + "ca", + vim.lsp.buf.code_action, + { desc = "Code actions", buffer = ev.buf } + ) + + vim.keymap.set("n", "rn", vim.lsp.buf.rename, { desc = "Rename", buffer = ev.buf }) + + vim.keymap.set( + "n", + "e", + vim.diagnostic.open_float, + { desc = "Display error for current line", buffer = ev.buf } + ) + + vim.keymap.set( + "n", + "ea", + ":Telescope diagnostics bufnr=0", + { desc = "Display errors for current buffer", buffer = ev.buf } + ) + + vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Display symbol info", buffer = ev.buf }) + end, + }) + end, + }, }