Corfu 补全的使用姿势

最近挺多人开始使用 vertico + orderless + consult 的组合来替换 ivy/counsel(参考子龙山人的视频介绍),而在补全方面最近又有了新的选择 Corfu,可以用来替换 Company

Corfu 的作者同时也是 vertico 和 consult 的作者,Corfu 其实就是用于在 buffer 中补全的 vertico。

对于 Corfu ,我觉得最大的亮点是可以集成 orderless 进行快速过滤候选列表。

我从 Company 换到 Corfu 主要是以下原因:

  1. 支持 orderless ,获得和 vertico 一样的体验
  2. 可以在 haskell 交互模式下使用(company 在这个模式下有bug:haskell-mode/issues/1332
  3. UI 采用的是 child frame, 看起来更好看。
  4. 据说对 lsp 补全速度有提升,见这里的讨论

不知道是什么原因让你也换到 Corfu?一起聊一下 Corfu 的应用?

14 个赞

我也差不多是这些原因。另外corf的补全后端貌似比company简单

是的,作者就希望 Corfu 是一个最轻量化的补全前端,理念和他其他几个包一致。他把其他后端放到 Cape 这个包了,但即使这样,还是没有成熟的 Company 那么丰富,所以又加了适配模块来支持 company 的后端(这也是用户的呼声)。

不过对我来说,加 cape 就足够了,特别好用的是 cape-symbol ,有时会用 cape-ispell 来查英语单词的拼写 :smile:

试过使用 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 的讨论:

决定观望一阵,先等生态起来再说。新东西的优势就是可以避开老事物踩过的一些坑,但是同时也意味着少了很多功能。。。

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 对原生按键用户来说不好适应 :grinning_face_with_smiling_eyes:),要么就放弃 orderless,空格直接退出补全。

用了几天corfu,和你一样的问题,不过我是修改了一下evil-escape让补全触发时退出corfu,留在insert-mode内,但是感觉还是怪怪的,,,所以干脆把corfu删了用consult-completion-in-region手动补全了

如果喜欢通过 minibufer 补全的话 consult-completion-in-region 确实是最佳选择。 Corfu 作者也推荐这个方式

Corfu 现在可以通过 M-Space 来启动在自动补全开启的情况更好的使用 orderless,这样鱼和熊掌可以兼得了😄。

可以直接用官方推荐的自动补全配置

更新:
要在 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 个赞

OT 一下,这是啥字体。