lsp-bridge 的 volar 怎么配置?

lsp-bridge buffer:

— [18:09:14.247950] Send initialize request (41540) to ‘volar’ for project my-web

— [18:09:14.255215] Send initialize request (48906) to ‘emmet-ls’ for project my-web

— [18:09:14.294040] Recv response (48906) from ‘emmet-ls’ for project my-web

— [18:09:14.294228] Send initialized notification to ‘emmet-ls’ for project my-web

— [18:09:14.294268] Send workspace/didChangeConfiguration notification to ‘emmet-ls’ for project my-web

— [18:09:14.294318] Send textDocument/didOpen notification to ‘emmet-ls’ for project my-web

— [18:09:14.295207] Recv client/registerCapability request (0) from ‘emmet-ls’ for project my-web

— [18:09:14.295322] Send response to server request 0 to ‘emmet-ls’ for project my-web Recv message (error): { “jsonrpc”: “2.0”, “id”: 41540, “error”: { “code”: -32603, “message”: “Request initialize failed with message: Can’t find typescript.js or tsserverlibrary.js in "/usr/local/lib/node_modules/typescript/lib"” } }

补全效果 image

只有 emmet , 没有 volar 的

emmet-ls 好像也有问题,但是有返回 volar 没 response,是不是还需要配置?

volar 装了吗?

你本地安装volar了吗,没有的话手动安装一下

已经这样装了:npm install -g volar 其他步骤都已经按照lsp-bridge文档上的方法完成了(比如@vue/language-server也已经安装)。 还需要安装别的吗?

image volar.json里配置的是vue-language-server

cmal 26557 0.0 0.1 412048928 30416 s004 S+ 9:46上午 0:02.04 node /Users/cmal/.nvm/versions/node/v18.18.0/bin/vue-language-server --stdio

这个进程是开启的

问题可能是在这里:/usr/lib/node_modules/typescript/lib 这个路径不存在

路径导致启动不了?

;; Setup tsdk path in volar.json
(defun tsdk-path-detect ()
  (let ((bin-path (string-trim (shell-command-to-string "command -v tsc"))))
    (string-replace "bin/tsc" "lib/node_modules/typescript/lib" bin-path)))

我用这个来查找tsdk path, 你可以试一下

1 个赞

是不是lsp-bridge应该也这样用工具找路径哇,写死volar路径确实不太好

我是换一台机器就查找一下然后新建一个新的volar.json来覆盖, 确实有点烦. lsp json文件中有一些选项的的确确是需要动态设置的,想象一下你有三台机器, 每一台机器的node环境都不一样,如果写死的话吧那就意味着你得准备三份volar.json,更别提还有multi server json之类的组合, 所以可以类似 languageId 的处理, tsdk默认留空, 检测到是空,就调用自定义函数来获取

lsp-volar是这样处理的

(defun lsp-volar-get-typescript-tsdk-path ()
  "Get tsserver lib*.d.ts directory path."
  (if-let ((package-path (lsp-package-path 'typescript))
           (system-tsdk-path (f-join (file-truename package-path)
                                     (if lsp-volar--is-windows
                                         "../node_modules/typescript/lib"
                                       "../../lib")))
           ((file-exists-p system-tsdk-path)))
      system-tsdk-path
    (prog1 ""
      (lsp--error "[lsp-volar] Typescript is not detected correctly. Please ensure the npm package typescript is installed in your project or system (npm install -g typescript), otherwise open an issue"))))

哦, 对了, 好像 astro-ls 和volar都需要设置tsdk path, 我想任何基于ts server的lsp恐怕都要设置

lsp-bridge 有动态替换路径的机制: lsp-bridge/core/utils.py at 061a504e477491b1a51fe1482aa381c3c391c5e0 · manateelazycat/lsp-bridge · GitHub

大佬要不要来一个补丁?

我的理解是, 只要在json里面写上模板, lsp-bridge Python 端自动探测就好了, 这样就不用整那么多json文件了。

我去看一下, 看看把lsp-volar的抄过来

1 个赞

感谢大佬,zsbd

我想问一下 volar, volar-darwin 和 volar-windows 之间的关系, 假设我想写一个包括volar 的多 server的json配置, 需要分别设置darwin 和 windows 吗?

需要,如果每个平台的路径不一样就需要,如果路径都一样,就写一个就好了

我尝试为volar-darwin 新加了一个 template 字段: %TSDK_PATH%, 逻辑是:

  1. 如果用户设置了option: lsp-bridge-tsdk-path, 则直接替换.
  2. 否则的话会主动探测tsserver文件存在再替换,
  3. 如果前两者都不存在, 则返回空字符串.

现在的问题是打开一个vue文件, 返回的信息是初始化失败:

Recv message (error):
{
   "jsonrpc": "2.0",
   "id": 43823,
   "error": {
      "code": -32603,
      "message": "Request initialize failed with message: Can't find typescript.js or tsserverlibrary.js in \"%TSDK_PATH%\""
   }
}
Eval in Emacs: (message '"[LSP-Bridge] Request initialize failed with message: Can't find typescript.js or tsserverlibrary.js in \"%TSDK_PATH%\"")
ERROR:epc:ReturnError([Symbol('error'), 'Not enough arguments for format string'])

看起来模版替换函数并没有运行成功, 是哪里出了问题啊? @manateelazycat

你是哪个操作系统平台测试的哇?我看了 volar_windows.json 还没有替换哇

因为 replace_template 只替换 json 里面 command 的值, 你的 %TSDK_PATH% 是在 initializationOptions 字段里面的。

我手头只有mac,所以先试试 volar_darwin, 1017. # Replace template in initializationOptions. 1018. if “initializationOptions” in lang_server_info: 1019. initialization_options_args = lang_server_info[“initializationOptions”] 接下来不就是替换initializationOptions了吗?

不对, 这里还有一个