diff options
author | awy <awy@awy.one> | 2025-10-20 20:55:26 +0300 |
---|---|---|
committer | awy <awy@awy.one> | 2025-10-20 20:55:26 +0300 |
commit | 662dafc52b2c8a9426bb2197ab9246a8cda318e4 (patch) | |
tree | f9d1f20e3864360bf941fd6bc02848ed77b037a8 /.config/nvim/lsp/vue_ls.lua | |
parent | 8131d9f2898b991a2d2c7a2ac601ce9e07cc9c9f (diff) | |
download | hyprdots-662dafc52b2c8a9426bb2197ab9246a8cda318e4.tar.gz |
nvqw
Diffstat (limited to '.config/nvim/lsp/vue_ls.lua')
-rw-r--r-- | .config/nvim/lsp/vue_ls.lua | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/.config/nvim/lsp/vue_ls.lua b/.config/nvim/lsp/vue_ls.lua new file mode 100644 index 0000000..95e09e2 --- /dev/null +++ b/.config/nvim/lsp/vue_ls.lua @@ -0,0 +1,71 @@ +---@brief +--- +--- https://github.com/vuejs/language-tools/tree/master/packages/language-server +--- +--- The official language server for Vue +--- +--- It can be installed via npm: +--- ```sh +--- npm install -g @vue/language-server +--- ``` +--- +--- The language server only supports Vue 3 projects by default. +--- For Vue 2 projects, [additional configuration](https://github.com/vuejs/language-tools/blob/master/extensions/vscode/README.md?plain=1#L19) are required. +--- +--- The Vue language server works in "hybrid mode" that exclusively manages the CSS/HTML sections. +--- You need the `vtsls` server with the `@vue/typescript-plugin` plugin to support TypeScript in `.vue` files. +--- See `vtsls` section and https://github.com/vuejs/language-tools/wiki/Neovim for more information. +--- +--- NOTE: Since v3.0.0, the Vue Language Server [no longer supports takeover mode](https://github.com/vuejs/language-tools/pull/5248). + +---@type vim.lsp.Config +return { + cmd = { 'vue-language-server', '--stdio' }, + filetypes = { 'vue' }, + root_markers = { 'package.json' }, + on_init = function(client) + local retries = 0 + + ---@param _ lsp.ResponseError + ---@param result any + ---@param context lsp.HandlerContext + local function typescriptHandler(_, result, context) + local ts_client = vim.lsp.get_clients({ bufnr = context.bufnr, name = 'ts_ls' })[1] + or vim.lsp.get_clients({ bufnr = context.bufnr, name = 'vtsls' })[1] + or vim.lsp.get_clients({ bufnr = context.bufnr, name = 'typescript-tools' })[1] + + if not ts_client then + -- there can sometimes be a short delay until `ts_ls`/`vtsls` are attached so we retry for a few times until it is ready + if retries <= 10 then + retries = retries + 1 + vim.defer_fn(function() + typescriptHandler(_, result, context) + end, 100) + else + vim.notify( + 'Could not find `ts_ls`, `vtsls`, or `typescript-tools` lsp client required by `vue_ls`.', + vim.log.levels.ERROR + ) + end + return + end + + local param = unpack(result) + local id, command, payload = unpack(param) + ts_client:exec_cmd({ + title = 'vue_request_forward', -- You can give title anything as it's used to represent a command in the UI, `:h Client:exec_cmd` + command = 'typescript.tsserverRequest', + arguments = { + command, + payload, + }, + }, { bufnr = context.bufnr }, function(_, r) + local response_data = { { id, r and r.body } } + ---@diagnostic disable-next-line: param-type-mismatch + client:notify('tsserver/response', response_data) + end) + end + + client.handlers['tsserver/request'] = typescriptHandler + end, +} |