[第8回] Neovimのすゝめ – ファイルエクスプローラーを入れる

[第8回] Neovimのすゝめ – ファイルエクスプローラーを入れる

連載

本記事は複数記事の連載記事の1つです。

ファイルエクスプローラーとは

ディレクトリツリーからファイルを開くアレです。
Neovimには標準でファイルエクスプローラーが付いていて :e で開くことが出来ます。
ただし使いやすいとは言えず、サーバーなどのまっさらなVimを触る時に使う程度でしょう。

ファイルエクスプローラープラグインは色々あり、今回は多機能で導入も簡単な Fern を紹介します。

Fernは操作性に拘っているので使いやすく、非同期で処理されるので待ちもなく快適でオススメです。

Fernをインストールする

公式
lambdalisue/fern.vim

deinを使ってインストールします。

[[plugins]]
repo = 'lambdalisue/fern.vim'

二つのスタイル

Neovimのファイルエクスプローラーは大きく Split WindowProject Drawer の二種類があります。

Split Window

現在カーソルがあるウィンドウ全体でファイルエクスプローラーを開きます。
選択したファイルは同ウィンドウで開かれ、最終的にファイルエクスプローラーは消えます。

つまり、 常にファイルエクスプローラーは表示せずに必要なときだけ表示する 方式です。
コーディングするためのウィンドウ領域を広く取れるので、常に表示されていなくても良い方やノートPCなどディスプレイが小さい場合などに有効です。

欠点は、ファイルエクスプローラーを開いたときに前回の状態が保存されたりせず、現在のカレントディレクトリかウィンドウで開いているファイルパスのツリーが開いた状態で開きます。
主にfzfなどファイル名で検索するファジーファインダー系のプラグインで開く場合は問題ではないですが、ファイルエクスプローラーで点々としたファイルを開くやり方の人は手間に感じるでしょう。

コマンドラインモードに入力して試してみましょう。

ドットは相対パスの現在の位置を表しています。
起点となるパスはカレントディレクトリで確認するにはコマンドラインモードに :pwd で確認できます。

カレントディレクトリのツリーが開きます。

:Fern .

現在のウィンドウで開いているファイルの一つ上のディレクトリ以下のツリーが開きます。
% は現在のファイルパス、 :h は一つ上を表します。

:Fern %:h

カレントディレクトリのツリーを開きつつ、
現在のウィンドウで開いているファイルまでのツリーを開き、
現在のウィンドウで開いているファイルにカーソルが当たった状態で開きます。

大半の方が使うのがこれでしょう。

:Fern . -reveal=%

Project Drawer

画面上に常にファイルエクスプローラーを表示され続けます。
IDEでは標準のスタイルなので見覚えのある方も多いでしょう。

ウィンドウ領域を取りますが、開いたツリーの状態はずっとそのままです。

コマンドに -drawer オプションを付けることでドロワーモードとなり、ファイルエクスプローラーはファイルを開いたあとも消えません。

:Fern . -reveal=% -drawer

キーマップ設定例

nnoremap <leader>e <cmd>Fern . -reveal=% -drawer<cr>

キーマップを確認する

実行可能なアクション・割り当てられているキー設定は、Fernから確認できます。
Fernウィンドウ内で a キーを押して action: 入力状態にし、 help と入れることで実行可能なアクションと、その割り当てキーが確認できます。

キーマップをカスタマイズする

Fern実行時だけキーマップを有効にするために、autocmdでFernEvent時に設定するようにします。
また、一部のキーだけを変更することは出来ず、 g:fern#disable_default_mappings1 にセットしてデフォルトマッピングを無効にする必要があります。

hook_add = '''
  function! FernInit() abort
    nmap <buffer> v <Plug>(fern-action-open:side)
    nmap <buffer> M <Plug>(fern-action-new-dir)
    nmap <buffer> ! <Plug>(fern-action-hidden:toggle)
    nmap <buffer> - <Plug>(fern-action-mark:toggle)
    vmap <buffer> - <Plug>(fern-action-mark:toggle)
    nmap <buffer> C <Plug>(fern-action-clipboard-copy)
    nmap <buffer> X <Plug>(fern-action-clipboard-move)
    nmap <buffer> P <Plug>(fern-action-clipboard-paste)
    nmap <buffer> h <Plug>(fern-action-collapse)
    nmap <buffer> c <Plug>(fern-action-copy)
    nmap <buffer> <leader>h <Plug>(fern-action-leave)
    nmap <buffer> m <Plug>(fern-action-move)
    nmap <buffer> N <Plug>(fern-action-new-file)
    nmap <buffer> <cr> <Plug>(fern-action-open-or-enter)
    nmap <buffer> l <Plug>(fern-action-open-or-expand)
    nmap <buffer> s <Plug>(fern-action-open:select)
    nmap <buffer> t <Plug>(fern-action-open:tabedit)
    nmap <buffer> <C-l> <Plug>(fern-action-reload)
    nmap <buffer> r <Plug>(fern-action-rename)
    nmap <buffer> i <Plug>(fern-action-reveal)
    nmap <buffer> D <Plug>(fern-action-trash)
    nmap <buffer> y <Plug>(fern-action-yank)
    nmap <buffer> gr <Plug>(fern-action-grep)
    nmap <buffer> d <Plug>(fern-action-remove)
    nmap <buffer> B <Plug>(fern-action-save-as-bookmark)
    nmap <buffer> cd <Plug>(fern-action-tcd)
    nmap <buffer> <C-h> <C-w>h
    nmap <buffer> <C-l> <C-w>l
  endfunction
  augroup FernEvents
    autocmd!
    autocmd FileType fern call FernInit()
  augroup END

  let g:fern#disable_default_mappings = 1
```

Fernを拡張する

Fernは別途Fern用のプラグインをインストールすることで、アイコン表示やブックマークなどの機能を追加することが出来ます。

アイコンを表示する

ディレクトリやファイルの拡張子に応じたアイコンを表示するためのプラグインです。
入れるとこのように表示されて見やすくなります。

Nerdフォントというアイコンを含むフォントを使用する必要があります。
おすすめは白源です。

[[plugins]]
repo = 'lambdalisue/nerdfont.vim'

[[plugins]]
repo = 'lambdalisue/fern-renderer-nerdfont.vim'
hook_add = '''
  let g:fern#renderer = 'nerdfont'
'''

[[plugins]]
repo = 'lambdalisue/glyph-palette.vim'
hook_add = '''
  augroup my-glyph-palette
    autocmd! *
    autocmd FileType fern call glyph_palette#apply()
    autocmd FileType nerdtree,startify call glyph_palette#apply()
  augroup END
'''

 

Gitのステータスを表示する

lambdalisue/fern-git-status.vimを入れるだけでファイルごとにGitの状態を表示できます。

[[plugins]]
repo = 'lambdalisue/fern-git-status.vim'

 

ブックマーク機能を追加する

lambdalisue/fern-bookmark.vimを追加することでプロジェクトごとのディレクトリや任意のファイルをブックマークできるようになります。
ブックマークはディレクトリを作ってツリー構造で管理できるので、数が多くても整理できます。

その他

fern-vim-pluginに全ての拡張プラグインがリストされています。
SSH経由でリモート接続できるプラグインなど、人によってはハマるプラグインが多くあるので目を通してみましょう。

Neovimのすゝめカテゴリの最新記事