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

你先说一下你的需求,你要干啥吧,先不要说你准备怎么做。

你好,我主要在terminal中使用,配合 corfu-terminal, 使用lsp-mode和eglog都没什么问题, 使用lsp-bridge的话orderless的模糊匹配失灵, 像下图:

Kapture 2022-05-29 at 18.03.51

输入 ta C-e in时, 可以看到模糊匹配一闪而过然后直接就以 in 为前缀重新刷新candidates了.不知道该怎么debug 复现配置:

(require 'orderless)

(require 'corfu)
(keymap-set corfu-map "C-e" #'corfu-insert-separator)
(global-corfu-mode)

(require 'corfu-terminal)
(setq corfu-terminal-disable-on-gui nil)
(corfu-terminal-mode)

(require 'lsp-bridge)
(require 'lsp-bridge-orderless)
(add-hook 'sh-mode-hook #'lsp-bridge-mode)

emacs 版本是 “29.0.50”, 使用gui没有问题.

其实是想看看能不能把lsp-bridge 返回的references 接到 lsp-ui-peek那边去。

因为我主要用find-reference的话,还是看代码多一点。lsp-ui那边的界面比较sexy :rofl: lsp-bridge的那个find-reference太强大了。

那就替换 lsp-bridge-popup-references 就好了

直接重定义lsp-bridge-popup-references啊, 真是我未曾设想过的方法 :triumph:

我看了下, lsp-bridge返回的references 是string. lsp-mode 那边返回的是plist. 要接的话。。。

我懂你意思。甚至我想要同步的的 completion 函数,这样就能支持真正的 capf 了(从而避免缓存/手动刷新的问题,而且可以和 company 或者原生 corfu 之类的一起用。

之所以可以同步是因为,如果有用户输入的话可以 abort 这个等待,其实是不会卡的,这也是 eglot 的做法。

懒猫认为这样做缺点是同步等待最多同时只能有一个。

不过我觉得 sleep/sit 不代表 elisp 做不了别的事,比如 process output filter 或者 timer 都是能处理的,所以也不会造成任何卡顿,但我没时间实现一波同步补全来验证。

我认为 lsp-bridge 的优势主要在于复杂计算在 py 中完成,而非完全异步。部分同步接口不会破坏这个优势。

以上算是记录一下我的想法。你说的用同步来支持跳转之类的肯定更没问题了,只是 py 部分得有一些结构性的修改。

当使用 lsp-bridge-show-signature-help-in-minibuffer command 的时候报越界问题

补全那个太复杂了,我不太懂补全的机制。不过跳转,查找引用这种我倒是觉得可以用同步去做。因为用户在做这种操作的时候也不会想着去做别的操作啥的。至于语法检查之类的,我感觉可以用异步去做。

换到lsp-bridge是因为有几天我在go下面补全,还有删除的时候卡的要死,不能动的那种。

lsp-bridge的补全弹的确实要快一点。

前几天我又发现好像卡顿跟我开了copilot有关

请教下使用 lsp-bridge 时如何启用 flake 8?

报个issue吧

异步总是好的,你反正都要等,同步和异步有啥区别呢?

lsp-bridge的设计目标就是不论什么操作都不能卡emacs, 其他相冲突的功能都可以用替代方案做。

为了速度,我不是很在乎capf和xref的设计,如果要兼容这些,eglot是更好的选择,但是要忍受偶尔卡一下。

大家可以测试一下比较慢的服务器,比如ruby和vue,lsp-mode卡的动不了,eglot依然会偶尔卡一下,lsp-bridge可以保证绝对不卡手。

这么说也有道理

issue 已报

已经修复了,感谢反馈。

写Rust的时候发现一个问题,这有一段代码

fn test() {
   '}
}

敲下这段代码,看看输入 } 的时候会不会直接跳到下一行 这个不知道是 rust-analyser 的问题还是 lsp-bridge 的问题

啥意思,没看懂

你手敲下这段代码试一下吧,看看有没有异常 ps: first let type

fn test() {

}

then try enter rest charaters,

fn test() {
    `}
}

你用了我的 grammatical-edit 导致的?