この記事はZOZOテクノロジーズ #4 Advent Calendar 2020の17日目の記事です。
昨日は @akitokさんの HTMLの分散負荷試験という選択肢 でした。
はじめに
Defxを利用中、カーソル上のディレクトリに対して、Deniteで検索できれば捗りそうだなと思ったので実装してみました。
2つのダークパワーにより、さらなる闇力を上げていこうかと思います!
Defx
簡単に説明すると、ツリー型のようなファイラーです。
実装
Defxは、defx-action-callにより、独自関数をアクションとして呼び出すことができます。
これを利用して、Defxのカーソル上のディレクトリ内検索できるよう実装します。
※最後に最小構成のvimrc載せてます!
Defxから呼び出す関数
処理としては、
- Defxのカーソル上のディレクトリパスを取得(
a:context.targets[0]
で取得可能) - それをもとに、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
実践
:Defx
- 検索したいディレクトリにカーソル合わせる
-
<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つのディレクトリ選択してアクション実行させれば実現できそうですね!