背景
こんばんは。init.elをいじり続けてる初心者です。
最近orderlessのようにcompletion-stylesを高度にカスタマイズして、絞り込みを強化する流れが来ています。(Emacsの次世代ミニバッファ補完UI)
しかし、company等の入力補完でFuzzyに絞りたいとき、Emacs標準のflexやorderless-flexを使ってもパフォーマンスが悪かったり、company-fuzzyを使用してもうまく動かないことがあったり、なかなかFuzzyな入力に満足いきません。
そんな中、これらの問題を解消してくれそうなパッケージを見つけたので紹介します。
fussy
fussy は completion-styles に組み込むことで、Fuzzyに絞り込みをしてくれるパッケージです。 flex と大きく異なる点はスコアリングとフィルタリングのバックエンドを変更できる点です。
スコアリング
補完候補の並び替えに影響します。
-
flx(デフォルト) - キャッシュを多く使用し、flexよりも高速 -
flx-rs-flxをRust言語によって実装して、パフォーマンスを更に向上 -
fzf-native- telescope-fzf-native.nvimの動的モジュールを使用して、fzfのスコアリングを適用します -
fuz-skimとclangdのアルゴリズムを持ち、Rust言語で実装 -
liquidmetal- Quicksilverのスコアリングアルゴリズムを模倣して作成されています -
sublime-fuzzy- Sublimeの絞り込みをRust言語で実装 -
hotfuzz-flexよりもスコアリングが優秀(hotfuzz)
フィルタリング
補完候補の絞り込みに影響します。
-
flex(デフォルト) -
fastdefault- C言語で記述されているall-completionsを使用します。 -
orderlessorderless-flex-orderlessのフィルタリングを使用します。
設定
-
fussy-filter-defaultではfussy-default-regex-fnとfussy-prefer-prefixを変更することで絞り込み方法が変わります。 -
fussy-fuz-use-skim-pをtにすると、skimアルゴリズムが採用され、nilにするとclangdが採用されます。
設定は下記のようになります。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; #fussy
(straight-use-package '(fussy :type git :host github :repo "jojojames/fussy"))
;; (straight-use-package '(flx-rs :repo "jcs-elpa/flx-rs" :fetcher github :files (:defaults "bin")))
(straight-use-package '(fzf-native :repo "dangduc/fzf-native" :host github :files (:defaults "bin")))
;; (straight-use-package '(fuz-bin :repo "jcs-elpa/fuz-bin" :fetcher github :files (:defaults "bin")))
;; (straight-use-package 'liquidmetal)
;; (straight-use-package '(sublime-fuzzy :repo "jcs-elpa/sublime-fuzzy" :fetcher github :files (:defaults "bin")))
;; (straight-use-package 'hotfuzz)
;; (straight-use-package 'orderless)
(require 'fussy)
(setq completion-styles '(fussy)
completion-category-defaults nil
compleiton-category-overrides nil
;; fussy-score-fn #'flx-score
;; fussy-score-fn 'flx-rs-score
fussy-score-fn 'fussy-fzf-native-score
;; fussy-score-fn 'fussy-fuz-bin-score
;; fussy-score-fn 'fussy-liquidmetal-score
;; fussy-score-fn 'fussy-sublime-fuzzy-score
;; fussy-score-fn 'fussy-hotfuzz-score
;; fussy-filter-fn 'fussy-filter-flex
fussy-filter-fn 'fussy-filter-default
;; fussy-filter-fn 'fussy-filter-orderless-flex
;; fussy-filter-fn 'fussy-filter-orderless
)
;; (flx-rs-load-dyn)
(fzf-native-load-dyn)
;; (fuz-bin-load-dyn)
;; (sublime-fuzzy-load-dyn)
(with-eval-after-load 'company
(defun j-company-capf (f &rest args)
"Manage `completion-styles'."
(let ((fussy-max-candidate-limit 5000)
(fussy-default-regex-fn 'fussy-pattern-first-letter)
(fussy-prefer-prefix nil))
(apply f args)))
(advice-add 'company-capf :around 'j-company-capf))
比較
スペック
- CPU - Inter(R) Celeron(R) CPU 1005M @ 1.90GHz
- メモリ - 4GB
companyの構成
company-prescientcompany-box-
company-capf+company-yasnippet+company-dabbrev
flex
fussy (liquidmetal + fast default)
低スペックなPCでもサクサク動きます。
終わりに
fussyは最近できたばかりのパッケージ(2022年5月31日時点)のようで、今後大きな変化があるかもしれません。
しかし、とてもサクサク動いていいパッケージなので今後も使い続けたいと思います。

