🐜

非同期にGrep検索する (denops.vim)

4 min read

相変わらず denops.vim たのしい!

ってことで、また作ってみました。
ripgrepthe_platinum_searcherjvgrep で非同期に grep できるプラグイン。

https://github.com/yukimemi/dps-asyngrep

Denops Asynchronous Grep -> dps-asyngrep

asciicast

tsuyoshicho/vim-fg のパクr (じゃなくてインスパイア・・・めちゃめちゃ参考になりました、ありがとうございます!)

インストール

インストールは dein.vim だとこんな感じ。

  • dein.toml
[[plugins]]
repo = 'vim-denops/denops.vim'

[[plugins]]
repo = 'yukimemi/dps-asyngrep'
hook_add = '''
" let g:asyngrep_debug = v:true
" let g:asyngrep_cfg_path = "~/.asyngrep.toml"

nnoremap <space>ss <cmd>Agp<cr>
nnoremap <space>sr <cmd>Agp --tool=ripgrep<cr>
nnoremap <space>sp <cmd>Agp --tool=pt<cr>
nnoremap <space>sj <cmd>Agp --tool=jvgrep<cr>
'''

依存として、 denops.vim が必要。(もちろん Deno も。)

また、 grep に使用するツールとして、以下 3 つのどれかは必要。

設定は特に不要だが、上記コメントアウトしているように追加設定ができます。

  • g:asyngrep_debug

デバッグログ出力有無。デフォルト: v:false
調査で必要な時 v:true にすると、ログが echomsg される。

  • g:asyngrep_cfg_path

後述する grep tool の設定を自分で上書きしたい場合に設定ファイルパスを指定する。
デフォルト: ~/.asyngrep.toml

使い方

インストールすると、 Agp コマンドが使えるようになる。 (Asynchronous GreP)
以下の順番でインストールされているツールから、一番最初に見つかったものを使用して検索を行う。

  1. ripgrep
  2. jvgrep
  3. the_platinum_searcher

検索は非同期で実行され、見つかったものから逐次 quickfix に出力される。
(1 行ずつ setqflist を実行しているので、これは Alisue さん曰く、めちゃめちゃ遅いらしい・・・。 バッファリングについて検討中。)

ツールを個別に指定する場合は、以下のように --tool オプションで指定する。

:Agp --tool=jvgrep

設定

3 種類のツールは以下設定で定義されている。

[[tool]]
name = "ripgrep"
cmd = "rg"
arg = ["-i", "--vimgrep", "--no-heading"]

[[tool]]
name = "jvgrep"
cmd = "jvgrep"
arg = ["-i", "--no-color", "-I", "-R", "-8"]

[[tool]]
name = "pt"
cmd = "pt"
arg = ["-i", "--nogroup", "--nocolor"]

なんとなく見てもらえればわかるかなと・・・。

上記の引数を上書きたい場合や別のツールを追加したい場合は自分で設定ファイルを記載する。

  • ~/.asyngrep.toml
[[tool]]
name = "ripgrep"
cmd = "rg"
arg = ["-i", "--vimgrep", "--no-heading", "--hidden", "--no-ignore", "--regexp"]

[[tool]]
name = "jvgrep"
cmd = "jvgrep"
arg = ["-i", "--no-color", "-I", "-R", "-8"]

[[tool]]
name = "default"
cmd = "pt"
arg = ["-i", "--nogroup", "--nocolor", "--smart-case", "--skip-vcs-ignores", "--hidden"]

namedefault を指定すると、記載順序関係なく、そのツールがデフォルト (--tool オプションなし) で使用されるツールになる。
上記の場合は引数なしの Agpthe_platinum_searcher が使用されるようになる。

こんなツールも denops.vim を使えばサクッと作ることができてひじょーにべんり。

作るの自体は本当 1 日でサクッといけたんだけど、ちょっと Vim と Neovim で挙動が異なるところがあり、どうにも解決できずに vim-jp slack で質問したところ、 Alisue さんがサクッとプルリクくれて直りました。ほんとあざました!感謝。

まだ色々足りてない機能あるのでおいおい追加していきたい。


参考

Discussion

ログインするとコメントできます