DefxとDeniteを合わせて検索を快適に


この記事はZOZOテクノロジーズ #4 Advent Calendar 2020の17日目の記事です。
昨日は @akitokさんの HTMLの分散負荷試験という選択肢 でした。

はじめに

Defxを利用中、カーソル上のディレクトリに対して、Deniteで検索できれば捗りそうだなと思ったので実装してみました。
2つのダークパワーにより、さらなる闇力を上げていこうかと思います!

Defx

簡単に説明すると、ツリー型のようなファイラーです。

実装

Defxは、defx-action-callにより、独自関数をアクションとして呼び出すことができます。
これを利用して、Defxのカーソル上のディレクトリ内検索できるよう実装します。
※最後に最小構成のvimrc載せてます!

Defxから呼び出す関数

処理としては、

  1. Defxのカーソル上のディレクトリパスを取得(a:context.targets[0]で取得可能)
  2. それをもとに、Denite grepコマンドを実行

これだけでOKです!

function! DefxDeniteGrep(context) abort
  let dirpath = fnamemodify(a:context.targets[0], ':p:h')
  exec 'Denite grep -path=' . dirpath ' -start-filter'
endfunction

Defxキーバインドに追加

autocmd FileType defx call s:defx_custom_settings()
function! s:defx_custom_settings() abort
  nnoremap <silent><buffer><expr> <SPACE>fg
    \ defx#do_action('call', 'DefxDeniteGrep')
endfunction

実践

  1. :Defx
  2. 検索したいディレクトリにカーソル合わせる
  3. <SPACE>fgでDenite grep実行

ちなみに、インタラクティブでgrepしたい場合は、下記のように書き換えればOKですね!

function! DefxDeniteGrepInteractive(context) abort
  let dirpath = fnamemodify(a:context.targets[0], ':p:h')
  exec 'Denite grep:::! -path=' . dirpath ' -start-filter'
endfunction

最小構成のvimrc

サンプル実行

$ git clone https://gist.github.com/deresmos/32b54ebe418c935895505f41f4303358 sample
$ nvim -u sample/defx_sample.vim

まとめ

簡単にDefxの独自アクションを実装できるので、他にも色々とできそうですね!例えば、2つのディレクトリの差分をチェックしたい場合も、Defxで2つのディレクトリ選択してアクション実行させれば実現できそうですね!