プラグイン無しでファイル名からファイルを探す(:find)
fzfのようなファジーファインダーを入れるほどでもありませんが、ファイル名の一部だけを覚えていて、それを手がかりに開きたいことがあります。Vim標準の:findコマンドは、設定さえしておけばこの用途に十分応えます。
| キー | これだけ覚える |
|---|---|
set path+=$PWD/** | 下準備(サブディレクトリも検索対象に) |
:find {ファイル名} | 名前の一部からファイルを探して開く |
| Tab | 入力中に候補を補完 |
下準備:pathオプションの設定
set path+=$PWD/**
:findはpathオプションに登録されたディレクトリの中からファイルを探します。デフォルトではカレントディレクトリと/usr/include程度しか対象になっていないため、このように**(サブディレクトリを再帰的に含む)を追加しておく必要があります。設定ファイルに書いておけば毎回設定し直す手間がありません。
:set path? " 現在のpath設定を確認
ファイルを探して開く
:find {ファイル名}
ファイル名(の一部)を入力すると、path配下から一致するファイルを探して編集モードに入ります。入力中にTabを押すと候補が補完される点も便利で、正確なファイル名を覚えていなくても、途中まで打って補完に頼ることができます。
:find api
:find api.js
path配下に一致するファイルが1つだけなら、Tabでフルネームまで一気に補完されます。
分割・タブで開きたい場合
:sfind {ファイル名} " 水平分割で開く
:vert sfind {ファイル名} " 垂直分割で開く
:tabfind {ファイル名} " 新規タブで開く
:find系のコマンドにも、他の編集系コマンドと同じように分割・タブのバリエーションが用意されています。使う頻度が高いなら、好みの開き方をキーマッピングしておくと快適です。
fzfとの違い
あいまい検索やインクリメンタルな絞り込みという点では、fzfのような専用プラグインのほうが高機能です。ただし、そこまでの検索精度を毎回必要としないなら、プラグイン無しで完結する:findで十分なことも多くあります。まずは標準機能で困るかどうかを確かめてから、プラグイン導入を検討する順番でも構いません。複雑な条件での検索(内容による絞り込みなど)が必要なら、OSの検索コマンドやgrep系のツールに任せたほうがシンプルで速いことが多くあります。
path+=$PWD/**を設定しておけば、あとは:findとTab補完でファイル名の一部から目的のファイルにたどり着けます。高度なあいまい検索が必要なければ、これだけで十分実用になります。
最初はfzf系のプラグインを入れないと不便だろうと思い込んでいましたが、pathを設定した:findだけでも普段の用途にはほぼ困らないことに気づきました。プロジェクトの規模が大きくなって候補が多すぎると感じ始めたら、そこで初めて専用プラグインを検討すればよいと今は考えています。
大きなプロジェクトでは重くなることがある
**による再帰検索は、対象ディレクトリの規模が大きいと補完の反応が遅くなることがあります。node_modulesのような巨大な依存ディレクトリを検索対象から除外したい場合は、pathの設定を工夫するか、.gitignoreを尊重してくれる専用プラグインに切り替えることも検討する価値があります。
まとめ
:findはpathの設定さえしておけば、プラグイン無しでも十分実用的なファイル検索手段になります。パスが分かっている場所を直接開きたいならgfのほうが向いています。