「分享」Emacs 31的flex补全风格已经用Gotoh算法重写

今年2月份,Emacs 内置的 flex 补全风格已经重写,使用Gotoh算法实现。体验已经非常好了,欢迎大家体验。 详细信息请参考 Commit aa181cd: Rewrite flex completion with Gotoh algorithm

NEWS更新说明如下:

*** 'flex' completion style rewritten to be faster and more accurate.
Completion and highlighting use a new superior algorithm.  For example,
pattern "scope" now ranks 'elisp-scope-*' functions well above
'dos-codepage' and 'test-completion'.  Pattern "botwin" finds
'menu-bar-bottom-window-divider' before 'ibuffer-other-window'.

个人使用下来感觉在体验上比原来的实现更加准确了,风格和 hotfuzz 相近,目前并没有完全实现 hotfuzz 的风格。flex 作者(João Távora)在2年前是希望把 hotfuzz 合并到 Emacs,不过 hotfuzz 作者(Axel Forsman)后来一直没回应,所 flex 作者就自己实现了。

安装较新的 Emacs 31,并通过下面的设置就可以启用新的 flex:

(setopt completion-styles '(flex))

另外,eglot 默认也是使用 flex 风格,不需要任何设置。

我原来是比较喜欢 hotfuzz 风格的,之前还给 flex 作者提了 [FR] Add option to adjust the scoring for flex style,希望实现 hotfuzz 一样的风格,不过目前还没什么进展。

9 个赞

楼主能不能上点图让俺感受下不同的 style 的差别。。 我一直对这个没什么认知。。

比如你想在 M-x 中找到 emacs-init-time 这个命令,在 M-x 后输入 emait 就会配置结果如下:

使用 flex 风格+vertico 的结果

使用 hotfuzz 的话,直接输入 eit 就可以了,更加短。

hotfuzz 输入 emait 会优先匹配后续单词的首字,更加符合直觉(如图中蓝色显示的字母):

3 个赞

orderless 是不是也是类似的扩展?一直用 orderless 感觉也还不错

感觉 flex 可惜的是不能像 orderless 那样可以往前索引匹配.
比如 flex: emacs-uptime 不能输入 uptime emacs 匹配

orderless 也是类似的,不过 orderless 是需要使用空格来分开关键词。 我以前也用了很长时间的 orderless,后来发现 hotfuzz 和 flex,flx 后就不用 orderless了。 因为在 buffer 中补全时要多按一个空格很不方便。

原来如此,但我觉得自己拆空格,关键字会更准确。一般只有在第一个关键字命中大量选项才需要再输入空格进一步过滤。

3 个赞

这个确实是 orderless的优点。不过使用flex 习惯后,就算都是从首字开始问题也不大,而且我觉得更符合直觉。

不同的风格还是要自己上手体验下才知道哪个更加合适自己。我以前也是和你一样想法。

2 个赞

其实往前索引匹配还是很需要的,比如我很多时候只记得后面的内容,或者说不记得顺序。意思是用内置的这个的话,orderless 可以去掉,例如其他地方的补全都是用内置的么?

我是所有地方都用同一个补全风格(flex 或者 hotfuzz),保证体验一致。至于顺序,flex 也是可以从中间开始的,只是没法向前。

eit 的话可以将 completion-styles 设置为 '(initials),我一般这样设置,尽量少按键,匹配不上才 fallback 到 flex:

completion-styles is a variable defined in ‘minibuffer.el’.

Its value is (initials partial-completion flex)
Original value was 
(basic partial-completion emacs22)

我以前也试过 initials + 其他风格的组合使用,但这种方式还是不够智能。 因为我输入的前几个字母并不一定希望它匹配 initials

才发现设置为flex之后会影响org文档里的搜索结果,比如我要搜一个数字「46574」, consult-lines候选里把另一个不相关的文段列进来了: 「其中A组 46 6 5 8. 7 元、B组 4 3810.3元」。

最后还是回到了basic:

:custom
  (completion-styles '(orderless basic))

这个其实是 flex 风格的特点,要找的目标已经在第一选项,其他选项不用也无所谓的(在这个例子中第二选项确实没什么用处)。

我也换了不少,还是希望自己严格做拆分,大部分情况下我们是知道要搜的东西是什么的,

1 个赞

換成flex啦!

之前對這個空格很是煩惱

多謝多謝

1 个赞