使用 eglot + company 有很长时间了,但有个问题一直没怎么在意:
输入字符的时候,company 的自动补全窗口会不断闪烁。测试过的后端:clangd,pyright,gopls
最近将这个问题反馈到 eglot 讨论区,但是eglot 的维护者认为这个应该是 company 的问题。
Company 的作者也不确定这个是什么问题造成的。但不开启 eglot 的时候,company 确实是没这个问题。
不知道各位使用 eglot 的朋友有没有遇到同样的问题?
另外发现:
eglot + corfu,会有轻微微闪,因为corfu 用的是 childframe来显示补全窗口,它不开 eglot也会轻微微闪。
由于论坛无法发视频,详细效果见eglot官方仓库的讨论链接: completion box will flash when input character · Discussion #807 · joaotavora/eglot · GitHub
corfu也可以fallback到overlay的方式,可以测试看看
多谢提醒,不过使用下来,目前还没发现 childframe 有什么问题,并没有发现之前用 emacs-rime+ posframe 的时出现的闪烁的问题。
应该是 company 的问题吧?毕竟是这个包负责显示的,eglot 只是负责提供补全的信息。
话说你们用 company+ lsp client 都不闪吗?
我用 eglot + company 没问题,不过是写 rust.
很奇怪啊,tg 上也有朋友说在 gopls 上没问题,但我试了 go 也是一样问题。
Rust 我倒是没试过。
你用的 company 和 eglot 是最新版吗?
看来我并不孤独!
我换了 corfu 只有轻微微闪,company 是抖动那种闪。
lsp-mode 我也试过,确实没问题。就是lsp-mode 依赖太多了。
之前想尝试 eglot,发现同样的问题,还是用回 lsp-mode 了。
感觉像是和 flymake 画的标记有冲突
估计跟flymake 关系不大,我都是关闭flymake,用的flycheck
用 company-posframe 应该也不会那么闪了,目前已经切到 corfu + kind-icon,先用起来了。
PS: corfu 的 childframe 在 Windows 下如果弹窗大小变化时,会闪的很明显。这个应该是 Emacs 本身的问题了,因为没有弹窗时用触摸板滚动,整个屏幕都在闪。
我记得好像是因为, eglot默认会频繁更新候选列表, 开启cache就不闪了
这两天我在重新整 eglot 录了个视频,使用一个很小的配置 eglot + pyls ,似乎没这个问题。
可能是因为你的eglot版本不够新😄
company 的作者已经重现了这个问题,他说用20210611.2249 这个版本的eglot 没那么明显,最新版会每输入一个字母都闪。
并且也没法关闭 flymake,造成诊断信息不断高亮并刷新窗口内容。
不过他目前没时间深挖具体原因。
看来还是 eglot 的问题。
那应该用个之前的 eglot 的版本就可以,我觉得。