search
LoginSignup
40

More than 1 year has passed since last update.

posted at

updated at

【Vim】defx.nvimで高速でリッチなファイラを実現する(アイコン、git status表示)

defx.nvim とは

スクリーンショット 2020-04-25 21.48.25.png

画像の左の部分がdefx.nvimです。

defxは、かの有名な暗黒美夢王Shougoさんの作成されたdark powerdなvimのファイラ(ファイルエクスプローラ)です。

vimのファイラと言うと、他にもNERDTreeや、同じくShougoさん作のVimFilerなどをお使いの方もいると思います。
体感ですが、defxは他のファイラに比べてかなり動作が早いです。また拡張性もあります。
開発の終了したVimFilerやもっさりしたNERDTreeを卒業し、暗黒の力を手にしましょう。

環境
macOS Catalina
iTerm2
NVIM v0.5.0-ef0398f

NeoVimをインストール

defx.nvimの動作にはNeoVimまたはVim8.1+ とPython3.6.1+が必要です。僕はNeoVimを強くお勧めします。この機会に移行しましょう。2020年だし。
brewでNeoVimをインストールしただけだとPython3はついてこないので、以下の方法でインストールします。

console
sudo pip3 install neovim
brew tap neovim/neovim
brew install --HEAD neovim

vimを開いて:echo has("python3")と打ち込み、1が返ってきたらOKです。また、deopleteを問題なく使えている方は大丈夫です。

defx.nvimをインストール

  • dein.vim
init.vim
call dein#add('Shougo/defx.nvim')
if !has('nvim')
  call dein#add('roxma/nvim-yarp')
  call dein#add('roxma/vim-hug-neovim-rpc')
endif
  • vim-plug
if has('nvim')
  Plug 'Shougo/defx.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/defx.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif

defxはVimFilerとは違い、deinte.nvimに依存しないので、defx単体のみのインストールで大丈夫です。

(dein.vimは非常に優れたプラグインマネージャです。まだ導入してない人はこの機会に導入を検討してはいかがでしょうか)

一般の設定

キーバインド

まず、defxにはデフォルトのキーバインドというものが存在しません。ファイルを開くアクションにも、ディレクトリを移動するアクションも全て自分で設定する必要があります。
とは言っても、公式のドキュメントにお勧めの設定的なやつがのってるので、ほとんどそれをコピペすれば済みます。

init.vim
autocmd FileType defx call s:defx_my_settings()

function! s:defx_my_settings() abort
  nnoremap <silent><buffer><expr> <CR>
   \ defx#do_action('drop')
  nnoremap <silent><buffer><expr> c
  \ defx#do_action('copy')
  nnoremap <silent><buffer><expr> m
  \ defx#do_action('move')
  nnoremap <silent><buffer><expr> p
  \ defx#do_action('paste')
  nnoremap <silent><buffer><expr> l
  \ defx#do_action('drop')
  nnoremap <silent><buffer><expr> t
  \ defx#do_action('open','tabnew')
  nnoremap <silent><buffer><expr> E
  \ defx#do_action('drop', 'vsplit')
  nnoremap <silent><buffer><expr> P
  \ defx#do_action('drop', 'pedit')
  nnoremap <silent><buffer><expr> o
  \ defx#do_action('open_or_close_tree')
  nnoremap <silent><buffer><expr> K
  \ defx#do_action('new_directory')
  nnoremap <silent><buffer><expr> N
  \ defx#do_action('new_file')
  nnoremap <silent><buffer><expr> M
  \ defx#do_action('new_multiple_files')
  nnoremap <silent><buffer><expr> C
  \ defx#do_action('toggle_columns',
  \                'mark:indent:icon:filename:type:size:time')
  nnoremap <silent><buffer><expr> S
  \ defx#do_action('toggle_sort', 'time')
  nnoremap <silent><buffer><expr> d
  \ defx#do_action('remove')
  nnoremap <silent><buffer><expr> r
  \ defx#do_action('rename')
  nnoremap <silent><buffer><expr> !
  \ defx#do_action('execute_command')
  nnoremap <silent><buffer><expr> x
  \ defx#do_action('execute_system')
  nnoremap <silent><buffer><expr> yy
  \ defx#do_action('yank_path')
  nnoremap <silent><buffer><expr> .
  \ defx#do_action('toggle_ignored_files')
  nnoremap <silent><buffer><expr> ;
  \ defx#do_action('repeat')
  nnoremap <silent><buffer><expr> h
  \ defx#do_action('cd', ['..'])
  nnoremap <silent><buffer><expr> ~
  \ defx#do_action('cd')
  nnoremap <silent><buffer><expr> q
  \ defx#do_action('quit')
  nnoremap <silent><buffer><expr> <Space>
  \ defx#do_action('toggle_select') . 'j'
  nnoremap <silent><buffer><expr> *
  \ defx#do_action('toggle_select_all')
  nnoremap <silent><buffer><expr> j
  \ line('.') == line('$') ? 'gg' : 'j'
  nnoremap <silent><buffer><expr> k
  \ line('.') == 1 ? 'G' : 'k'
  nnoremap <silent><buffer><expr> <C-l>
  \ defx#do_action('redraw')
  nnoremap <silent><buffer><expr> <C-g>
  \ defx#do_action('print')
  nnoremap <silent><buffer><expr> cd
  \ defx#do_action('change_vim_cwd')
