第211回で、Vimのプラグイン管理機能「Dein」について説明し、これを使ってインストールするプラグインの例として第230回でカラーテーマを扱う「seoul256」、第231回でパワーラインを表示する「vim-airline」を紹介した。どちらのプラグインも見た目に関するもので、直接的に操作に関わるものではなかった。そこで今回は、機能性を追加するプラグインとして「Denite」を紹介しよう。

Deniteは、Vimにファイルやバッファのオープン/切り替え機能、ディレクトリを変更する機能、文字列を使ったさまざまな検索機能などを追加するプラグインだ。類似するプラグインはいくつかあるが、Deniteは開発が活発に続けられており、高速に動作するという特徴がある。入れておいて損のないプラグインだろう。

本稿では、Deniteのファイル/バッファオープン機能だけを取り上げる。使ってみて興味を抱いた方は、ほかの機能についても使ってみていただきたい。

Deniteを使用するための設定を追加

連載の内容に沿って~/.vimrcファイルを編集してきたのであれば、今は次のようになっているはずだ。

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

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

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

  " Let dein manage dein
  " Required:
  call dein#add('/home/daichi/.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')

  " 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'

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

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

ここにDeniteの設定を追加する。まず、Deinで使用するプラグインの宣言を書いてある次の部分を探していただきたい。

  " 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')

上記を次のようにDeniteおよびDeniteが使用するほかのプラグインの宣言を追加したものへ変更する。

  " 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

次にDeniteそのものの設定を追加する。以下のように、前回設定した「vim-airline」の設定の下にDeniteの設定を追加する。

" 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

Deniteはデフォルトではショートカットキーが割り当てられていないので、ここではそれを割り当てている。上記の設定により、次のような内容になる。

ショートカットキー 内容
Ctrl-o ファイルやバッファを開くDeniteのウィンドウを開く

ここで設定しているDeniteウインドウでは、次のキーでファイルの選択やオープンを実施できる。

キー 内容
ESC Deniteウインドウを閉じる
Space ファイルやバッファを複数選択する
↩️ ファイルやバッファを開く
o ファイルやバッファを開く
s ファイルやバッファを分割ウインドウ(水平)で開く
v ファイルやバッファを分割ウインドウ(垂直)で開く
i 文字列によるフィルタリング
.. 1つ上のディレクトリへ移動する

操作できる機能はほかにもあるので、気になる場合にはほかの機能にもショートカットキーを設定してみていただきたい。これでDeniteを使うための基本的な設定は完了だ。

「pynvim」をインストール

DeniteはPython3で動作する仕組みになっている。VimとPython3の”架け橋”が必要となるが、この役割を「pynvim」が担っている。まず、Vimで次のように「:echo has(‘python3’)」を実行して、結果として「1」が出力されることを確認する。相当古い環境でない限り、ここでは「1」が返ってくるはずだ。もし「0」が返ってくるようであれば、そのVimはPython3の実行に対応していないので、環境を整えるところから始めることになる。

「:echo has(‘python3’)を実行する」

結果として「1」が出力されればOK

VimがPython3に対応していることを確認したら、次のコマンドを実行してユーザーのホームディレクトリ以下にpynvimと関連するパッケージをインストールする。

pip3 install --user pynvim

pynvimインストールの実施例

これで外部ツールのインストールも完了だ。

Denite使用サンプル

ここでは、「Ctrl」+「O」キーでDeniteのファイルやバッファを開く機能が呼び出されるように設定した。次のようにVimを起動した状態で「Ctrl」+「O」キーを押す。

「Ctrl」+「O」キーを押してDeniteのファイル/バッファ一覧ウインドウを起動する

次のようにファイルを選択するウインドウが開かれる。現在のDeniteはオプションを指定すると分割ウインドウの形式ではなく、ダイアログのような形式で表示させることもできる。この辺りは好みかと思うので、ダイアログ形式のほうが好きな場合は設定を変更すればよい。

ファイルやバッファの選択が可能

ファイルの上にカーソルを移動させて「↩️」キーを押せばそのファイルが開かれる。複数のファイルをまとめて開きたいなら、スペースキーで複数のファイルを選択してから、「o」「s」「v」などのキーを押してファイルを開けばよい。

スペースキーで複数のファイルを選択できる

次のスクリーンショットは「s」を押して選択したファイルを分割ウインドウで表示させたものだ。複数のファイルを目視で比較したながら作業する場合などに便利だ。ウインドウ間は「Ctrl」+「W」キー、「Ctrl」+「W」キーで移動することができる。

ファイルを複数の分割ウインドウで開いた場合のサンプル

「Ctrl」+「O」キーで表示するリストにはバッファも含めてある。一度開いたファイルはバッファに入っているので、そこから選択すると簡単だ。選択一覧ではディレクトリを選択すればそのディレクトリへ移動するし、「..」と入力すればひとつ上のディレクトリへ移動する。

Vimにデフォルトで用意されているファイルオープンのUI/UXは実にシンプルなものだ。Deniteのようなプラグインを使うと、この操作をある程度ビジュアル化できる。ある程度ビジュアル化された操作のほうが扱いやすいと感じる方が多いのではないかと思う。

Deniteを使用するように変更された~/.vimrcファイル

今回の内容を反映させた~/.vimrcファイルを次に掲載しておく。お気づきのように、~/.vimrcファイルはどんどん大きくなっていく。特にプラグインを利用するようになると、そのプラグイン分だけ設定が増えていくと考えておいて間違いない。

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

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

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

  " Let dein manage dein
  " Required:
  call dein#add('/home/daichi/.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

Vimでプラグインを利用できるようになると、編集効率が大きく向上する。一度はまってしまうとなかなか抜け出せない”沼”的な部分があるが、作業効率も向上するので悪くはないだろう。Vimの真価を引き出す上で、プラグインの活用は欠かせない。ぜひ自分の用途にあったプラグインを探して利用していただきたい。