aboutsummaryrefslogtreecommitdiffstats
path: root/lsp/volar.lua
diff options
context:
space:
mode:
authorSebastian Lyng Johansen <sebastian@lyngjohansen.com>2025-04-17 09:49:19 +0200
committerGitHub <noreply@github.com>2025-04-17 15:49:19 +0800
commitfd144b43c19fa52af8b6dfda6ae4ed261cecab39 (patch)
tree93afcd0e0a5b214f7a7e23be37c166014eb1ea46 /lsp/volar.lua
parentdocs: update configs.md (diff)
downloadnvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.tar
nvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.tar.gz
nvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.tar.bz2
nvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.tar.lz
nvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.tar.xz
nvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.tar.zst
nvim-lspconfig-fd144b43c19fa52af8b6dfda6ae4ed261cecab39.zip
feat(volar): add vim.lsp.config support (#3737)
Diffstat (limited to 'lsp/volar.lua')
-rw-r--r--lsp/volar.lua97
1 files changed, 97 insertions, 0 deletions
diff --git a/lsp/volar.lua b/lsp/volar.lua
new file mode 100644
index 00000000..70e8690d
--- /dev/null
+++ b/lsp/volar.lua
@@ -0,0 +1,97 @@
+local function get_typescript_server_path(root_dir)
+ local project_root = vim.fs.dirname(vim.fs.find('node_modules', { path = root_dir, upward = true })[1])
+ return project_root and vim.fs.joinpath(project_root, 'node_modules', 'typescript', 'lib') or ''
+end
+
+-- https://github.com/vuejs/language-tools/blob/master/packages/language-server/lib/types.ts
+local volar_init_options = {
+ typescript = {
+ tsdk = '',
+ },
+}
+
+---@brief
+---
+-- https://github.com/vuejs/language-tools/tree/master/packages/language-server
+--
+-- Volar language server for Vue
+--
+-- Volar can be installed via npm:
+-- ```sh
+-- npm install -g @vue/language-server
+-- ```
+--
+-- Volar by default supports Vue 3 projects.
+-- For Vue 2 projects, [additional configuration](https://github.com/vuejs/language-tools/blob/master/extensions/vscode/README.md?plain=1#L19) are required.
+--
+-- **Hybrid Mode (by default)**
+--
+-- In this mode, the Vue Language Server exclusively manages the CSS/HTML sections.
+-- You need the `ts_ls` server with the `@vue/typescript-plugin` plugin to support TypeScript in `.vue` files.
+-- See `ts_ls` section for more information
+--
+-- **No Hybrid Mode**
+--
+-- Volar will run embedded `ts_ls` therefore there is no need to run it separately.
+-- ```lua
+-- local lspconfig = require('lspconfig')
+--
+-- lspconfig.volar.setup {
+-- -- add filetypes for typescript, javascript and vue
+-- filetypes = { 'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue' },
+-- init_options = {
+-- vue = {
+-- -- disable hybrid mode
+-- hybridMode = false,
+-- },
+-- },
+-- }
+-- -- you must remove ts_ls setup
+-- -- lspconfig.ts_ls.setup {}
+-- ```
+--
+-- **Overriding the default TypeScript Server used by Volar**
+--
+-- The default config looks for TypeScript in the local `node_modules`. This can lead to issues
+-- e.g. when working on a [monorepo](https://monorepo.tools/). The alternatives are:
+--
+-- - use a global TypeScript Server installation
+-- ```lua
+-- require'lspconfig'.volar.setup {
+-- init_options = {
+-- typescript = {
+-- -- replace with your global TypeScript library path
+-- tsdk = '/path/to/node_modules/typescript/lib'
+-- }
+-- }
+-- }
+-- ```
+--
+-- - use a local server and fall back to a global TypeScript Server installation
+-- ```lua
+-- require'lspconfig'.volar.setup {
+-- init_options = {
+-- typescript = {
+-- -- replace with your global TypeScript library path
+-- tsdk = '/path/to/node_modules/typescript/lib'
+-- }
+-- },
+-- on_new_config = function(new_config, new_root_dir)
+-- local lib_path = vim.fs.find('node_modules/typescript/lib', { path = new_root_dir, upward = true })[1]
+-- if lib_path then
+-- new_config.init_options.typescript.tsdk = lib_path
+-- end
+-- end
+-- }
+-- ```
+return {
+ cmd = { 'vue-language-server', '--stdio' },
+ filetypes = { 'vue' },
+ root_markers = { 'package.json' },
+ init_options = volar_init_options,
+ before_init = function(_, config)
+ if config.init_options and config.init_options.typescript and config.init_options.typescript.tsdk == '' then
+ config.init_options.typescript.tsdk = get_typescript_server_path(config.root_dir)
+ end
+ end,
+}