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

这个架构设计的所有流程已经实现,代码补全、定义跳转、引用查看、重命名这四个核心功能的流程全部完成,明天根据 response 消息绘制UI和处理交互细节。

流程的逻辑: emacs hook → file action → lsp request → lsp bridge → lsp response id → file action → Qt UI → emacs insert

这个流程充分考虑异步调用、多线程、request id 比较, 基本上吸收了 EAF 和 Snails 的设计优点。

测试期间,Emacs实时编写代码,lsp-bridge实时处理上万行LSP Server返回的信息,完全不卡手, 等明天UI弄好以后,大家就可以初步体验了。

28 个赞

实测一下,流畅性和vscode一样。

还有很多细节工作要做。

19 个赞

大佬能不能测试下 lsp-volar ,这个东西在一个buffer中会开启三个后台程序,在我那卡死了

lsp-bridge不会卡emacs,最近上班忙,只能下班开发。

测试的事情你自己弄哈,我不负责其他项目的bug。

争取最终效果完全不要让用户设置任何代码,打开代码就可以立即补全,跳转定义,查看引用和重命名。

看到这最后一句,我就知道要开始看怎么安装配置eaf了,上次windows上安装失败 :laughing:

哈哈哈哈,最近上班以后时间不够了,公司忙,只能下班蚂蚁搬家了。

老王同志真是精力旺盛。。。

1 个赞

目前lsp-bridge只支持 Python, 需要安装 pyright, 然后在配置中添加:

(dolist (hook (list
               'python-mode-hook
               ))
  (add-hook hook (lambda ()
                   (require 'lsp-bridge)
                   (lsp-bridge-enable)
                   )))

打开Python文件就可以用了,补全快捷键如下:

Key Event
TAB lsp-bridge-complete-selection
M-h lsp-bridge-complete-selection
M-H lsp-bridge-complete-common
M-n lsp-bridge-select-next
M-p lsp-bridge-select-previous
M-, lsp-bridge-select-last
M-. lsp-bridge-select-first

查看定义绑定到命令 (lsp-bridge-find-define)

UI细节还需要调整,查找引用和重命名的UI还没有实现(功能已经有了)。

完整信息请查看 lsp-bridge

10 个赞

lsp-bridge核心框架和性能目标已经实现,接下来要做的事情:

  1. 优化补全菜单UI, 适应Emacs主题,美化UI细节
  2. 支持更多编程语言,目前只支持 Python/Pyright
  3. 反向支持 Elisp 的符号补全
  4. 支持引用查看和跳转 (对接 color-rg ? )
  5. 支持重命名操作
  6. 当工程文件最后一个文件关闭后,超过1分钟没有文件打开,自动关闭对应的 Server 以节省内存
  7. 利用 Popweb 显示 Web 文档
  8. 调整配置让服务器不要默认发诊断信息回来进一步提升性能(代码诊断交给 flycheck 来完成)

lsp-bridge 默认用python多线程避免Emacs卡顿,用Qt界面实现补全菜单和Web文档(不需要 company-mode),基本上做到开箱即用。

欢迎大家一起贡献代码,Emacs现在有媲美VSCode性能的补全框架了。

14 个赞

这个已经处理了,lsp-bridge会自动根据文件和工程情况自动关闭不用的 lsp server.

1 个赞

最简单的是否可以以lsp server wrapper的形式实现? lsp client(比如lsp-mode)只与它打交道, 它负责启动真实的server进程, 并控制server返回的消息数量和频率.

夹在lsp client和server之间, 所有的来往消息都经过它, 类似个消息过滤器.

是我代码没更新,我更新了最新代码,问题好像解决了,不过补全反应还是有些迟滞,有空再测试下

赞!不过用qt就不能在终端上用了?以后改成用rust?

1 个赞

最近 lsp 补全都走 tabnine 了,就是刚开始一下比较卡,后面速度都能接受。

company-tabnine 展示 annotation 跟补全内容挤在一起,不太方便看,就给关闭了

我不喜欢lsp-mode设计的臃肿

建议考虑做下前后端分离,不然前端只有pyqt实现的话,不能在终端里用

4 个赞

不会对终端做支撑,终端UI绘制太麻烦了。

1 个赞

可以支持 Emacs 自带的 completion-at-point-functions 吗?

今天想了想,干脆用 company-mode 作为补全窗口,如果有Web文档需求用 Popweb 来做吧, 这样大家在享受 lsp-bridge 高性能补全的同时也可以自定义 company 补全体验。

我实现了一个 company-lsp-bridge 后端,大家添加到 company-backends 列表里面就可以补全了。

用了 company 作为补全窗口后,这一条就不用做了, company 会自动处理。

已经切换成 company-mode 了,终端也可以用。

11 个赞