eglot 开启时company的补全窗口会不断闪烁

使用 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 的时出现的闪烁的问题。

我感觉是overlay冲突了

应该是 company 的问题吧?毕竟是这个包负责显示的,eglot 只是负责提供补全的信息。

话说你们用 company+ lsp client 都不闪吗? :grinning_face_with_smiling_eyes:

我用 eglot + company 没问题,不过是写 rust.

很奇怪啊,tg 上也有朋友说在 gopls 上没问题,但我试了 go 也是一样问题。 Rust 我倒是没试过。

你用的 company 和 eglot 是最新版吗?

诶,又试了一下,好像是有这个问题。

lsp+company没有这个问题

:grin: 看来我并不孤独!

我换了 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就不闪了

请教下怎么开启 cache?没用过这个选项。

company-capf函数中, 修改以下行:

(`no-cache t)

将t改为nil.

这两天我在重新整 eglot 录了个视频,使用一个很小的配置 eglot + pyls ,似乎没这个问题。

可能是因为你的eglot版本不够新😄

company 的作者已经重现了这个问题,他说用20210611.2249 这个版本的eglot 没那么明显,最新版会每输入一个字母都闪。

并且也没法关闭 flymake,造成诊断信息不断高亮并刷新窗口内容。

不过他目前没时间深挖具体原因。

看来还是 eglot 的问题。

那应该用个之前的 eglot 的版本就可以,我觉得。