Emacs的补全界面能否支持这种匹配风格?

應該是 fussy 的 completion-styles 出了問題. 我自己的配置是沒這問題的. :thinking:

2023-12-10 00 03 34

1 个赞

能分享下不用 fussy 和配置方法吗?我这边也试试看

這裡是我的配置, 我是使用了自己寫的 vertico-flx . 不過我個人是不推薦任何人使用的, :thinking: 畢竟 fussy 可客製化程度較高, 也比較簡單. :joy:

1 个赞

这个包确实超级好用!

但是我遇到一个不太明白的地方:

我目前只使用了 company-dabbrev-code 后端,用来补全一些变量名。比如我想补全 PanelVariables 这个变量,我只有写 “pvar” 、 “pable” 等才会有这个补全(即,第一个字母必须得对上),如何才能实现 “variable” 前缀也能补全 PanelVariables 呢?

能解釋得更詳細點嗎?我使用是沒有這問題的. :thinking: flx 字首比重比較重; 不過不會到不能補全的地步.

我用的是 company-fuzzy 这个包。

我的需求是:如下图,我开启了 company-dabbrev-code 这个后端,我希望匹配 doom-font 这个变量。我希望我输入 “fon”时,就能出现 doom-font 的匹配项,但实际上并不会(似乎首字符不匹配时,就已经不会出现在候选项里了),因此我必须使用“dfon”才能出现我想要的匹配(如下图)。

image

我发现我的需求其实有人提过issue:Ignores candidates that do not match prefix · Issue #38 · jcs-elpa/company-fuzzy · GitHub ,但似乎并没有解决。

目前我自己稍微 hack 了一下,已经达到我想要的效果了(如下图),目前还不知道会不会遇到某些 bug (比如某些后端不接受空的 key)或者性能问题,反正我先用着,感谢您的包,非常好用!

image

hack 代码如下:

(define-advice company-fuzzy--call-backend
        (:override (backend command key) force-empty-key)
      ;; (ignore-errors (funcall backend command key))
      (ignore-errors (funcall backend command "")))

其实就是强制使用空的前缀,来获得所有的候选项。

其实我还有一个疑问:为什么这张图片中,对于第一个候选项 doom-font,“dfon”似乎匹配了很多字符(即绿色高亮的字符,下面我用 [ ] 指示):[d][o][o]m-[f][o][n]t,为什么不是:[d]oom-[f][o][n]t呢,前两个 o 的匹配是怎么来的呢?难道是乱序吗?

我对 flx 的匹配机制并不了解,有没有什么手册供我学习?

主要是因為效能還有設計上的問題. 效能是指第一個字母匹配時, 匹配數量太高. 往往第一個字母就會很卡 (我個人喜歡一開始就匹配的感覺). 設計的問題是指, 不是所有的 company backend 都有相同的規則. 所以並不適用所有的 backend. :thinking: 當然是有其他解決方法, 不過我認為現在就足夠好用了. :sweat_smile:

這算是折衷方案, 因為 company-fuzzy 支持十幾種模糊匹配的演算法. 我沒有花足夠的時間對每個算法做高亮 (也不是所有算法都有提供 vertices), 所以就單純把所有匹配的字符高亮起來. :sweat_smile: 所以答案是亂序沒錯.

原来是这样 :+1:

我自己也发现有点卡,尤其是 emacs-lisp-mode 下的 company-capf 的候选项太多了。

所以目前我就在某些条件下再打开,还挺好用的,这个包真的厉害!

(define-advice company-fuzzy--call-backend
    (:override (backend command key) force-empty-key)
  (if (member backend '(company-keywords company-dabbrev company-dabbrev-code))
      (ignore-errors (funcall backend command ""))
    (ignore-errors (funcall backend command key))))

明白了,所以总结起来:

匹配还是顺序匹配的:“dfon”匹配了 doom-font[d]oom-[f][o][n]t

而高亮,是所有出现的字符都被高亮了,所以高亮了 doom-font 中所有的“d”、“f”、“o”、“n”。

感谢答疑!

1 个赞