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

@happyo 方案一我已经实现了, 上面的补丁是重写了整个 TabNine 后端, 只保留原来 Elisp 安装 TabNine 的代码。

原来 Elisp 的实现是在 Elisp 端等 TabNine 进程的计算结果, 一旦 TabNine 计算时间超过 100ms 就会导致补全前端卡顿, 原来的实现已经全部删除, 新的实现用类似 lsp-bridge 的技术, 和 TabNine 通信的代码用 Python 多线程来实现。

我现在实验的效果是,不管 TabNine 占用CPU多高, Emacs 和 lsp-bridge 都丝滑流畅, TabNine 的体验性能现在和 VSCode 一致了。

3 个赞

基于新版的 TabNine 后端实现, TabNine 补全都非常流畅了, 现在只要安装了 TabNine 默认就开启 TabNine 功能, 非常好用。

不喜欢 TabNine 的可以用 (setq acm-enable-tabnine-helper nil) 来关闭。

嗯嗯,大佬效率好高啊,我升级体验下 :grinning:

我发现 Python 来写 IPC 通讯要比 elisp 快很多, 代码清晰同时代码量会少很多。

是的,我看代码简洁了很多,另外这个需要安装下orjson库,可以在文档上标注下。

README有,orjson是可选的

哈哈,可以的,用起来确实很丝滑 :grinning:

我发现 orjson 的必须依赖被 LSP auto-import 功能自动引入了 :frowning: 这个补丁已经修复了, orjson 重新变成可选的, 装了更快。

哈哈,可以的,大佬还是细心呐 :grinning:

omnisharp不反回补全项,是因为要用mono Omnisharp.exe 这样的方式启动(就挺奇怪的。。。。 看了vscode 的c#插件才发现的)。

依赖的话,需要安装dotnet 和 mono。

可以给个补丁,哈哈哈哈

但是好像不会推诊断信息

啥?能否上下文说完整?没看懂

就是Omnisharp 不会主动推送diagnostic, 语法检查似乎用不了

启动命令的话,这个参数估计不能写在json 里面。这个是OmniSharp的安装目录来着。

等我得空我写个安装命令吧,直接固定目录好了。然后我再发补丁。

lsp-bridge支持不同操作系统不同配置,只要路径固定都可以写。

在 Windows 中启用 Tabnine 补全可能会遇到问题,emacs 中调用 tabnine-bridge-install-binary 会下载文件到 emacsHOME 目录,而 lsp-bridge python 代码调用 TABNINE_BINARIES_FOLDER = os.path.expanduser("~/.TabNine/") 中的 ~ 是指代 C:/Users/XXX,和 emacsHOME 通常不一致,会找不到下载的 Tabnine。可以通过移动文件或者设置 tabnine-bridge-binaries-folder 解决。 能力有限,不会用代码优化,供各位大佬参考。

一直以来使用doomemacs,早就想用lsp-bridge了,但是因为需要用到很多的 completion backend,因此还是需要用 capf 的,所以一直没有上船。但是近来一直追踪项目的更新动态,现在 lsp-bridge 已经支持 citre backend,甚至支持输入法后端,以及已经支持多 lsp 了,这也给了我切换的动力。

如果有小伙伴使用 doomemacs,打算更换到 lsp-bridge的话,可以试下如下操作:

  1. 把 init.el 里有关 lsp 的内容全部注释掉。
  2. 在 package.el 里添加如下的段落,如果同时需要使用 acm-terminal 的话还需要非常丑陋的操作 (搞不懂 straight 这个包到底咋用,十分莫名其妙)
(package! lsp-bridge :recipe (:host github :repo "manateelazycat/lsp-bridge" :files ("*")))
(package! acm :recipe (:host github :repo "manateelazycat/lsp-bridge" :files ("acm")))
;; 如果没有上面这一行,安装 acm-terminal 的时候 doom sync 会报错,提示找不到 acm 这个包,不装 acm-terminal 不需要这奇怪的一行
(package! popon)
(package! acm-terminal :recipe (:host github :repo "twlz0ne/acm-terminal"))
  1. 在 config.el 里添加如下的段落
(customize-set-variable 'company-global-modes
                        (append company-global-modes '(python-mode)))

(use-package! lsp-bridge
  :hook
  (python-mode . lsp-bridge-mode)
  :init
  (setq acm-enable-citre t))

(unless (display-graphic-p)
  (after! acm
    (use-package! acm-terminal)))

暂时还没打算全局换成 acm,对于没补全性能要求的文件编辑,使用 capf 似乎是更好的选择。

7 个赞