Vimで:cexprを使ってgrep結果をquickfixに流す

公開:2020/09/18
更新:2020/10/22
1 min読了の目安(約1100字TECH技術記事

始めに

みなさんはVimで一度くらいはgrepしたことがあるかと思います。
基本:grepで物足りますが、ちょっとシェルの画面になるのはあまり行けていない感じがします。

そこでcexprsystemcwを組み合わせることでシェル画面にならず、quickfixに結果を流し込めるので、
それをコマンド化してチョット使いやすくする方法を紹介します。

やり方

次をvimrcに貼り付ければGrepが使えます。

function! s:grep(word) abort
  cexpr system(printf('ag "%s"', a:word)) | cw
endfunction

command! -nargs=1 Grep call <SID>grep(<q-args>)

cexpr {expr}{expr}の結果をquickfixに流し込んでくれます。
cwはquickfixを開きます。

systemは外部コマンドを実行してくれるので、お好きなgrepコマンドを置き換えても問題ないです。
grepコマンドの出力結果によってはerrorformatの設定を返る必要はありますのでご注意ください。

追記 2020-10-16

cgetexprを使えば、grep結果の1つ目にジャンプしなくなります。
自動でジャンプしたくない方はcgetexprを使うと良きです。

余談

もともと、fzf.vimAgコマンドでgrepをしてましたが、
次のエラーが起きてgrepできなくなっていました。

Error running 'fzf'  '--ansi' '--prompt' 'Ag> ' '--multi' '--bind' 'alt-a:select-all,alt-d:deselect-all' '
--delimiter' ':' '--preview-window' '+{2}-5' '--color' 'hl:4,hl+:12' --expect=ctrl-v,ctrl-x,ctrl-t --heigh
t=22 > /tmp/vjUnOWu/3

ちょっと原因調べるの面倒ですので、ちょっと自作コマンドを用意することにしました。
今のところは快適ですが、systemはVimの操作をブロックしてしまうので、
困ったらjob_startを使って改善するかもしれません。