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

Rust编译器需要在用户修改 toml 文件后 reindex 整个项目, 否则 toml 新加的包无法提供补全。

今天给 lsp-bridge 增加了 LSP workspace/didChangeWatchedFiles 协议的支持, lsp-bridge 最新版会根据 LSP Server 返回的监听文件列表进行自动监听, 当这些关键的项目文件变动后会给 LSP Server 发送 workspace/didChangeWatchedFiles notification 。

最新版需要用 pip 安装 watchdog 这个依赖, watchdog 这个包提供跨操作系统平台的文件系统探测能力,文件变动探测的性能要比 lsp-mode/eglot 这种用 elisp 来实现的方式性能高很多, 同时使用多线程进行文件变动探测, 即使文件变动数量巨大也不会卡住Emacs。

3 个赞

在日常编程中, LSP的优势是提供语法补全, 但是在一些创作过程中,代码还不是语义完备的, 这时候LSP的语法补全就不够用了。

今天给 lsp-bridge 增加了一个新功能

利用 LSP Server 会根据AST自动分析出所有工作区的符号(比如函数名、变量名等), 写了一个 Workspace Symbol 的补全后端, 这个后端的应用场景是, 当代码不是语义完备的时候, 自动补全当前项目所有的符号, 基于符号的补全会比文档的文本搜索补全更加精准。

这个 Workspace Symbol 后端依然是在多线程中运行, 补全过程中不会卡住Emacs。

3 个赞

lsp-bridge-popup-documentationlsp-bridge-show-documentation 能否渲染代码颜色?

光秃秃的,我记得 lsp-mode 和 eglot 的 documentation 都有代码高亮啊

github 提一个issue吧, 我有空的时候研究一下。

可以把

                "hover": {
                    "contentFormat": [
                        "markdown",
                        "plaintext"
                    ],
                    "dynamicRegistration": True
                },

加到 lspserver.py 的 default capabilities?

果然是这个原因, 感谢大佬指点, 已经修复了

@harisonkhlil 可以更新最新版看看。

解决了,:+1:

嗨呀,还有一件事

不知道是不是 acm 的问题,在 doom emacs 中,org mode 下写文本,acm-mode-map 的 acm-complete 无法触发:

Screen Recording 2024-10-08 at 09.40.52_compressed_converted

Ctrl + m acm-complete Complete completion
Return acm-complete Complete completion
Tab acm-complete Complete completion
Alt + h acm-complete Complete completion

好像全都被 doom emacs 的 org 快捷键设置覆盖了,acm 不能做到弹出补全窗口时,加载 acm-mode-map吗?等补全消失了再启动 major-mode-map

就是这样设计的,但是感觉doom的配置啊,你emacs -Q对比测试下吧

这样还有一个问题:文档不知道为什么直接滑倒了最后,不应该是从头开始吗?

emacs -Q 如下:

;;; debug.el --- Debugging -*- lexical-binding: t; -*-

(add-to-list 'load-path "~/.config/emacs/.local/straight/repos/lsp-bridge")
(add-to-list 'load-path "~/.config/emacs/.local/straight/repos/yasnippet")
(add-to-list 'load-path "~/.config/emacs/.local/straight/repos/markdown-mode")

(require 'yasnippet)
(yas-global-mode 1)

(require 'lsp-bridge)
(global-lsp-bridge-mode)

Screen Recording 2024-10-08 at 18.46.34_compressed_converted

另外一个问题,应该是 doom emacs 的 org mode 的问题,通过设置别的快捷键 M-tab 解决了,不想找具体是哪个原因了

在另外一个buffer弹出文档的功能用的少,我晚上回去看一下

lsp-bridge-show-documentation 最新版已经是显示开始的位置了, 更新最新版就好了。

看回复看的有点晚,是lsp-bridge版本太老了……
另外README里好像没有提及怎么关掉workspace-symbol啊

加了选项了。

我简直就是找 bug 小能手,又发现一个 bug?

我发现 lsp-bridge 针对这种空头文件的索引非常缓慢,但是 Neovim 表现没啥问题啊

比如 #include <fmt/core.h>

Neovim trim_converted

Emacs: Screen Recording 2024-10-08 at 22.32.14_converted

emacs -Q 也是一样的缓慢

查了 Neovim 的 lsp log 和 lsp birdge 的 log 其实没什么大差别,都是显示这个:

找不到头文件了什么的,必须要手动指定完完整整的全部头文件,才能正常速度索引,但是 lsp mode 和 eglot 都没有这个问题。应该不是 acm 的问题吧。

1 个赞

看readme关于c++的部分吧

你想说,搞个 compile_commands.json 是吗?加上 compile_commands.json 速度确实没什么问题了,但是正常来说,我本本身已经指定了 .clangd 了,配置好相关的头文件目录了,应该不会有什么问题吧(Neovim,lsp mode,eglot 速度一切正常)

我也发个bug 虽然using namespace 容易编译错误,但应该不至于让lsp-bridge乱弹acm吧

另外我发现nvim-cmp在能弹补全窗口的时候一定会弹出来,acm的触发机制好像不太一样(比如#include <ext/pb_ds/hash_policy.hpp>nvim-cmp可以一直开着补全窗口,lsp-bridge会在输入#、e、p、h的时候重新打开,补全完一项之后就关闭了。)

我不用namespace,欢迎pr

不知道有没有在TUI下使用lsp-bridge的小伙伴,lsp-bridge-popup-documentation弹不出来,log也没有报错。

在我这里他也不会弹出,但它会把window buffer 都创建出来,rime也像往常一样段错误。
所以popup-document应该是使用了posframe或者childframe之类的不支持Terminal的frame机制。