💆

Vimのビルトイン補完中にfuzzy matchの設定を切り替える

2024/07/31に公開

Vim 9.1.0463より、'completeopt'オプションにfuzzyが設定できます。

https://github.com/vim/vim/commit/a218cc6cdabae1113647b817c4eefc2b60a6902f

https://vim-jp.org/vimdoc-ja/options.html#'completeopt'

Neovimもリリース0.10.1にはこのパッチが取り込まれているはずです。

https://github.com/neovim/neovim/pull/29200

https://github.com/neovim/neovim/releases/tag/v0.10.1

fuzzy matchを使用すると、たとえば、zenn_articleという候補を、zenaで選択できるようになります。特に記号や数字を正確に入力しなくて良い点が便利です。

ただ、fuzzy補完はときどきマッチしてほしくない文字列にマッチしてしまうこともあるので、必要に応じて切り替えられると良いと思いました。

ということで、以下がinsert mode中にfuzzyを切り替える設定です。<c-g><c-f>にマッピングしています。オプションを切り替えただけでは補完候補が更新されないので、適当な文字を入力して即削除(a<bs>)することで候補を更新しています。
場合によっては一つもマッチせずpumが消えることがあるので、pumvisible()は条件に含めていません。

inoremap <expr> <c-g><c-f> &completeopt =~ 'fuzzy'
      \    ? '<cmd>set completeopt-=fuzzy<cr>a<bs>'
      \    : '<cmd>set completeopt+=fuzzy<cr>a<bs>'


<c-g><c-f>でfuzzyの設定を切り替えている様子

なお、表示している辞書はこちらの記事で紹介したソート済み辞書です。

https://zenn.dev/vim_jp/articles/09ab965ebb0f6e

余談ですが、インサートモードの<c-g>はけっこう空いているので、プレフィックスとして使いやすいです。


ビルトインの<c-g>...はこれだけしかない

Discussion