NovimにファイラーFernを導入した

本記事は以前はてなブログに投稿していた記事の内容を加筆修正して移行したものです。

筆者はNeovimでファイラーとして古くから使われているNERDTreeを使っていました。 しかし、XやZennなどでFernがおすすめされていて気になったため使ってみることにしました。

実装はVimScriptですのでVim,Neovim両方で使うことが可能です!

インストール

筆者はパッケージマネージャーとしてLazy.nvimを使用しているので以下のように設定します。

1
2
3
4
5
6
7
8
9
-- filer
filer = {
    "lambdalisue/fern.vim",
}

return {
    --- 他のプラグイン 
    filer
}

ここまで設定すればとりあえず使えるようになります。 とりあえず今いるディレクトリの内容を表示するにはコマンド

1
:Fern .

を実行し、左側に表示するにはオプション-drawerを付けて

1
:Fern . -drawer

と実行します。

いい感じに表示するには

1
:Fern . -reveal=% -drawer -toggle -width=25

とオプションを付けて実行します。

ここで、各オプションの意味は以下の通りです。

  • -reveal=%: 現在focusしているバッファの内容と共に現在のディレクトリを開く
  • -toggle: もう一回同じコマンドを実行することでフィアラーを閉じる
  • -width=<width>: 左側に表示されるwindowの幅を<width>に設定する

設定

.gitignoreのような’.‘から始まる隠しファイルが見えないのは困るので、まず

1
2
-- show hidden file
vim.cmd[[let g:fern#default_hidden=1]]

を設定して隠しファイルがファイラーから見えるようにします。

長いコマンド :Fern . -reveal=% -drawer -toggle -width=25<CR>を毎回入力するのは流石に面倒なので何かショートカットのコマンドを定義することを考えます。

最初はvim.cmd[["<vim command>"]]でコマンドを定義していましたが、せっかくLuaで設定ファイルを書いているのでLuaでコマンドを定義することにしました。

筆者はNERDTreeを使用していた時に:Ntで現在いるディレクトリについて左側にファイラーが開くように設定していたので、それをついで以下のようにコマンドを実装しました。

1
2
3
4
5
6
7
8
-- toggle Fern by :Nt 
vim.api.nvim_create_user_command(
'Nt',
function ()
    vim.cmd(":Fern . -reveal=% -drawer -toggle -width=25<CR>")
end,
{nargs = 0}
)

また現在のディレクトリではなく特定のディレクトリを指定して開くコマンドも欲しいため別にNttコマンドして実装しました。 このコマンドでは:Ntt <dir><dir>の内容を左側に開くことができます。

1
2
3
4
5
6
7
8
9
-- open directory <dir> by :Ntt <dir> 
vim.api.nvim_create_user_command(
'Ntt',
function (opts)
    local  dir = opts.args
    vim.cmd(":Fern " .. dir .. " -reveal=% -drawer -toggle -width=25<CR>")
end,
{nargs = 1}
)

ここで、コマンドを実装に使っているNeovimのAPIの関数vim.api.nvim_create_user_command()の引数の意味は以下の通りです。

  • 第一引数: コマンド名を意味する文字列で必ず大文字から始める必要があります
  • 第二引数: コマンド実行時に実行される関数で、処理はこの関数内に実装します
  • 第三引数: 第二引数の関数に渡される引数の数を渡します

使ってみての感想

半年ほどNERDTreeを、それより前は標準のファイラーを使っていたいためディレクトリ階層の移動やファイルを開くなどのキーバインドが違って最初は慣れませんでしたが、すぐに慣れました。 使用した感覚ではNERDTreeよりもサクサク動くように感じました。

追記

現在(@ 2025 12/27)ではファイラーとしてはnvim-tree/nvim-tree.luaを使用しています。

CC BY
Hugo で構築されています。
テーマ StackJimmy によって設計されています。