我记得是 npm 安装的
目前来看为了更好的性能禁调diagnostic是可以理解的,也有各种替代品,但是code action呢?code action应该也不会是频繁的请求吧,而且也只会被用户主动请求而不会后台自动请求。理论上来说增加code action的功能应该不会卡?
对,不会卡。
但是需要大家一起去贡献代码,lsp-bridge只是提供一个底层机制解决性能问题,保证emacs不会卡。
我不会去响应社区所有需求,毕竟不是商业软件,谁有需求就去写PR吧。
可惜实现语言是 python ,要是 rust 就好了,不太喜欢 pip 装一堆依赖
只要安装一个 epc,没有一堆
LSP是IO密集型的,rust性能没有用武的地方,而且开发效率python比rust快多了。
重命名操作已经实现。
性能是一方面,Rust 本身就带有宣传效果。Rust 开发效率是要差些,但只要编译通过了,出问题的可能性就很小了,尤其是多线程方面,这是其他语言没有的特点。
Anyway,提到这点,只是记得之前帖子说过要用 Rust 来写这个新的 LSP,略有遗憾而已。
我是实用主义者,哈哈哈哈。
你这个 tab 是啥?
sort-tab
lsp-bridge 已经支持多语言混合编程了,比如一个项目里面 python 和 ruby 两种语言,在 python 文件写代码时, lsp-bridge 会自动调用 pyright 提供补全服务,切换到 ruby 文件写代码, lsp-bridge 会自动调用 solargraph 来提供补全服务, 不需要用户任何设置。
目前已经支持 pyright (python) 和 solargraph (ruby) 两种编程语言,新加编程语言也很简单:
-
在 lsp-bridge/langserver 目录下新建和 lsp server 同名的 JSON 文件, 比如 pyright 服务器就新建 pyright.json 的文件
-
JSON文件分别有 name, languageId, command 和 settings 字段, name 一般和 lsp server 一样, languageId 主要是打开文件时传送给 lsp server 的, 一般就是语言名称, command 是 lsp server 启动参数, settings 是语言服务器初始化的配置选项 (可以去 VSCode 那边抄参数),以pyright举例:
{
"name": "pyright",
"languageId": "python",
"command": ["pyright-langserver", "--stdio"],
"settings": {
"analysis": {
"autoImportCompletions": true,
"typeshedPaths": [],
"stubPath": "",
"useLibraryCodeForTypes": true,
"diagnosticMode": "openFilesOnly",
"typeCheckingMode": "basic",
"logLevel": "verbose",
"autoSearchPaths": true,
"extraPaths": []
},
"pythonPath": "/usr/bin/python",
"venvPath": ""
}
}
- 新建好 JSON 文件后,添加新的 mode 到
lsp-bridge-lang-server-list
, lsp-bridge-lang-server-list 定义如下:
(defcustom lsp-bridge-lang-server-list
'(
(python-mode . "pyright")
(ruby-mode . "solargraph")
)
"The lang server rule for file mode."
:type 'cons)
- 最后添加新加的mode到自己的配置文件,比如:
(dolist (hook (list
'python-mode-hook
'ruby-mode-hook
))
(add-hook hook (lambda ()
(lsp-bridge-enable)
)))
给lsp-bridge添加新的编程语言支持主要是第二步,剩下的协议通讯和工程探测 lsp-bridge 会自己搞定,欢迎大家提交 PR, 只要第二步配合好, lsp-bridge 马上就可以支持你正在用的编程语言。
感谢 @jiacai2050 的补丁 add rust-analyzer support by jiacai2050 · Pull Request #5 · manateelazycat/lsp-bridge · GitHub
Rust 语言已经支持了!
一个项目里对同一个文件,同时用两个lsp server能支持吗?比如同时用tsserver + eslint
同时用两个,补全或跳转听哪个服务器的?哈哈哈哈
我在lsp-mode下,ts项目一直是同时启用两个server的,我没有看过细节,但我猜测是其中一个server(eslint)只提供了错误诊断信息,没有find definition, find reference这些能力。所以调用的时候也不会有冲突。
先想清楚吧,同时用两个服务器,技术实现没啥问题,只是要问为什么要这么做?
没遇到冲突还是不会冲突区别还是很大的。
按照LSP协议,不应该存在功能残缺的lsp server,同时启用两个肯定会冲突的。
如果另外一个只诊断,那就不是lsp server,那为啥不把那个只诊断的程序当做flycheck后端呢?
我现在就是lsp-bridge用语意补全,flycheck做诊断检查。
启用两个服务器还是挺常见的,lsp 协议并没有规定得把所有功能都实现。就实现一个 hover 功能的 lsp server 一大把,同一个文档同时用两个以上 hover 源也早就有。
至于冲突问题,忽略服务器声明的某个 capabilities 就行了。