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, +}  |