最近挺多人开始使用 vertico + orderless + consult 的组合来替换 ivy/counsel(参考子龙山人的视频介绍) ,而在补全方面最近又有了新的选择 Corfu ,可以用来替换 Company 。
Corfu 的作者同时也是 vertico 和 consult 的作者,Corfu 其实就是用于在 buffer 中补全的 vertico。
对于 Corfu ,我觉得最大的亮点是可以集成 orderless 进行快速过滤候选列表。
我从 Company 换到 Corfu 主要是以下原因:
支持 orderless ,获得和 vertico 一样的体验
可以在 haskell 交互模式下使用(company 在这个模式下有bug:haskell-mode/issues/1332 )
UI 采用的是 child frame, 看起来更好看。
据说对 lsp 补全速度有提升,见这里的讨论
不知道是什么原因让你也换到 Corfu?一起聊一下 Corfu 的应用?
15 个赞
我也差不多是这些原因。另外corf的补全后端貌似比company简单
是的,作者就希望 Corfu 是一个最轻量化的补全前端,理念和他其他几个包一致。他把其他后端放到
Cape 这个包了,但即使这样,还是没有成熟的 Company 那么丰富,所以又加了适配模块来支持 company 的后端(这也是用户的呼声)。
不过对我来说,加 cape 就足够了,特别好用的是 cape-symbol ,有时会用 cape-ispell 来查英语单词的拼写
试过使用 corfu,可惜TUI下无法使用,所以又回到了 company
作者貌似有提到在TUI下面会fallback到overlay的方式,如果有问题可以去Github提issue
我试过,在 TUI 下弹不出补全。README 中提到的是 falls back 到默认的 completion-in-region-function
设置,这个不就是 Emacs 自带的那个方式吗?
不过没 TUI 使用 Emacs 的强烈需求,iterm2 下使用 Emacs ,一堆快捷键冲突。
开始 Corfu 是用 overlay 实现弹出窗口的,但是因为问题太多,作者不想花费太多时间去像 Company 那样对各种问题进行 workaround,于是放弃继续修 overlay 的 popup,希望通过显示引擎彻底解决问题,所以后来才切换到使用 child frame。
看来使用 TUI 的用户暂时不适合用 Corfu。
详情见这个 issue 的讨论:
opened 07:59PM - 27 Apr 21 UTC
closed 10:38AM - 28 Apr 21 UTC
bug
Hi @minad, this is a follow-up on an exchange at Reddit. Since you fixed everyt… hing I even mentioned there, I took it upon myself to bring you something else. ;-)
It seems the completion overlays of `corfu` and outline folded headings (including Org's) are a little at each other's elbows. I collected a couple of cases, for Org and outline-minor.
In the case of Org mode, if the completion popup stretches over a folded header, it is revealed.
This is the situation immediately before calling `completion-at-point`:
![Screenshot from 2021-04-27 16-43-39](https://user-images.githubusercontent.com/19410606/116304672-34951900-a779-11eb-8adb-73bbe301fac5.png)
Calling `completion-at-point` results in:
![Screenshot from 2021-04-27 16-44-07](https://user-images.githubusercontent.com/19410606/116304628-29da8400-a779-11eb-848b-e9f33da02445.png)
For `outline-minor-mode` the previous folded heading is also revealed but, additionally the folded header breaks `corfu`'s popup alignment.
This is the situation immediately before calling `completion-at-point`:
![Screenshot from 2021-04-27 16-51-12](https://user-images.githubusercontent.com/19410606/116304610-21824900-a779-11eb-9088-d018fd22665c.png)
Calling `completion-at-point` results in:
![Screenshot from 2021-04-27 16-51-44](https://user-images.githubusercontent.com/19410606/116304596-1c24fe80-a779-11eb-9f8c-572dc5d9446f.png)
And, again, thanks for the great package!
决定观望一阵,先等生态起来再说。新东西的优势就是可以避开老事物踩过的一些坑,但是同时也意味着少了很多功能。。。
4 个赞
目前 Corfu 设置的是自动触发,感觉在这种模式下和 orderless 配和的并不好,因为 orderless 是用空格来进行分词,而空格也是正常的变量和关键字之间的分隔符,需要频繁的 C-g 取消弹出窗口。
Corfu + orderless 更好的方式应该还是手动触发。但习惯了自动触发,要再去适应手动触发,感觉很难受。暂时还是在 corfu 用 company 的补全风格
(use-package corfu
:init
(setq corfu-auto t)
(setq corfu-quit-at-boundary t)
(corfu-global-mode))
(use-package orderless
:demand t
:config
(setq completion-styles '(orderless partial-completion)
completion-category-defaults nil
completion-category-overrides '((file (styles . (partial-completion))))))
1 个赞
如果希望能够使用和company近似的功能,功能多而全,建议用回company,没必要浪费时间折腾一个新的生态。我换成corfu就没想着要完全复现company,我只是因为想减轻后面我维护自己代码的负担,这是两个包,出发点不同生态也不同。就像切换到meow之类的之后,再想用meow复刻evil也没什么意义
2 个赞
我不是要 company 的功能多而全,只是在补全风格上还没找到一个平衡点。
你是使用手动触发,还是自动触发?
能分享一下你的 Corfu + orderless 配置吗?
(setup (:pkg corfu)
(:option
;; Optional customizations
corfu-cycle t ;; Enable cycling for `corfu-next/previous'
corfu-auto t ;; Enable auto completion
;; (corfu-quit-at-boundary t) ;; Automatically quit at word boundary
corfu-quit-no-match t ;; Automatically quit if there is no match
corfu-preview-current nil ;; Disable current candidate preview
corfu-echo-documentation nil ;; Disable documentation in the echo area
corfu-auto-prefix 2
)
(:with-map corfu-map
(:bind [tab] corfu-next
[backtab] corfu-previous
"<escape>" corfu-quit))
(corfu-global-mode)
)
我开了自动补全和空格匹配,对于你提到的补全混乱问题,这个的确有些鱼与熊掌不可兼得。我的方案是对esc绑定了corfu-quit,因为我是一个前vim现meow用户,esc太习惯了,如果发现匹配太长了就随手esc一下,已经输入的内容会保持输入,如果c-g的话我记得会直接删除这些字符,因此c-g不太行的。
另外,我感觉如果上一个单词已经输入完成了,然后输入下一个单词,结果两个单词一起补全这种情况有一些奇怪,一般输入完一个变量或者函数会敲一下回车选择,如果是很短的变量一下子就输完了,后面继续输入新的内容,那用quit可以解决我的问题。
默认情况下corfu在这里的esc默认逻辑是多层退出,也就是不断地后退选择内容和输入内容,这个逻辑我觉得有些反直觉
目前我用起来挺好的,没遇到什么不适应的情况,也可能是我用的包不多?基本就eglot啥的,空格匹配,配合esc取消补全,这点似乎和其他编译器差别不大,我感觉用起来挺好
多谢,看来只能要么适应一下 C-g / ESC 退出(我是原生按键,C-g 是正常退出,不会删除输入;ESC 对原生按键用户来说不好适应 ),要么就放弃 orderless,空格直接退出补全。
SPQR
2022 年1 月 26 日 07:13
16
用了几天corfu,和你一样的问题,不过我是修改了一下evil-escape让补全触发时退出corfu,留在insert-mode内,但是感觉还是怪怪的,,,所以干脆把corfu删了用consult-completion-in-region手动补全了
如果喜欢通过 minibufer 补全的话 consult-completion-in-region 确实是最佳选择。
Corfu 作者也推荐这个方式
1 个赞
Corfu 现在可以通过 M-Space 来启动在自动补全开启的情况更好的使用 orderless,这样鱼和熊掌可以兼得了😄。
可以直接用官方推荐的自动补全配置
minad:main
← jdtsmith:boundary-separator
opened 05:13PM - 06 Feb 22 UTC
Implement a component separator character and associated insertion command (`cor… fu-insert-separator-char`), used to inhibit quitting at completion boundaries (see #119). This character is also removed from prefix sorting, superseding #118.
This is useful for multi-component completion styles such as orderless. A convenient key binding for `corfu-insert-separator-char` such as `M-SPC` can be used to insert the initial completion component separator.
Obsoletes `corfu-quit-at-boundary` (for v0.19). Setup documentation is provided.
更新:
要在 eglot 下使用 orderless,因为 eglot 会更改completion-category-defaults
这个变量。
需要通过修改 completion-category-overrides
改为 orderless
(use-package orderless
:demand t
:config
(setq completion-styles '(orderless flex)
completion-category-overrides '((eglot (styles . (orderless flex))))))
详细内容可以参考这个issue: How to make corfu + orderless work well with eglot + clangd · Issue #136 · minad/corfu · GitHub
5 个赞
最近给 Corfu 加了 kind-icon ,通过 svg-lib 启用了新的图标。可是这些图标不是一次性全部下载下来,而是第一次使用到才会到 GitHub 去下载,速度很慢,非常影响使用体验。
我这里手动去上游仓库把所有的图标下载后,整理到一起,需要的朋友从我的个人Github仓库直接下载 然后拷贝到 .emacs.d/.cache/svg-lib/
文件夹下即可。
同时,通过 kind-icon ,用户可以替换所有的图标为自己喜欢的图标,更多的图标可以在Templarian/MaterialDesign-SVG 下载
5 个赞