aboutsummaryrefslogtreecommitdiff
path: root/.config/nvim/lsp/vue_ls.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lsp/vue_ls.lua')
-rw-r--r--.config/nvim/lsp/vue_ls.lua71
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,
+}