lsp-bridge -- 速度最快的语法补全插件

我记得是 npm 安装的

目前来看为了更好的性能禁调diagnostic是可以理解的,也有各种替代品,但是code action呢?code action应该也不会是频繁的请求吧,而且也只会被用户主动请求而不会后台自动请求。理论上来说增加code action的功能应该不会卡?

对,不会卡。

但是需要大家一起去贡献代码,lsp-bridge只是提供一个底层机制解决性能问题,保证emacs不会卡。

我不会去响应社区所有需求,毕竟不是商业软件,谁有需求就去写PR吧。

2 个赞

可惜实现语言是 python ,要是 rust 就好了,不太喜欢 pip 装一堆依赖

只要安装一个 epc,没有一堆 :grinning_face_with_smiling_eyes:

2 个赞

LSP是IO密集型的,rust性能没有用武的地方,而且开发效率python比rust快多了。

7 个赞

感谢 @EdmondFrank 大佬,lsp-bridge现在已经支持ruby语法补全了。

1 个赞

重命名操作已经实现。

性能是一方面,Rust 本身就带有宣传效果。Rust 开发效率是要差些,但只要编译通过了,出问题的可能性就很小了,尤其是多线程方面,这是其他语言没有的特点。

Anyway,提到这点,只是记得之前帖子说过要用 Rust 来写这个新的 LSP,略有遗憾而已。

我是实用主义者,哈哈哈哈。

你这个 tab 是啥?

sort-tab

lsp-bridge 已经支持多语言混合编程了,比如一个项目里面 python 和 ruby 两种语言,在 python 文件写代码时, lsp-bridge 会自动调用 pyright 提供补全服务,切换到 ruby 文件写代码, lsp-bridge 会自动调用 solargraph 来提供补全服务, 不需要用户任何设置。

目前已经支持 pyright (python) 和 solargraph (ruby) 两种编程语言,新加编程语言也很简单:

  1. 在 lsp-bridge/langserver 目录下新建和 lsp server 同名的 JSON 文件, 比如 pyright 服务器就新建 pyright.json 的文件

  2. 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": ""
  }
}
  1. 新建好 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)
  1. 最后添加新加的mode到自己的配置文件,比如:
(dolist (hook (list
               'python-mode-hook
               'ruby-mode-hook
               ))
  (add-hook hook (lambda ()
                   (lsp-bridge-enable)
                   )))

给lsp-bridge添加新的编程语言支持主要是第二步,剩下的协议通讯和工程探测 lsp-bridge 会自己搞定,欢迎大家提交 PR, 只要第二步配合好, lsp-bridge 马上就可以支持你正在用的编程语言。

10 个赞

感谢 @jiacai2050 的补丁 add rust-analyzer support by jiacai2050 · Pull Request #5 · manateelazycat/lsp-bridge · GitHub

Rust 语言已经支持了!

1 个赞

一个项目里对同一个文件,同时用两个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 就行了。