背景
こんばんは。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
(デフォルト) -
fast
default
- C言語で記述されているall-completions
を使用します。 -
orderless
orderless-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-prescient
company-box
-
company-capf
+company-yasnippet
+company-dabbrev
flex
fussy (liquidmetal + fast default)
低スペックなPCでもサクサク動きます。
終わりに
fussyは最近できたばかりのパッケージ(2022年5月31日時点)のようで、今後大きな変化があるかもしれません。
しかし、とてもサクサク動いていいパッケージなので今後も使い続けたいと思います。