几天没写 vue,回来发现我的 volar 莫名奇妙的失效了。上 github 一看才知道,原来 volar 2.0.0 之后不再提供 TypeScript 解析,需要由 tsserver 提供。

之前在 nvim 上配置 volar 需要将 tsserver 关掉,或者使用 neoconf.nvim 等工具在项目中将 tsserver 禁用。 然后使用 volar 的 takeover (接管?)模式直接解析 ts 文件。

不必多说,参考 nvim-lspconfig/doc/server_configurations.md at master · neovim/nvim-lspconfig · GitHub 直接开搞

 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
local lspconfig = require('lspconfig')
local home = os.getenv("HOME")
require("mason-lspconfig").setup_handlers({
  function(server_name)
    local server_config = {}
    if require("neoconf").get(server_name .. ".disable") then
      return
    end
    if server_name == "tsserver" then
      server_config.init_options = {
        plugins = {{
            name = "@vue/typescript-plugin",
            location = home .. "/.local/share/pnpm/global/5/node_modules/@vue/typescript-plugin",
            languages = { "javascript", "typescript", "vue" },
          }
        },
      }
      server_config.filetypes = { 'vue', 'typescript', 'javascript' }
    end
    if server_name == "volar" then
      server_config.init_options = {
        typescript = {
          tsdk = home .. '/.local/share/pnpm/global/5/node_modules/typescript/lib',
        }
      }
      server_config.filetypes = { 'vue', 'typescript', 'javascript' }
      return
    end
    lspconfig[server_name].setup(server_config)
  end,
});

我使用 mason-lspconfig 提供的回调函数,对于mason 中安装的所有 lsp server 进行统一的配置。

使用 pnpm 全局安装的包的位置需要自己调整。

需要注意的是 ~ 并不能在 lua 中被解析为主目录,所以需要使用 lua 的接口获取主目录