From a4e19e9c9c939c1a3fc2f30ffefe37311d3ecadf Mon Sep 17 00:00:00 2001 From: Iordanis Petkakis <12776461+dpetka2001@users.noreply.github.com> Date: Sun, 1 Mar 2026 10:31:44 +0200 Subject: [PATCH] fix(util.lsp): `LazyVim.lsp.execute` only request single client (#6904) ## Description `LazyVim.lsp.execute` uses `vim.lsp.buf_request` which sends the request to all attached clients. `LazyVim.lsp.execute` seems to me to be the equivalent of [vim.lsp.buf.execute_command](https://github.com/neovim/neovim/blob/922816877febf397fe854f01d8013a510d73f1d2/runtime/lua/vim/lsp/buf.lua#L1366-L1376), but adds the option to also open in Trouble. Otherwise the request is being made the same way. This command will be deprecated in 0.12 and it's advised to use `client:exec_cmd` instead. Since LazyVim supports Neovim >=0.11.2, it makes sense to refactor the corresponding codeblock and use `client:cmd_exec` instead (it's already available in Neovim 0.11). I only changed the necessary parts where `vim.lsp.buf_request` was being used and not Trouble (when `opts.open = true`), since I'm not familiar with its codebase. That's also why I went for extending `params` in the `else` branch instead of adding `title` into original `params`, since I didn't know how Trouble will react to this change. Not sure if maybe there also needs to be some change there. ## Related Issue(s) Fixes #6900 ## Screenshots ## Checklist - [x] I've read the [CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md) guidelines. --- lua/lazyvim/plugins/extras/lang/elixir.lua | 4 ++++ lua/lazyvim/plugins/extras/lang/typescript.lua | 6 +++++- lua/lazyvim/plugins/extras/lang/typst.lua | 2 ++ lua/lazyvim/util/lsp.lua | 12 +++++++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lua/lazyvim/plugins/extras/lang/elixir.lua b/lua/lazyvim/plugins/extras/lang/elixir.lua index 289e50df..1be9c846 100644 --- a/lua/lazyvim/plugins/extras/lang/elixir.lua +++ b/lua/lazyvim/plugins/extras/lang/elixir.lua @@ -16,6 +16,8 @@ return { function() local params = vim.lsp.util.make_position_params() LazyVim.lsp.execute({ + title = "toPipe", + filter = "elixirls", command = "manipulatePipes:serverid", arguments = { "toPipe", params.textDocument.uri, params.position.line, params.position.character }, }) @@ -27,6 +29,8 @@ return { function() local params = vim.lsp.util.make_position_params() LazyVim.lsp.execute({ + title = "fromPipe", + filter = "elixirls", command = "manipulatePipes:serverid", arguments = { "fromPipe", params.textDocument.uri, params.position.line, params.position.character }, }) diff --git a/lua/lazyvim/plugins/extras/lang/typescript.lua b/lua/lazyvim/plugins/extras/lang/typescript.lua index 101b83f2..8acbc46a 100644 --- a/lua/lazyvim/plugins/extras/lang/typescript.lua +++ b/lua/lazyvim/plugins/extras/lang/typescript.lua @@ -113,7 +113,11 @@ return { { "cV", function() - LazyVim.lsp.execute({ command = "typescript.selectTypeScriptVersion" }) + LazyVim.lsp.execute({ + title = "Select TypeScript Version", + filter = "vtsls", + command = "typescript.selectTypeScriptVersion", + }) end, desc = "Select TS workspace version", }, diff --git a/lua/lazyvim/plugins/extras/lang/typst.lua b/lua/lazyvim/plugins/extras/lang/typst.lua index 099a6861..9f605351 100644 --- a/lua/lazyvim/plugins/extras/lang/typst.lua +++ b/lua/lazyvim/plugins/extras/lang/typst.lua @@ -24,6 +24,8 @@ return { local buf_name = vim.api.nvim_buf_get_name(0) local file_name = vim.fn.fnamemodify(buf_name, ":t") LazyVim.lsp.execute({ + title = "Pin Main", + filter = "tinymist", command = "tinymist.pinMain", arguments = { buf_name }, }) diff --git a/lua/lazyvim/util/lsp.lua b/lua/lazyvim/util/lsp.lua index 90a6a3c7..83a39cd9 100644 --- a/lua/lazyvim/util/lsp.lua +++ b/lua/lazyvim/util/lsp.lua @@ -70,9 +70,18 @@ M.action = setmetatable({}, { ---@class LspCommand: lsp.ExecuteCommandParams ---@field open? boolean ---@field handler? lsp.Handler +---@field filter? string|vim.lsp.get_clients.Filter +---@field title? string ---@param opts LspCommand function M.execute(opts) + local filter = opts.filter or {} + filter = type(filter) == "string" and { name = filter } or filter + local buf = vim.api.nvim_get_current_buf() + + ---@cast filter vim.lsp.get_clients.Filter + local client = vim.lsp.get_clients(LazyVim.merge({}, filter, { bufnr = buf }))[1] + local params = { command = opts.command, arguments = opts.arguments, @@ -83,7 +92,8 @@ function M.execute(opts) params = params, }) else - return vim.lsp.buf_request(0, "workspace/executeCommand", params, opts.handler) + vim.list_extend(params, { title = opts.title }) + return client:exec_cmd(params, { bufnr = buf }, opts.handler) end end