7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Emacsで新しいFuzzy補完 - fussy -

Last updated at Posted at 2022-05-31

背景

 こんばんは。init.elをいじり続けてる初心者です。
最近orderlessのようにcompletion-stylesを高度にカスタマイズして、絞り込みを強化する流れが来ています。(Emacsの次世代ミニバッファ補完UI
 しかし、company等の入力補完でFuzzyに絞りたいとき、Emacs標準のflexorderless-flexを使ってもパフォーマンスが悪かったり、company-fuzzyを使用してもうまく動かないことがあったり、なかなかFuzzyな入力に満足いきません。
 そんな中、これらの問題を解消してくれそうなパッケージを見つけたので紹介します。

fussy

 fussycompletion-styles に組み込むことで、Fuzzyに絞り込みをしてくれるパッケージです。 flex と大きく異なる点はスコアリングとフィルタリングのバックエンドを変更できる点です。

スコアリング

補完候補の並び替えに影響します。

  • flx(デフォルト) - キャッシュを多く使用し、flexよりも高速
  • flx-rs - flxをRust言語によって実装して、パフォーマンスを更に向上
  • fzf-native - telescope-fzf-native.nvimの動的モジュールを使用して、fzfのスコアリングを適用します
  • fuz - skimclangdのアルゴリズムを持ち、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-fnfussy-prefer-prefixを変更することで絞り込み方法が変わります。
  • fussy-fuz-use-skim-ptにすると、skimアルゴリズムが採用され、nilにするとclangdが採用されます。

設定は下記のようになります。

init.el

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; #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

flex

fussy (liquidmetal + fast default)

fussy

低スペックなPCでもサクサク動きます。

終わりに

 fussyは最近できたばかりのパッケージ(2022年5月31日時点)のようで、今後大きな変化があるかもしれません。
 しかし、とてもサクサク動いていいパッケージなので今後も使い続けたいと思います。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?