cmal1
1
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"”
}
}
补全效果
只有 emmet , 没有 volar 的
emmet-ls 好像也有问题,但是有返回
volar 没 response,是不是还需要配置?
cmal1
4
已经这样装了:npm install -g volar
其他步骤都已经按照lsp-bridge文档上的方法完成了(比如@vue/language-server也已经安装)。
还需要安装别的吗?
cmal1
5
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
这个进程是开启的
cmal1
6
问题可能是在这里:/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恐怕都要设置
我想问一下 volar, volar-darwin 和 volar-windows 之间的关系, 假设我想写一个包括volar 的多 server的json配置, 需要分别设置darwin 和 windows 吗?
需要,如果每个平台的路径不一样就需要,如果路径都一样,就写一个就好了
我尝试为volar-darwin 新加了一个 template 字段: %TSDK_PATH%, 逻辑是:
- 如果用户设置了option:
lsp-bridge-tsdk-path
, 则直接替换.
- 否则的话会主动探测tsserver文件存在再替换,
- 如果前两者都不存在, 则返回空字符串.
现在的问题是打开一个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了吗?