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

所以咱有时候也很讨厌那种要你提供一个 function 的框架,先对你的函数假设一堆东西,用的人为了突破这些假设又 hack 一堆东西 :rofl:

虽然可以实现可以替换的 UI 是一个优势,但 capf 很多时候又对 UI 有假设,比如 exit-function 那个东西就是给类似「按 tab 补全路径」的场景设计的(不然根本不能理解 exact 那个状态怎么来的),又比如 metadata 里的 cycle-sort-function。设计者以为他设计一个完美的框架就完事了,实际上绝对会被 UI 和它调用的那个函数的需求拽着跑,变成现在这种第三方 UI 很难和原生完全兼容的情况。capf 的情况仍然是比较好的,minibuffer 补全是真正的灾难。

1 个赞

大佬说的对,现在真是前后端bug两边夹击,本来lsp server就是实现不一,capf和corfu本身还有bug,完全没法思考了,特别是今天看了corfu-insert的时候,都不调用capf的exit-function, 那还修个锤子呀[捂脸]

1 个赞

希望尽量支持终端,child frame的话对终端用户太伤了。

是的是的,child frame + TUI 下 fallback 到终端可用的一个方案

尽力吧,lsp-bridge是一个非常消耗维护精力的项目,看看终端有没有大佬愿意帮助了。

大家提那么多需求,我一个人很难满足,没时间。

1 个赞

发布 lsp-bridge 2.0版本。

lsp-bridge 2.0 升级注意:

2.0版本不再支持corfu和company-mode, 因为 lsp-bridge 的目标是提供流畅的代码补全体验,而这依赖 lsp-bridge 独有的 push 消息机制,而Emacs内置的capf架构无法满足 lsp-bridge 的push机制。

所以,从 2.0 版本开始,我们创建了 lsp-bridge-fw.el 、 lsp-bridge-fw-history.el 分别fork自 corfu.el 和 corfu-history.el, 希望基于corfu原有的代码基础之上发展适应与 lsp-bridge push 机制的新型补全框架,以实现更高的补全性能,并彻底解决现有版本各种语言代码补全插入时的诸多bug。

lsp-bridge.el 的开发一直都注重与Emacs现有生态的兼容性,但是最近两周修复了大量关于补全插入的bug, 很难彻底修好,究其原因还是因为capf机制无法满足 lsp-bridge.el 的需要: 当产生新的代码补全时, lsp-bridg 解析LSP消息产生最新的补全列表,corfu有自己的候选词插入/替换逻辑,capf框架也有自己的插入/替换逻辑,再叠加 LSP 的三种候选词渲染优先级(textEdit、insertText和label), 特别是textEdit逻辑(通常来说是提供代码Snippet功能)时,corfu/capf/textEdit 的插入/替换逻辑相互纠缠、冲突,最终导致候选词插入时bug无法彻底修复。

最新的配置项请大家按照README说明来配置,感谢大家的支持!

10 个赞

新版配置可以参考 lazycat-emacs/init-lsp-bridge.el at master · manateelazycat/lazycat-emacs · GitHub

package-list-packages 清单里面没有 tabnine-capf 包。github搜了一次,也没发现

image

这个图标对不齐,有谁知道是什么问题吗?

在tabnine-capf 引用了一个名为 s 的包。在github里面搜了一下,叫做s的git库也有不少。 :worried:犯了选择困难症。不知道用哪个。

Symbol’s function definition is void: lazy-load-set-keys. 定义没了。

你不要完全抄我配置呀,按键定义就按照 Emacs 传统方式定义就好了

1 个赞

更新了,不知道是不是错觉,又流畅了 :dog:

新版只是 fork 了 corfu 代码,真正手术还没有开始,肯定是错觉哈。

1 个赞

你的 auto-import 的图标为啥那么大?

最新版本,C++ clangd输入的时候碰到以下错误

Debugger entered--Lisp error: (void-function lsp-bridge-ui--auto-tick)
  (lsp-bridge-ui--auto-tick)
  (setq lsp-bridge-last-change-tick (lsp-bridge-ui--auto-tick))
  lsp-bridge-monitor-after-change(316 317 0)
  self-insert-command(1 105)
  funcall-interactively(self-insert-command 1 105)
  call-interactively(self-insert-command nil nil)
  command-execute(self-insert-command)

重启吧,字数补丁。

重启没用,还是出先一样的错误 setq: Symbol’s function definition is void: lsp-bridge-ui–auto-tick

$ cat compile_commands.json 
[
{
  "directory": "/Users/donald/acm_note/code/cmake/demo01/cmake-build-debug",
  "command": "/usr/local/bin/g++-11   -isystem /usr/local/Cellar/gcc/11.1.0/include/c++/11.1.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk -mmacosx-version-min=11.6 -o CMakeFiles/main.dir/main.cpp.o -c /Users/donald/acm_note/code/cmake/demo01/main.cpp",
  "file": "/Users/donald/acm_note/code/cmake/demo01/main.cpp"
}
]