アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

NeoVim ファイル検索もgrepもサクサクdenite.nvimの設定と使い方

f:id:otoyo0122:20201030091626p:plain:w300

Vimでファイル名をあいまい検索したり、ファイルの中身をgrepしたいと思ったときに、まず候補に上がるのがdenite.nvimだと思います。

denite.nvimを使えばファイルを開いたりgrepするだけでなく(私はそこまで使いこなせていないですが)カスタマイズしてもっといろいろなことがVimでできるようになります。

ちなみに、denite.nvimとよく比較されるプラグインとしてfzf.vimがありますが、fzf.vimはgrepすると頻繁に固まってしまったので個人的には安定してサクサク動くdenite.nvimがおすすめです。

そういうわけで、このエントリではNeoVimにdenite.nvimを導入する際の極めて個人的なおすすめの使い方と設定を紹介します。

基本のキーマッピング

denite.nvimはREADMEの冒頭に書かれている通り、インストールしただけではデフォルトのキーマッピングを持ちません。

そこで作者がサンプルとして載せてくれているキーマッピングを自分なりにアレンジして使わせてもらいます。

autocmd FileType denite call s:denite_my_settings()
function! s:denite_my_settings() abort
  " エンターキー: 垂直分割でファイルを開く
  nnoremap <silent><buffer><expr> <CR>
  \ denite#do_map('do_action', 'vsplit')
  " スペースキー: 水平分割でファイルを開く
  nnoremap <silent><buffer><expr> <Space>
  \ denite#do_map('do_action', 'split')
  " エスケープキー: 終了
  nnoremap <silent><buffer><expr> <Esc>
  \ denite#do_map('quit')
  " Qキー: 終了
  nnoremap <silent><buffer><expr> q
  \ denite#do_map('quit')
  " Iキー: フィルター入力の開始
  nnoremap <silent><buffer><expr> i
  \ denite#do_map('open_filter_buffer')
  " Aキー: フィルター入力の開始
  nnoremap <silent><buffer><expr> a
  \ denite#do_map('open_filter_buffer')
endfunction

grepコマンドの変更

ファイル検索(file/rec)とgrepを高速なrgに変更します。rgはripgrepのコマンドでagよりも高速で.gitignoreファイルを考慮して検索してくれます。

こちらも作者が載せてくれているサンプルをそのまま使わせてもらいます。

" Change file/rec command 
call denite#custom#var('file/rec', 'command',
\ ['rg', '--files', '--glob', '!.git', '--color', 'never'])

" Ripgrep command on grep source
call denite#custom#var('grep', {
           \ 'command': ['rg'],
           \ 'default_opts': ['-i', '--vimgrep', '--no-heading'],
           \ 'recursive_opts': [],
           \ 'pattern_opt': ['--regexp'],
           \ 'separator': ['--'],
           \ 'final_opts': [],
           \ })

rgコマンドが必要なので適宜インストールしてください。Macでは下記のようにHomebrewで簡単にインストールできます。

$ brew install ripgrep

フィルター内でのdeoplete.nvimの補完をオフにする(オプション)

ファイル名を検索するフィルターでdeoplete.nvimによる補完が嫌な人は、下記の設定を追加してオフにします。

好みの問題なので、実際に使ってみて必要なら設定してみてください。

" ref. https://github.com/Shougo/denite.nvim/issues/657
autocmd FileType denite-filter call s:denite_filter_my_settings()
function! s:denite_filter_my_settings() abort
  call deoplete#custom#buffer_option('auto_complete', v:false)
endfunction

ファイル検索とgrepのキーマッピング

ファイル検索とgrepのキーマッピングを追加します。

ここは好みによって大きく変わってくる部分なので、私の設定を紹介しつつ、何をしているかだけ説明したいと思います。

まず下記が私の設定です。

call denite#custom#option('default', {
\ 'prompt': '% ',
\ 'split': 'floating',
\ 'wincol': float2nr((&columns - (&columns * s:floating_window_width_ratio)) / 2),
\ 'winheight': float2nr(&lines * s:floating_window_height_ratio),
\ 'winrow': float2nr((&lines - (&lines * s:floating_window_height_ratio)) / 2),
\ 'winwidth': float2nr(&columns * s:floating_window_width_ratio / 2),
\ })

nmap <silent> ;f  :<C-u>Denite -start-filter file/rec<CR>
nmap <silent> ;F  :<C-u>DeniteProjectDir -start-filter file/rec<CR>
nmap <silent> ;g  :<C-u>DeniteProjectDir grep:::<C-r><C-w><CR>
nmap <silent> ;G  :<C-u>DeniteProjectDir grep:::<C-r><C-a><CR>
nmap <silent> ;;g :<C-u>Denite grep<CR>
nmap <silent> ;;G :<C-u>DeniteProjectDir grep<CR>

;fでファイル検索file/recを開始できます。-start-filterオプションをつけると入力モードでフィルターを開始することができます。;Fを使うとプロジェクトディレクトリから検索できます。

;gでカーソル位置の単語で検索できます。区切り文字を含むようなネストされたモジュール名などをカーソル位置から検索するには;Gを使います。

自分でキーワードを入力してgrepしたい場合は;;g;;Gを使います。

denite#custom#optionの第1引数はバッファ名で、-buffer-name=some-nameのようにオプションで指定したバッファに対して個別にオプションを設定することもできます*1

さらに下記のエントリでは自動プレビューの設定を紹介しています。自動プレビューは必須級に便利ですので、ぜひ設定してみてください。

alpacat.hatenablog.com

以上です。

このエントリではNeoVimにdenite.nvimを導入する際の極めて個人的なおすすめの使い方と設定を紹介しました。

これを参考にぜひご自身の好みに合わせてカスタマイズしてみてください。良いVimライフを!

*1:作者のShougo様から直々にアドバイスいただきました。感謝!