diff --git a/lua/lazyvim/plugins/extras/lang/vue.lua b/lua/lazyvim/plugins/extras/lang/vue.lua index 85f47772..f55de1fb 100644 --- a/lua/lazyvim/plugins/extras/lang/vue.lua +++ b/lua/lazyvim/plugins/extras/lang/vue.lua @@ -14,27 +14,12 @@ return { opts = { ensure_installed = { "vue", "css" } }, }, - -- Add LSP servers - { - "neovim/nvim-lspconfig", - opts = { - servers = { - volar = { - init_options = { - vue = { - hybridMode = true, - }, - }, - }, - vtsls = {}, - }, - }, - }, - - -- Configure tsserver plugin + -- Configure vtsls (the TypeScript plugin host) with @vue/typescript-plugin { "neovim/nvim-lspconfig", opts = function(_, opts) + opts.servers.vtsls = opts.servers.vtsls or {} + opts.servers.vtsls.filetypes = opts.servers.vtsls.filetypes or {} table.insert(opts.servers.vtsls.filetypes, "vue") LazyVim.extend(opts.servers.vtsls, "settings.vtsls.tsserver.globalPlugins", { { @@ -47,4 +32,38 @@ return { }) end, }, + + -- Hook vue_ls to forward requests to vtsls + { + "neovim/nvim-lspconfig", + opts = { + servers = { + volar = { -- when LazyVim switches to nvim-lspconfig ≥ v2.2.0 rename this to `vue_ls` + on_init = function(client) + client.handlers["tsserver/request"] = function(_, result, context) + -- find the vtsls client + local clients = vim.lsp.get_clients({ bufnr = context.bufnr, name = "vtsls" }) + if #clients == 0 then + vim.notify("Could not find `vtsls` client, Vue LSP features will be disabled", vim.log.levels.ERROR) + return + end + local ts_client = clients[1] + -- unpack the forwarded request + local params = unpack(result) + local id, command, payload = unpack(params) + -- forward it + ts_client:exec_cmd({ + title = "vue_request_forward", + command = "typescript.tsserverRequest", + arguments = { command, payload }, + }, { bufnr = context.bufnr }, function(_, resp) + -- send the tsserver/response back to Vue LSP + client.notify("tsserver/response", { { id, resp.body } }) + end) + end + end, + }, + }, + }, + }, }