2020秋 Vim のファイラー系プラグイン比較

公開:2020/09/24
更新:2020/09/25
15 min読了の目安(約9300字TECH技術記事

どうも、いつのまにか Vim プラグイン量産していた、ありすえです。
コツコツ作ってるファイラープラグインの啓蒙活動の一環として、現存しているファイラー系プラグインの比較をしようかなと思います。

注意: 普段から自作ファイラーばかり利用しているため、他のファイラーに詳しいわけではありません。情報等間違っている可能性もあるので、ご了承ください

ウィンドウスタイルとサイドバースタイル

ファイラーはその表示方式で大きく「ウィンドウスタイル」と「サイドバースタイル」に分けることができます[1]

ウィンドウスタイル(Split window style)は以下に示すようにファイラーが通常のウィンドウに表示されるスタイルです。
基本的には、こちらのスタイルの方が Vim 標準の機能と親和性が高い(例:<C-o> で戻る)ため、Vim に慣れている方はこちらを選択すると良いと思います。

Window style

サイドバースタイル(Project drawer style)は以下に示すようにファイラーが左右どちらかに狭い幅のウィンドウで表示されるスタイルです。
このスタイルでは、開いたファイルは隣の大きなウィンドウで開かれファイラーが表示されているウィンドウはそのまま残ります。
IDE 的な使い勝手になるためとっつき易いですが、どのウィンドウで開けば良いか指定するのが難しい問題があります。
そのためいくつかのファイラープラグインでは、ウィンドウセレクタを表示することで、この問題を解決しようとしています。

Sidebar style

個人的には Vim との親和性が高いウィンドウスタイルのほうが使い勝手が良いため多用しています。
ただ、プロジェクト全体を俯瞰しながらコーディングをする場合など、サイドバースタイルのほうが便利な場面もあります。

各プラグインの大雑把な機能比較

ある ない 条件付き 不明・未調査
o - !
機能説明 Netrw Dirvish Vaffle NERDTree CHADTree coc-explorer Defx Fern
ウィンドウスタイル o o o - o o
サイドバースタイル - - - o o o o o
複数ウィンドウ[2] o o o - o
ツリー表示 o - - o o o o o
リモートファイル o o - - - - - -
圧縮ファイル o - - - - - - -
ファイル操作 o - o o o o o o
ゴミ箱 - - - - o o o o
システム実行 - - - o o o o
一括リネーム - - o - - o o
セレクター[3] - - - - o - o
非同期実行 - - - - o o o o
表示フィルター[4] - o - o o o o
Quickfix 出力[5] - - - - o - o
セッション[6] - - o - o - - -
プロパティ[7] o - - o o o -
カラム表示 o - - o -
Git 表示 - o - o o o o o
Git 操作 - - - o - o
アイコン - - o o o o o o
ハイジャック[8] o o o o - o
Jumplist [9] - o - o o
Alternate file [10] - o - o o o

各プラグイン詳細

1. Netrw

間違って :e . とかしたときに起動する Vim に標準で付属しているファイラーです。
実は今回比較するファイラーの中で最も機能的に充実しています。
ツリー表示や簡単なファイル操作もでき、リモートファイルの閲覧編集なども単体で可能です。

「じゃぁ、これでいいじゃん?」となるかというと、以下のような点から常用は難しいと個人的には感じています。

  • 内部コードが難解で第三者によるメンテが難しい
  • 上記のため解決する目処がない不具合が多い(パフォーマンス問題含む)

ただ、リモート接続先などで素の Vim を使う際などに利用できると便利なので、ある程度は使い方を知っておくと便利です。

2. Dirvish

今回紹介する中で最も機能が無いファイラーです。
何もしないので動作がとても軽快。
端的に言えばディレクトリの内容をバッファに出力するだけのプラグインです。

バッファの各行は Conceal された絶対パスなので gf などの Vim 標準機能で開くことができます。
また、編集可能バッファとして開かれるので、条件に従ったパスのみを表示したい場合は :global を使って整形することもできます。

Vim 標準ジャンプ操作や編集機能に慣れていれば、様々なことが思った通りに出来るため、とても使いやすいです。
また、ファイル操作機能が提供されてないですが、バッファが単純なパスのリストなのでスクリプトに流し込みやすく、バッチ処理的な作業であれば、むしろ得意かもしれません。
ただ、パッとファイル操作するのには向かないため、ファイル操作をメインとする場合は選択肢から外すのが良いと思います。
なお、まともなツリー表示機能がないため、プロジェクトの俯瞰等にも利用できません。

Netrw を強制ハイジャックする上に Netrw をハイジャックする別プラグイン(例:NERDTree)と相性が悪く、共存するとエラーが出ます。
いろいろなプラグインを試すことが多い人には、これもマイナスポイントかなと思います。

3. Vaffle

基本コンセプトは Dirvish に似ていますが Vim 標準の機能はあまり意識していないようです。
例えば、バッファ内容と表記が一致しているためカレントディレクトリ以外では gf などは利用できません。
そのため vim-dirvish のような Vim のジャンプ機能と編集機能を駆使した使い方はできません。
しかしながら全体として hjkl ベースの自然なマッピングがされているうえ、ファイル編集機能がついているため、最初の使い心地は vim-dirvish より良いです。
なお、Vaffle も Netrw を強制ハイジャックしますが vim-dirvish のように Netrw をハイジャックする別プラグインと相性が悪いということも無さそうです。
最近更新が滞っているのが少し気になりますが、ツリー表示が不要で極力シンプルなファイラを必要としている場合は試してみるのが良いと思います。

4. NERDTree

ほぼ説明が不要なファイラだと思います。
超高機能なファイラですが、以下の点から個人的には選択肢に入りません。

  • (個人的には)不要な機能でパフォーマンスを犠牲にしている
  • 老舗なので内部コードが古く非効率的で遅い
  • サイドバースタイル限定のため Vim 標準の機能と相性が悪い
  • デフォルトマッピングがあまり直感的ではない

老舗であるがゆえパフォーマンスの改善は難しいと思われます。
そのため、どうしても外せない機能等がない限りは、後述する高機能ファイラーのどれかに置き換えるのが良いと思います。

5. CHADTree

NERDTree の置き換えを目指して作られた(らしい)高機能ファイラです。
Neovim 限定かつ Python 依存のため、かなり人を選ぶファイラーだと思います。
カスタマイズは json ファイルで設定を少し変更できる程度のようで、あまり期待できません。
また Vim のヘルプファイルが付属されていないため、設定を変更するには Github の README を読みに行く必要があります。
ただ、ビルトインの機能が豊富なので、設定不要のオールインワン系のファイラーが欲しい場合は有力候補になりそうです。

6. coc-explorer

Coc のエコシステムを利用した高機能ファイラーです。
ファイルプロパティのフローティング表示や CocList を利用したフィルタなど、ビジュアルに対しての機能が強い気がします。
ただ、今のところ他に特筆する機能があるわけではないため既に Coc を利用していない限り選択肢に入れる必要はないと思います。
逆に既に Coc を利用している場合は他高機能ファイラーと比較して見劣りしているわけではないため、選択肢に入るかなと思います。
ちなみに、CHADTree と異なり高いカスタマイズ性を有しているので「設定不要のオールインワン系が欲しいけど細かなカスタマイズもしたい!」場合は積極的に試してみる価値がありそうです。

7. Defx

NERDTree 一強だった時代に革命を与えた vimfiler の正統後継プラグインです。
暗黒美無王こと Shougo さんの作品のため、玄人がゴリゴリにカスタマイズする前提で設計されています。そのポリシーは確固たるもので、なんとデフォルトのマッピングが与えられていません。そのため、カスタマイズなしで起動するとファイルを開くことすらできません。

最高峰のカスタマイズ性の他に、特徴的な機能として「外部プラグインで拡張可能なカラム機能」が挙げられます。これにより任意位置にアイコンやファイルサイズなどを表示することができます。

高機能かつカスタマイズ性が高いプラグインですが、その分導入難度も高めです。
まず Python に依存しているため Python から Neovim の RPC を使えるようにする前準備が必要です。
加えて Vim の場合は Neovim の RPC を模倣するブリッジプラグインの導入も必要です。
実際に利用する前には、ドキュメントの例を写経した設定ファイルを作る必要もあります。

8. Fern

Vim script のみで記載された非同期ファイラー(正確には汎用ツリービュワー)です。
使用感(パフォーマンスを含む)を大切にした高機能ファイラで、紹介したプラグインの中で唯一表示スタイルによって自動的に挙動を変更します。例えばファイルを開いた際、ウィンドウスタイルであれば同じウィンドウ、サイドバースタイルであれば隣のウィンドウで開きます。また、全ての機能をアクションという形で提供しているためマッピングしていない機能を使うことも可能です。

多くの拡張機能は Fern のプラグインという形か Wiki の Tips コードという形で提供されています。
そのため Defx ほどのカスタマイズ性はありませんが、ユーザーは必要な機能を自分で取捨選択をすることが可能です。
なお、全ての拡張機能を有効化した際の機能性は CHADTree/coc-explorer/Defx に見劣りしません。
そのため「自分が必要な機能をサクッとビュッフェ方式で取捨選択できる奴が欲しい!」という場合に有力候補になるかと思います。

Fern は外部依存がないので導入がとても楽だし、機能的にも必要なものは揃っているので、こだわりがないなら選択肢としておすすめです。
ちなみに、この記事は上記を言うためだけに徹夜で書きました。疲れた。

まとめ

Fern はいいぞ

脚注
  1. わかりやすくこの違いを取り上げた Oil and vinegar では Split window style と Project drawer style と呼ばれていましたが、日本語だとわかりにくいので勝手に命名しています ↩︎

  2. 同一タブページにて複数のウィンドウで別の内容を表示できるか否か ↩︎

  3. サイドバースタイルにて対象ファイルを開くウィンドウをセレクタで選択できるか否か ↩︎

  4. 表示内容をフィルタすることができるか否か ↩︎

  5. 表示内容を Quickfix に送ることができるか否か ↩︎

  6. Vim 終了後もツリー表示の状態維持が可能かどうか ↩︎

  7. ファイルの所有権やサイズなどの情報を表示可能かどうか ↩︎

  8. ディレクトリ表示時に Netrw の代わりに該当プラグインを利用できるか否か ↩︎

  9. Jumplist が意図した形になるように考慮しているか否か ↩︎

  10. Alternate file が意図した形になるように考慮しているか否か ↩︎