endfunction

これには若干僕のオリジナルが入っています。

  • 僕は、常に作業画面の左側にファイルをツリー表示して置く使い方なので、ファイルを開くときのアクションがopenではなくdropになっています。
  • 公式ドキュメントには載っていませんが、defx#do_action('open','tabnew')で、選択したファイルを新しいタブで開くことができます。僕はこれをtにバインドしました。

各アクションの意味はここ

vim起動時に起動、<Leader>fで起動

VimFilerを使っていたときには、vim起動時に自動的にVimFilerを左側に開き、また<Leader>fでも開くようにしていたので、同じように設定したいと思います。
このようなキーバインドは各自でお好みで設定してください。

init.vim
autocmd VimEnter * execute 'Defx'
nnoremap <silent> <Leader>f :<C-u> Defx <CR>

起動時のレイアウトや設定

defx起動時の設定をしています。各自お好みで。

init.vim
call defx#custom#option('_', {
      \ 'winwidth': 40,
      \ 'split': 'vertical',
      \ 'direction': 'topleft',
      \ 'show_ignored_files': 1,
      \ 'buffer_name': 'exlorer',
      \ 'toggle': 1,
      \ 'resume': 1,
      \ })

option 説明
winwidth ファイルエクスプローラの幅。30~50がお勧め
split ウィンドウの出し方。'floating'などもある。neovimの強さを実感できるのでやってみてほしい
direction ファイルエクスプローラの位置。topleft or botright
show_ignored_files いわゆるdotfilesを表示するかどうか。1で表示。 
buffer_name バッファの名前
toggle 1にすれば、:Defxで、defxを開くだけでなく、閉じることもできるようになります。
resume 1にすれば、一度defxを閉じてからもう一度開いても、閉じる前の状態から始めることができます。

自動的に更新

defxのアクションでファイルを作成した時などは、もちろん即時にその変更が画面に反映されます。しかし、以下の設定を加えることで、vimの外でファイルを削除したりした時なども反映されるようになります。

init.vim
autocmd BufWritePost * call defx#redraw()
autocmd BufEnter * call defx#redraw()

autocmdを使って、バッファ保存時、またはバッファ移動時に再描画redraw()をフックしています。ほんとはn秒に一回更新とかがいいけど...できるの?教えて誰か

アイコン

ここまでで、うまくいってればこんな感じになってると思います。(色は個人の設定によると思うので気にしないで)
スクリーンショット 2020-04-26 0.59.25.png

十分かっこいいですが、さらに、IDEのようにファイル名の横にファイル種別ごとにアイコンを出すことができます。

フォントをインストール

Nerd Fontをbrewでインストールします。これはmacOS向けのインストールの方法です。他のOSの方はこちらを参照されたし。

console
 brew tap homebrew/cask-fonts
 brew install font-hack-nerd-font --cask

Terminal側の設定

今更ですが、ターミナルはiTerm2の使用をお勧めします。iTerm2ではASCII FontとNon-ASCII Fontを別々で設定できるからです。 
Non-ASCII Fontで、先ほどダウンロードしたフォントを選択しましょう。

