Skip to content

feat(volar): add vim.lsp.config support #3737

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 17, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions lsp/volar.lua
Original file line number Diff line number Diff line change
@@ -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,
}
Loading