[[nvim-lspconfig]]にて、[[Vue3]]や[[Nuxt3]]のプロジェクトでは[[Volar]]を使用し、それ以外の[[TypeScript]]プロジェクトでは[[TypeScript Language Server]]を使用する方法。
```lua
-- VueやNuxtのプロジェクトでのみ有効にする
lspconfig.volar.setup({
filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact", "vue", "json" },
capabilities = capabilities,
root_dir = util.root_pattern("vite.config.ts", "nuxt.config.ts"),
on_new_config = function(new_config, new_root_dir)
new_config.init_options.typescript.tsdk = get_typescript_server_path(new_root_dir)
end,
})
-- VueやNuxtのプロジェクトでなければtsserverを使う
lspconfig.tsserver.setup({
single_file_support = false,
root_dir = function(fname)
-- VueやNuxtのプロジェクトではVolarに任せるので無効にする
if util.root_pattern("vite.config.ts", "nuxt.config.ts")(fname) then
return nil
end
return util.root_pattern("tsconfig.json")(fname)
end,
})
```
## VueやNuxtのプロジェクトでのみVolarを有効化
ポイントは`root_dir`のところ。
`vite.config.ts`か`nuxt.config.ts`があった場合のみ[[Volar]]を有効にする。それ以外のケースでは[[Volar]]を有効にしないので、[[React]]や通常の[[TypeScript]]プロジェクトでは[[Volar]]が有効にならない。
```lua
root_dir = util.root_pattern("vite.config.ts", "nuxt.config.ts"),
```
> [!hint]
> ここでは[[Takeover Mode]]を使用する前提としている。
## VueやNuxtのプロジェクトでなければTypeScript Language Serverを有効
ポイントは`single_file_support`と`root_dir`。
### single_file_support
```lua
single_file_support = false,
```
`tsserver`の場合、`single_file_support`は`true`に設定されているため、明示的に`false`にする。こうしないと、`root_dir`と見なさなかった(期待するファイルが存在しなかった)場合でも[[Language Server]]が起動してしまう。
### root_dir
```lua
root_dir = function(fname)
-- VueやNuxtのプロジェクトではVolarに任せるので無効にする
if util.root_pattern("vite.config.ts", "nuxt.config.ts")(fname) then
return nil
end
return util.root_pattern("tsconfig.json")(fname)
end,
```
`vite.config.ts`や`nuxt.config.ts`が存在する場合は、[[Volar]]との同時起動を防ぐために起動しない。
また、`tsconfig.json`が存在しなかった場合も、[[TypeScript]]プロジェクトではないため起動しない。