diff options
| author | Sebastian Lyng Johansen <sebastian@lyngjohansen.com> | 2025-04-17 09:49:19 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-17 15:49:19 +0800 |
| commit | fd144b43c19fa52af8b6dfda6ae4ed261cecab39 (patch) | |
| tree | 93afcd0e0a5b214f7a7e23be37c166014eb1ea46 /lsp/volar.lua | |
| parent | docs: update configs.md (diff) | |
| download | nvim-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.lua | 97 |
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, +} |
