ツリー型エクスプローラNERDTree

前回はファイルオープンのUI/UXをリッチにするプラグインとして「Denite」を取り上げた。ファイルを開く際の操作をGUIのファイルオープンに近い感覚で行えるようになるというものだ。今回は、それとはまた違ったファイルオープンのアプローチとして「NERDTree」を取り上げる。Visual Studio Codeなどでは、ウインドウの左ペインにツリー状のファイルツリーが表示されており、ここから編集するファイルを選択できるようになっている。NERDTreeは、これをVimで実現するものだ。最近の開発者は、こちらのUI/UXに慣れている方のほうが多いのではないだろうか。

NERDTreeの設定を追加

連載の内容に沿って~/.vimrcファイルを編集してきたのであれば、今は次のようになっているはずだ(なお、コピー&ペーストしてそのまま使えるように、ホームディレクトリパスは変更してある)。

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('Shougo/denite.nvim')
  call dein#add('roxma/nvim-yarp') " required by denite.vim
  call dein#add('roxma/vim-hug-neovim-rpc') " required by denite.vim

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" denite
"  <C-o> open Denite-file-buffer-list
"    <Esc>      close Denite-file-buffer-list
"    <Space>    select multiple files/buffers
"    <CR>       open files/buffers
"    o          open files/buffers
"    s          open files/buffers in split windows (horizonal)
"    v          open files/buffers in split windows (vertical)
"    i          filter by string
"    ..         move to directory above
nnoremap <silent> <C-o> :<C-u>Denite file buffer file:new<CR>
autocmd FileType denite call s:denite_my_settings()
function! s:denite_my_settings() abort
        nnoremap <silent><buffer><expr> <Esc>
                \ denite#do_map('quit')
        nnoremap <silent><buffer><expr> <Space>
                \ denite#do_map('toggle_select').'j'
        nnoremap <silent><buffer><expr> <CR>
                \ denite#do_map('do_action')
        nnoremap <silent><buffer><expr> o
                \ denite#do_map('do_action')
        nnoremap <silent><buffer><expr> s
                \ denite#do_map('do_action', 'split')
        nnoremap <silent><buffer><expr> v
                \ denite#do_map('do_action', 'vsplit')
        nnoremap <silent><buffer><expr> i
                \ denite#do_map('open_filter_buffer')
        nnoremap <silent><buffer><expr> ..
                \ denite#do_map('move_up_path')
endfunction

"End dein Scripts-------------------------

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase

DeniteとNERDTreeは、同時に使うことができる。しかし、ここではDeniteを無効化してNERDTreeを使う設定にしておく。Deniteも使いたい場合には、DeniteとNERDTreeのショートカットキーをそれぞれ別のものにしてもらえればよい。

最初はプラグイン定義は次のようになっているはずだ。

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('Shougo/denite.nvim')
  call dein#add('roxma/nvim-yarp') " required by denite.vim
  call dein#add('roxma/vim-hug-neovim-rpc') " required by denite.vim

この記述を、以下のようにNERDTreeを使う設定に変更する。

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')

次に、以下のDeniteの設定が書いてある部分を探してほしい。

" denite
"  <C-o> open Denite-file-buffer-list
"    <Esc>      close Denite-file-buffer-list
"    <Space>    select multiple files/buffers
"    <CR>       open files/buffers
"    o          open files/buffers
"    s          open files/buffers in split windows (horizonal)
"    v          open files/buffers in split windows (vertical)
"    i          filter by string
"    ..         move to directory above
nnoremap <silent> <C-o> :<C-u>Denite file buffer file:new<CR>
autocmd FileType denite call s:denite_my_settings()
function! s:denite_my_settings() abort
        nnoremap <silent><buffer><expr> <Esc>
                \ denite#do_map('quit')
        nnoremap <silent><buffer><expr> <Space>
                \ denite#do_map('toggle_select').'j'
        nnoremap <silent><buffer><expr> <CR>
                \ denite#do_map('do_action')
        nnoremap <silent><buffer><expr> o
                \ denite#do_map('do_action')
        nnoremap <silent><buffer><expr> s
                \ denite#do_map('do_action', 'split')
        nnoremap <silent><buffer><expr> v
                \ denite#do_map('do_action', 'vsplit')
        nnoremap <silent><buffer><expr> i
                \ denite#do_map('open_filter_buffer')
        nnoremap <silent><buffer><expr> ..
                \ denite#do_map('move_up_path')
endfunction

これを、以下のようにNERDTreeの設定に書き換える。

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

繰り返すが、Deniteも同時に使うならDeniteの定義や設定はそのままに、NERDTreeの定義や設定を追加すればよい。ただし、上記設定ではどちらも「Ctrl」+「O」が起動のショートカットキーに設定してあるので、同時に使う場合にはショートカットキーを別のキーに割り当てる必要がある。

NERDTree使用例

NERDTreeの使用例を次に示す。まず、Vimを起動した状態で「Ctrl」+「O」キーを押す。

「Ctrl」+「O」キーを押す

すると、次のように左型にツリー状のディレクトリ/ファイル一覧が表示されることを確認できる。

左側にNERDTreeのファイルツリービューが表示される

カーソルキーやhjklでコンソールを移動し、「Enter」キーを押すとそのファイルを編集する状態に入る。ディレクトリ上で「Enter」キーを押せばそのディレクトリ下がさらに一覧として表示されるようになる。

カーソルキーなどで対象を移動

ファイル上で「Enter」キーを押して別のファイルの編集状態になったものが次のスクリーンショットとなる。

別のファイルを編集する状態になったところ

NERDTreeはもう一度「Ctrl」+「O」を押すと閉じられる。NERDTreeを表示しっぱなしにする場合は、「Ctrl」+「W」でNERDTreeと編集しているファイルの間を行き来できるので、それでファイルの編集とほかのファイルの選択を行えばよい。

さらに別のファイルを編集してるところ

「Ctrl」+「O」でNERDTreeを閉じると、次のようになる。

「Ctrl」+「O」を押してNERDTreeを閉じた後

NERDTreeは、Vimの起動後、常に表示させておくこともできる。現在の開発者はこちらのUI/UXのほうがしっくりくるかもしれない。好みが出るところでもあるので、自分の好きなようにカスタマイズしてもらえればよいだろう。

今回の~/.vimrcファイル

それでは今回の~/.vimrcファイルを次に掲載しておく。

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

"End dein Scripts-------------------------

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase

ある程度Vimの操作に習熟してくると、プラグインを使わなくても大抵の作業は素早くできるようになる。ただし、その先のステップに進もうというのであれば、次にマスターすべきはプラグインだ。プラグインは、Vimのコマンドや操作だけではかなわない編集の効率化を可能にしてくれる。調査と最初の設定にかかる時間はコストとなるが、それでもやるだけの十分な価値がある。操作に慣れたら、次はぜひともプラグインの活用にチャレンジしていただきたい。