1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
local util = require 'lspconfig.util'
local function get_typescript_server_path(root_dir)
local project_root = util.find_node_modules_ancestor(root_dir)
return project_root and (util.path.join(project_root, 'node_modules', 'typescript', 'lib')) or ''
end
-- https://github.com/johnsoncodehk/volar/blob/master/packages/shared/src/types.ts
local volar_init_options = {
typescript = {
tsdk = '',
},
languageFeatures = {
implementation = true,
-- not supported - https://github.com/neovim/neovim/pull/14122
semanticTokens = false,
references = true,
definition = true,
typeDefinition = true,
callHierarchy = true,
hover = true,
rename = true,
renameFileRefactoring = true,
signatureHelp = true,
codeAction = true,
completion = {
defaultTagNameCase = 'both',
defaultAttrNameCase = 'kebabCase',
},
schemaRequestService = true,
documentHighlight = true,
documentLink = true,
codeLens = true,
diagnostics = true,
},
documentFeatures = {
-- not supported - https://github.com/neovim/neovim/pull/13654
documentColor = false,
selectionRange = true,
foldingRange = true,
linkedEditingRange = true,
documentSymbol = true,
documentFormatting = {
defaultPrintWidth = 100,
},
},
}
local bin_name = 'vue-language-server'
local cmd = { bin_name, '--stdio' }
if vim.fn.has 'win32' == 1 then
cmd = { 'cmd.exe', '/C', bin_name, '--stdio' }
end
return {
default_config = {
cmd = cmd,
filetypes = { 'vue' },
root_dir = util.root_pattern 'package.json',
init_options = volar_init_options,
on_new_config = function(new_config, new_root_dir)
if
new_config.init_options
and new_config.init_options.typescript
and new_config.init_options.typescript.tsdk == ''
then
new_config.init_options.typescript.tsdk = get_typescript_server_path(new_root_dir)
end
end,
},
docs = {
description = [[
https://github.com/johnsoncodehk/volar/tree/master/packages/vue-language-server
Volar language server for Vue
Volar can be installed via npm:
```sh
npm install -g @volar/vue-language-server
```
Volar by default supports Vue 3 projects. Vue 2 projects need
[additional configuration](https://github.com/johnsoncodehk/volar/blob/master/extensions/vscode-vue-language-features/README.md?plain=1#L28-L63).
**Take Over Mode**
Volar can serve as a language server for both Vue and TypeScript via [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471).
To enable Take Over Mode, override the default filetypes in `setup{}` as follows:
```lua
require'lspconfig'.volar.setup{
filetypes = {'typescript', 'javascript', 'javascriptreact', 'typescriptreact', 'vue', 'json'}
}
```
**Overriding the default TypeScript Server used by Volar**
The default config looks for TS 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 = {
serverPath = '/path/to/.npm/lib/node_modules/typescript/lib/tsserverlib.js'
-- Alternative location if installed as root:
-- serverPath = '/usr/local/lib/node_modules/typescript/lib/tsserverlibrary.js'
}
}
}
```
- use a local server and fall back to a global TypeScript Server installation
```lua
local util = require 'lspconfig.util'
local function get_typescript_server_path(root_dir)
local global_ts = '/home/[yourusernamehere]/.npm/lib/node_modules/typescript/lib/tsserverlibrary.js'
-- Alternative location if installed as root:
-- local global_ts = '/usr/local/lib/node_modules/typescript/lib/tsserverlibrary.js'
local found_ts = ''
local function check_dir(path)
found_ts = util.path.join(path, 'node_modules', 'typescript', 'lib', 'tsserverlibrary.js')
if util.path.exists(found_ts) then
return path
end
end
if util.search_ancestors(root_dir, check_dir) then
return found_ts
else
return global_ts
end
end
require'lspconfig'.volar.setup{
on_new_config = function(new_config, new_root_dir)
new_config.init_options.typescript.serverPath = get_typescript_server_path(new_root_dir)
end,
}
```
]],
},
}
|