スクリーンショット 2020-04-26 1.20.33.png

macデフォルトのターミナルをどうしても使いたい方は、Fontをダウンロードしたものに変更してください。

defx-iconsとvim-deviconsをインストール

defx-iconsvim-deviconsの2つのプラグインが必要です。

  • dein

call dein#add('ryanoasis/vim-devicons')
call dein#add('kristijanhusak/defx-icons')
  • dein (toml)

[[plugins]]
repo = 'ryanoasis/vim-devicons'

[[plugins]]
repo = 'kristijanhusak/defx-icons'
  • vim-plug

Plug 'kristijanhusak/defx-icons'
Plug 'ryanoasis/vim-devicons'

インストールを実行することを忘れないでください:raised_hand:

init.vimを調整

先ほどのcall defx#custom#option('_', {....のブロックに,
columnsのオプションを追加します。
このオプションを設定することで、defxのカラムに表示される情報を取捨選択したり、その順番を変更したりすことができます。今回は、左から、インデント(ディレクトリの階層を表現する)、ファイル種別ごとのアイコン、ファイル名、選択マークの順に表示することにします。

init.vim
call defx#custom#option('_', {
  \ 'winwidth': 40,
  \ 'split': 'vertical',
  \ 'direction': 'topleft',
  \ 'show_ignored_files': 1,
  \ 'buffer_name': 'exproler',
  \ 'toggle': 1,
  \ 'resume': 1,
  \ 'columns': 'indent:icons:filename:mark',
  \ })

これでアイコンの設定が完了しました!vimを再起動すると、このように表示されているでしょうか?アイコンがかわいくて良い感じですね:baby:

スクリーンショット 2020-04-29 1.43.50.png

gitのstatusを表示

gitで管理されているファイルのステータスをファイルツリーに表示するのは多くのIDEでは標準的な機能です。defxでもプラグインを用いれば可能です。

defx-gitをインストール

gitのステータスを表示するには、プラグインdefx-gitをインストールします。

  • dein

call dein#add('kristijanhusak/git')
  • dein (toml)

[[plugins]]
repo = 'kristijanhusak/defx-git'
  • vim-plug

Plug 'kristijanhusak/defx-git'

インストールを実行することを忘れないでください:raised_hand:

init.vimを調整

先ほどと同様に、call defx#custom#option('_', {....のブロックをいじります。columnsの、indenticonsの間にgitを追加します。

init.vim
call defx#custom#option('_', {
  \ 'winwidth': 40,
  \ 'split': 'vertical',
  \ 'direction': 'topleft',
  \ 'show_ignored_files': 1,
  \ 'buffer_name': 'exproler',
  \ 'toggle': 1,
  \ 'resume': 1,
  \ 'columns': 'indent:git:icons:filename:mark',
  \ })

次に、gitのステータスごとに表示されるアイコンを設定します。これもNERDフォントで指定できたらカッコいいですね。方法を知りたい。

init.vim
call defx#custom#column('git', 'indicators', {
  \ 'Modified'  : '✹',
  \ 'Staged'    : '✚',
  \ 'Untracked' : '✭',
  \ 'Renamed'   : '➜',
  \ 'Unmerged'  : '═',
  \ 'Ignored'   : '☒',
  \ 'Deleted'   : '✖',
  \ 'Unknown'   : '?'
  \ })

これで全ての設定が完了しました。vimを再起動し、gitで管理されているディレクトリに入って表示を確認してみます。このように表示されているでしょうか?

スクリーンショット 2020-04-29 2.04.49.png

gitのアイコンが新しく表示されているのがわかると思います。いい感じですね!!

  • カスタマイズ性がすごいので、公式リファレンスなどを読み込めばもっといろんなことができるようになると思います。
  • めっちゃはやい!けど、アイコンを表示するとちょっと遅くなる...気がする?
  • NERDフォント、普通にいいかんじなので、自分でいろんなところに使いたい。けど表示する方法がわかんない。教えて誰か...
  • Shougoさん、いつも最高のプラグインをありがとうございます。
  • 間違っている情報や古くなった情報などがあればご指摘お願いします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
40