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 的应用?

9 个赞

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

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

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

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

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

3 个赞

目前 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))))))

如果希望能够使用和company近似的功能,功能多而全,建议用回company,没必要浪费时间折腾一个新的生态。我换成corfu就没想着要完全复现company,我只是因为想减轻后面我维护自己代码的负担,这是两个包,出发点不同生态也不同。就像切换到meow之类的之后,再想用meow复刻evil也没什么意义

我不是要 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: https://github.com/minad/corfu/issues/136

2 个赞

最近给 Corfu 加了 kind-icon,通过 svg-lib 启用了新的图标。可是这些图标不是一次性全部下载下来,而是第一次使用到才会到 GitHub 去下载,速度很慢,非常影响使用体验。

我这里手动去上游仓库把所有的图标下载后,整理到一起,需要的朋友从我的个人Github仓库直接下载然后拷贝到 .emacs.d/.cache/svg-lib/ 文件夹下即可。

同时,通过 kind-icon ,用户可以替换所有的图标为自己喜欢的图标,更多的图标可以在Templarian/MaterialDesign-SVG 下载

2 个赞

OT 一下,这是啥字体。